poi-tl 自定义图片处理类,解决生成多个文件时图片重复出现在word文档中问题

来源:互联网 发布:mn域名后缀含义 编辑:程序博客网 时间:2024/06/01 13:39


一、将poi-tl的图片实现类复制到本地

二、写清除图片的方法

XWPFParagraph par = (XWPFParagraph) run.getParent();

for (XWPFRunr :par.getRuns()) {

r.setText("照片", 0);

CTDrawing[] arr = r.getCTR().getDrawingArray();

for (intk = 0;k <arr.length;k++) {

r.getCTR().removeDrawing(k);

}

}


总代码如下:

package net.ulsc.app.gzkg.util;import java.io.FileInputStream;import java.io.FileNotFoundException;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.poi.xwpf.usermodel.XWPFRun;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.deepoove.poi.XWPFTemplate;import com.deepoove.poi.data.PictureRenderData;import com.deepoove.poi.policy.PictureRenderPolicy;import com.deepoove.poi.policy.RenderPolicy;import com.deepoove.poi.template.ElementTemplate;import com.deepoove.poi.template.run.RunTemplate;public class MyPictureRenderPolicy implements RenderPolicy {protected final Logger logger = LoggerFactory.getLogger(PictureRenderPolicy.class);@Overridepublic void render(ElementTemplate eleTemplate, Object renderData, XWPFTemplate doc) {RunTemplate runTemplate = (RunTemplate) eleTemplate;XWPFRun run = runTemplate.getRun();if (renderData == null) {// 当数据为空时,视为初始化图片XWPFParagraph par = (XWPFParagraph) run.getParent();for (XWPFRun r : par.getRuns()) {r.setText("照片", 0);CTDrawing[] arr = r.getCTR().getDrawingArray();for (int k = 0; k < arr.length; k++) {r.getCTR().removeDrawing(k);}}return;}PictureRenderData pictureRenderData = null;if (renderData instanceof PictureRenderData) {pictureRenderData = (PictureRenderData) renderData;} else {logger.warn("Error render data,should be pictureRenderData:" + renderData.getClass());return;}String blipId;try {byte[] data = pictureRenderData.getData();if (null == data) {FileInputStream is = new FileInputStream(pictureRenderData.getPath());blipId = doc.getXWPFDocument().addPictureData(is, suggestFileType(pictureRenderData.getPath()));} else {blipId = doc.getXWPFDocument().addPictureData(data, suggestFileType(pictureRenderData.getPath()));}doc.getXWPFDocument().addPicture(blipId,doc.getXWPFDocument().getNextPicNameNumber(suggestFileType(pictureRenderData.getPath())),pictureRenderData.getWidth(), pictureRenderData.getHeight(), run);run.setText("", 0);} catch (InvalidFormatException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();}}private int suggestFileType(String imgFile) {int format = 0;if (imgFile.endsWith(".emf"))format = XWPFDocument.PICTURE_TYPE_EMF;else if (imgFile.endsWith(".wmf"))format = XWPFDocument.PICTURE_TYPE_WMF;else if (imgFile.endsWith(".pict"))format = XWPFDocument.PICTURE_TYPE_PICT;else if (imgFile.endsWith(".jpeg") || imgFile.endsWith(".jpg"))format = XWPFDocument.PICTURE_TYPE_JPEG;else if (imgFile.endsWith(".png"))format = XWPFDocument.PICTURE_TYPE_PNG;else if (imgFile.endsWith(".dib"))format = XWPFDocument.PICTURE_TYPE_DIB;else if (imgFile.endsWith(".gif"))format = XWPFDocument.PICTURE_TYPE_GIF;else if (imgFile.endsWith(".tiff"))format = XWPFDocument.PICTURE_TYPE_TIFF;else if (imgFile.endsWith(".eps"))format = XWPFDocument.PICTURE_TYPE_EPS;else if (imgFile.endsWith(".bmp"))format = XWPFDocument.PICTURE_TYPE_BMP;else if (imgFile.endsWith(".wpg"))format = XWPFDocument.PICTURE_TYPE_WPG;else {logger.error("Unsupported picture: " + imgFile + ". Expected emf|wmf|pict|jpeg|png|dib|gif|tiff|eps|bmp|wpg");}return format;}}

修正一下 :以上删除图片方式问题:说明一下 以上删除的方式只是删除了正文中引用图片显示的地方,还需要删除掉文件中的图片流,代码如下 :

XWPFDocument document = doc.getXWPFDocument().getXWPFDocument(); List<XWPFPictureData> pictures = document.getAllPictures(); PackagePartName partName=null; for(XWPFPictureData pp:pictures) { partName=pp.getPackagePart().getPartName(); if(null!=partName) { PackagePart part = document.getPackage().getPart(partName); if(null!=part) { //删除图片流  删除关系 part.setDeleted(true); String id = document.getRelationId(pp); document.getPackagePart().removeRelationship(id);document.getPackage().removePart(partName); } } }

阅读全文
0 0
原创粉丝点击