poi-tl 自定义图片处理类,解决生成多个文件时图片重复出现在word文档中问题
来源:互联网 发布:mn域名后缀含义 编辑:程序博客网 时间:2024/06/01 13:39
二、写清除图片的方法
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
- poi-tl 自定义图片处理类,解决生成多个文件时图片重复出现在word文档中问题
- java通过poi-tl使用word模版生成word文件
- 在asp.net生成的word文档中插入图片
- word文档中图片不显示的问题以及解决
- poi生成word文档,插入图片,echar报表生成到word,word表格
- 使用POI生成Excel文件及使用POI在EXCEL文件中插入图片的方法
- 使用POI生成Excel文件及使用POI在EXCEL文件中插入图片的方法
- 解决java中html转word文档,转成功后的word文档在断网情况下无法显示图片问题
- 利用POI抽取word中的图片并保存在文件中
- 利用POI抽取word中的图片并保存在文件中
- POI在word同一行中插入两个图片
- POI生成word时插入图片的bug与修复
- word文档图片处理技巧
- 使用POI向word中添加图片的问题
- freemarker+poi 模板生成 word添加图片
- 在多个Word文档中查找指定文件内容
- POI--生成word文档
- POI生成WORD文档
- 可移动带分割线的GridView(空白项有分割线)
- hadoop中datanode不被namenode识别的问题
- 两个字符串拼接(不用strcat函数)
- android笔记之SystemServiceRegistry
- 内存溢出解决办法
- poi-tl 自定义图片处理类,解决生成多个文件时图片重复出现在word文档中问题
- 利用VisualEsxtop工具图形化查看esxtop参数
- 机器学习进阶路上不可错过的 28 个视频
- 行驶证OCR识别360度全面解析
- JVM深入学习总结
- tensorflow_rnn_cell_code
- EC Final 2015(Suffixes and Palindromes-差分约束)
- Hibernate入门学习(5)----Session和Transaction
- 1007. 素数对猜想 (20)