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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:14   2879   0

问题:

当我用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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP