1

我想知道,是否有任何方法可以通过Apache POI替换 ppt 演示文稿中的图像?

我有一个模板,其中放置了元素(文本字段和图像),我发现了如何替换文本,但没有找到任何图像。

4

1 回答 1

2

替换图像可以通过两种方式完成:

只需在路径 (/ppt/media) 下替换 pptx-file 中的图像,这是一个 zip 文件。看看这篇文章怎么做..

或者 POI 方法是删除文件并添加一个新文件......并且可能会更改一些其他图像属性(宽度,高度,......) - 请参阅下面的示例

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.xml.namespace.QName;

import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSheet;
import org.apache.xmlbeans.XmlCursor;

public class ReplaceImageInPptx {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("test2.pptx");
        XMLSlideShow pptx = new XMLSlideShow(fis);
        fis.close();

        String blipNS[] = {
            "http://schemas.openxmlformats.org/drawingml/2006/main",
            "http://schemas.openxmlformats.org/presentationml/2006/main"
        };

        for (XSLFSheet slide : pptx.getSlides()) {
            PackagePart packPart = slide.getPackagePart();

            for (String ns : blipNS) {
                XmlCursor picCur = slide.getXmlObject().newCursor();
                picCur.selectPath("declare namespace p='"+ns+"' .//p:blip"); // or blipFill

                while (picCur.toNextSelection()) {

                    // ... doesn't work for all namespaces ...
                    // CTBlipFillProperties blipFill = (CTBlipFillProperties)picCur.getObject();
                    // CTBlip blip = blipFill.getBlip();
                    // String relId = blip.getEmbed();
                    QName relName = new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "embed");
                    String relId = picCur.getAttributeText(relName);

                    // remove old media file and reference
                    PackageRelationship packRel = packPart.getRelationship(relId);
                    PackagePartName oldPartName = PackagingURIHelper.createPartName(packRel.getTargetURI());
                    packPart.getPackage().removePart(oldPartName);

                    // add something new
                    PackagePartName partName = PackagingURIHelper.createPartName("/ppt/media/smiley.jpg");
                    PackagePart part = pptx.getPackage().createPart(partName, "image/jpeg");
                    OutputStream partOs = part.getOutputStream();
                    FileInputStream fis2 = new FileInputStream("src/test/resources/smiley.jpg");
                    byte buf[] = new byte[1024];
                    for (int readBytes; (readBytes = fis2.read(buf)) != -1; partOs.write(buf, 0, readBytes));
                    fis2.close();
                    partOs.close();

                    PackageRelationship prs = slide.getPackagePart().addRelationship(partName, TargetMode.INTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image");
                    // blip.setEmbed(prs.getId());
                    picCur.setAttributeText(relName, prs.getId());

                    // maybe change the size a bit
                    // blipFill.getStretch().getFillRect().setL(<left padding in % (+/-)>)
                }

                picCur.dispose();
            }
        }

        FileOutputStream fos = new FileOutputStream("test3.pptx");
        pptx.write(fos);
        fos.close();
    }
}
于 2013-04-26T00:08:44.903 回答