Java 如何用ApachePOI替换PPT演示文稿中的图像
我想知道,是否有任何方法可以通过Java 如何用ApachePOI替换PPT演示文稿中的图像,java,image-processing,powerpoint,apache-poi,Java,Image Processing,Powerpoint,Apache Poi,我想知道,是否有任何方法可以通过 我有一个模板,我在其中放置了元素(文本字段和图像),我找到了如何替换文本,但没有找到任何用于图像的内容。替换图像可以通过两种方式完成: 只需在路径(/ppt/media)下替换pptx文件(zip文件)中的图像即可。签出这个如何做 或者POI方法是删除该文件并添加一个新文件。。。并且可能会更改一些其他图像属性(宽度、高度等)-请参见下面的示例 import java.io.FileInputStream; import java.io.FileOutputStr
我有一个模板,我在其中放置了元素(文本字段和图像),我找到了如何替换文本,但没有找到任何用于图像的内容。替换图像可以通过两种方式完成: 只需在路径(/ppt/media)下替换pptx文件(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();
}
}
import java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.OutputStream;
导入javax.xml.namespace.QName;
导入org.apache.poi.openxml4j.opc.PackagePart;
导入org.apache.poi.openxml4j.opc.PackagePartName;
导入org.apache.poi.openxml4j.opc.PackageRelationship;
导入org.apache.poi.openxml4j.opc.PackagingURIHelper;
导入org.apache.poi.openxml4j.opc.TargetMode;
导入org.apache.poi.xslf.usermodel.xmlsideshow;
导入org.apache.poi.xslf.usermodel.XSLFSheet;
导入org.apache.xmlbeans.XmlCursor;
公共类replaceImageInputX{
公共静态void main(字符串[]args)引发异常{
FileInputStream fis=新的FileInputStream(“test2.pptx”);
XMLSlideShow pptx=新的XMLSlideShow(fis);
fis.close();
字符串blipNS[]={
"http://schemas.openxmlformats.org/drawingml/2006/main",
"http://schemas.openxmlformats.org/presentationml/2006/main"
};
对于(XSLFSheet幻灯片:pptx.getSlides()){
PackagePart packPart=slide.getPackagePart();
用于(字符串ns:blipNS){
XmlCursor picCur=slide.getXmlObject().newCursor();
picCur.selectPath(“声明命名空间p=”“+ns+”。//p:blip”);//或blipFill
while(picCur.toNextSelection()){
//…不适用于所有名称空间。。。
//CTBlipFillProperties blipFill=(CTBlipFillProperties)picCur.getObject();
//CTBlip blip=blipFill.getBlip();
//String relId=blip.getEmbed();
QName relName=新的QName(“http://schemas.openxmlformats.org/officeDocument/2006/relationships“,”嵌入“);
字符串relId=picCur.getAttributeText(relName);
//删除旧媒体文件和引用
PackageRelationship packRel=packPart.getRelationship(relId);
PackagePartName oldPartName=PackageGuriHelper.createPartName(packRel.getTargetURI());
packPart.getPackage().removePart(oldPartName);
//添加新内容
PackagePartName partName=PackagingURIHelper.createPartName(“/ppt/media/smiley.jpg”);
PackagePart=pptx.getPackage().createPart(部件名,“图像/jpeg”);
OutputStream partOs=part.getOutputStream();
FileInputStream fis2=新的FileInputStream(“src/test/resources/smiley.jpg”);
字节buf[]=新字节[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());
//也许改变一下尺寸
//blipFill.getStretch().getFillRect().setL()
}
picCur.dispose();
}
}
FileOutputStream fos=新的FileOutputStream(“test3.pptx”);
pptx.write(fos);
fos.close();
}
}
Java标记是什么?在你的问题中,你已经标记了Java
。为什么?这是与MS OFFICE相关的问题,看起来您从未使用过apache poi。所以,尽管说吧,不要浪费你的时间。这种攻击性的评论在这里是不合适的,要礼貌和谦虚,我不是攻击性的,我只是给了你一个建议,就像你对我做的那样:)我没有说“不要浪费我的时间”。我感谢大家的帮助,不要让他们浪费时间。所以这只是你对内容的误解。祝你好运:)