解决POI3.10 添加图片不成功的问题

来源:互联网 发布:淘宝如何删除好评 编辑:程序博客网 时间:2024/06/01 21:27

问题:

当我用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中查看到图片。


0 0
原创粉丝点击