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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值