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

 

一、将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);

}

}

 

总代码如下:

 

 



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);

	@Override
	public 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeMarker、Poi-tlPOI 都是用于生成 Word 文档的工具,它们之间的主要区别在于生成方式、操作方法、使用场景、性能以及功能方面的不同。 1. 生成方式 FreeMarker 和 Poi-tl 都是基于模板的生成方式,需要先创建一个 Word 文档模板,然后将数据填充到模板,最终生成一个完整的 Word 文档。而 POI 则是直接对 Word 文档进行操作,可以读取、写入、修改、创建 Word 文档。 2. 操作方法 FreeMarker 和 Poi-tl 都是使用 API 对文档进行操作,例如修改样式、替换变量、插入图片等等;而 POI 则是使用 POI API 操作 Word 文档。 3. 使用场景 由于 FreeMarker 和 Poi-tl 是基于模板的生成方式,因此适用于需要批量生成相似结构的 Word 文档的场景,例如生成合同、报告、简历等;而 POI 则适用于需要对 Word 文档进行灵活操作的场景,例如读取、修改、创建、删除等。 4. 性能 由于 FreeMarker 和 Poi-tl 都是基于模板的生成方式,因此生成 Word 文档的性能相对较高,特别是在批量生成 Word 文档更为明显;而 POI 则需要直接对文档进行操作,因此在生成 Word 文档性能相对较低。 5. 功能 Poi-tlPOI 都提供了丰富的 API,可以对 Word 文档进行各种操作,例如读取、写入、修改、创建、删除、格式化等等,而 FreeMarker 则主要是通过填充模板来生成 Word 文档,并提供了一些基本的操作 API,例如对模板的变量进行替换、对模板的样式进行修改、插入图片等等。 综上所述,FreeMarker、Poi-tlPOI生成 Word 文档的方式、操作方法、使用场景、性能以及功能方面都有所不同,选择哪个工具需要根据具体的场景和需求进行判断。如果需要批量生成相似结构的 Word 文档,可以选择 FreeMarker 或 Poi-tl;如果需要对 Word 文档进行灵活操作,可以选择 POI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值