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

问题:

当我用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 = "" +
"" +
"   " +
"      " +
" " +
"    " +
"    " +
" " +
" " +
"    " +
"    " +
"       " +
"    " +
" " +
" " +
"    " +
"       " +
"       " +
"    " +
"    " +
"       " +
"    " +
" " +
"      " +
"   " +
"";


//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,所以不会产生影响

解决POI3.10 添加图片不成功的问题_第1张图片


三、修改图片生成部分的接口:使用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中查看到图片。


你可能感兴趣的:(poi)