问题:
当我用poi3.10去生成word文件时,文字可以正常生成,而图片却加载不出来,并且用offic2007版本的无法打开word文件
问题:
POI3.10在添加图片的时候自身有一个BUG,自带的addpicture()方法无法使图片正常生成在word上显示
解决方式:
解决方式有几种,这里只介绍一种方式。
一、创建一个类,不用做任何修改,只需导入各种需要的包即可,
新建类:CustomXWPFDocument继承XWPFDocument
添加方法:createPic
package org.uz.dxt.common; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlToken; import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline; public class CustomXWPFDocument extends XWPFDocument { public void createPic(String blipId,int id, int width, int height,CTInline inline) { final int EMU = 9525; width *= EMU; height *= EMU; //String blipId = getAllPictures().get(id).getPackageRelationship().getId(); //CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline(); String picXml = "" + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" + " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + " <pic:nvPicPr>" + " <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" + " <pic:cNvPicPr/>" + " </pic:nvPicPr>" + " <pic:blipFill>" + " <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" + " <a:stretch>" + " <a:fillRect/>" + " </a:stretch>" + " </pic:blipFill>" + " <pic:spPr>" + " <a:xfrm>" + " <a:off x=\"0\" y=\"0\"/>" + " <a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" + " </a:xfrm>" + " <a:prstGeom prst=\"rect\">" + " <a:avLst/>" + " </a:prstGeom>" + " </pic:spPr>" + " </pic:pic>" + " </a:graphicData>" + "</a:graphic>"; //CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData(); XmlToken xmlToken = null; try { xmlToken = XmlToken.Factory.parse(picXml); } catch(XmlException xe) { xe.printStackTrace(); } inline.set(xmlToken); //graphicData.set(xmlToken); inline.setDistT(0); inline.setDistB(0); inline.setDistL(0); inline.setDistR(0); CTPositiveSize2D extent = inline.addNewExtent(); extent.setCx(width); extent.setCy(height); CTNonVisualDrawingProps docPr = inline.addNewDocPr(); docPr.setId(id); docPr.setName("Picture " + id); docPr.setDescr("Generated"); } }
二、修改你自定义的下载类的对象,改为上面新建的类,由于继承了XWPFDocument,所以不会产生影响
三、修改图片生成部分的接口:使用doc.addPictureData()方法
旧代码:
XWPFParagraph p9 = doc.createParagraph();
p9.setAlignment(ParagraphAlignment.CENTER);
p9.setVerticalAlignment(TextAlignment.CENTER);
// 图片
XWPFRun r8 = p9.createRun();
for (Attachment attachment : fileList) {
// 文件类型
String type = attachment.getType();
int fileSize=Integer.parseInt(attachment.getFileSize());
if ("01".equals(type)&&fileSize>0) {
String fileName = attachment.getFileName()
//获取图片流
InputStream in = getImage(HOST_URL+attachment.getFileUrl()+"?userId="+userId);//获取图片流
r8.addPicture(in, XWPFDocument.PICTURE_TYPE_JPEG,//此方法poi有缺陷
fileName, Units.toEMU(300), Units.toEMU(400));
r8.addBreak();
fileName = StringUtils.substringBefore(fileName, ".");
r8.setText(fileName);
r8.addBreak();
in.close();
}
修改之后的代码:
for (Attachment attachment : fileList) { // 文件类型 String type = attachment.getType(); if ("02".equals(type)) { String fileName = attachment.getFileName(); //获取图片流 InputStream in = getImage(ConfigParams.NEW_DOWNLOAD_URL+attachment.getFileUrl()); CTInline ctinline=r8.getCTR().addNewDrawing().addNewInline();//设置段落行 String id = doc.addPictureData(in, XWPFDocument.PICTURE_TYPE_JPEG);//添加图片数据 int id2=doc.getAllPackagePictures().size()+1; doc.createPic(id,id2, 259, 259,ctinline);//添加图片 fileName = StringUtils.substringBefore(fileName, "."); r8.setText(fileName); r8.addBreak(BreakType.PAGE); in.close(); }
做上述修改
运行可以在word中查看到图片。