使用IText替换/隐藏文字

一、背景

跟第三方对接获取pdf文件,但里面有显示购买的价格,而为了为商利润,需要隐藏该价格。
刚开始是想直接对某坐标隐藏,但发现各个pdf的内容有所不同,导致价格所在的坐标也不同。

二、参考文案

《使用itext直接替换PDF中的文本》
@ 里面内容不错,方法与教学都还行,也有不足,如评论里写的一样,文本替换仅支持一页。

三、我的代码:

1、替换行的模型(x轴、y轴、宽度、高度等):
package com.xxxx.utils.itext;

public class TextLineMode {
	public static final float defaultHeight = 14;
	public static final float fixHeight = 4;

	private int curPage = 1;
	private float height = 0;
	private float width = 0;
	private float x = 0;
	private float y = 0;

	public int getCurPage() {
		return curPage;
	}

	public void setCurPage(int curPage) {
		this.curPage = curPage;
	}

	public float getHeight() {
		return height;
	}

	public void setHeight(float height) {
		this.height = height;
	}

	public float getWidth() {
		return width;
	}

	public void setWidth(float width) {
		this.width = width;
	}

	public float getX() {
		return x;
	}

	public void setX(float x) {
		this.x = x;
	}

	public float getY() {
		return y;
	}

	public void setY(float y) {
		this.y = y;
	}

}

2、工具类

1.使用itext查询关键字,得到其坐标
2.在该坐标上涂上背景颜色。

package com.xxxx.utils.itext;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;

public class ITextPdfUtil {

	public boolean manipulatePdf(String src, String dest, List<String> keywords) throws Exception {
		PdfReader pdfReader = null;
		PdfStamper stamper = null;
		try {
			pdfReader = new PdfReader(src);
			stamper = new PdfStamper(pdfReader, new FileOutputStream(dest));
			List<TextLineMode> list = renderText(pdfReader, keywords);
			if (list != null) {
				for (int i = 0; i < list.size(); i++) {
					TextLineMode mode = list.get(i);

					PdfContentByte canvas = stamper.getOverContent(mode.getCurPage());
					canvas.saveState();
					canvas.setColorFill(BaseColor.WHITE);
					// canvas.setColorFill(BaseColor.BLUE);
					// 以左下点为原点,x轴的值,y轴的值,总宽度,总高度:
					// canvas.rectangle(mode.getX() - 1, mode.getY(),
					// mode.getWidth() + 2, mode.getHeight());
					canvas.rectangle(0, mode.getY(), 10000, mode.getHeight());

					canvas.fill();
					canvas.restoreState();
				}
			}
			return true;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (stamper != null)
				stamper.close();
			if (pdfReader != null)
				pdfReader.close();
		}
		return false;
	}

	public List<TextLineMode> renderText(PdfReader pdfReader, final List<String> keywords) {
		final List<TextLineMode> list = new ArrayList<TextLineMode>();
		try {
			PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
			int pageNum = pdfReader.getNumberOfPages();
			for (int i = 1; i <= pageNum; i++) {
				final int curPage = i;

				pdfReaderContentParser.processContent(curPage, new RenderListener() {
					public void renderText(TextRenderInfo textRenderInfo) {
						String text = textRenderInfo.getText();
						if (text != null) {
							for (int j = 0; j < keywords.size(); j++) {
								String keyword = keywords.get(j);
								if (text.contains(keyword)) {
									com.itextpdf.awt.geom.Rectangle2D.Float bound = textRenderInfo.getBaseline()
											.getBoundingRectange();
									TextLineMode lineMode = new TextLineMode();
									lineMode.setHeight(bound.height == 0 ? TextLineMode.defaultHeight : bound.height);
									lineMode.setWidth(bound.width);
									lineMode.setX(bound.x);
									lineMode.setY(bound.y - TextLineMode.fixHeight);
									lineMode.setCurPage(curPage);
									list.add(lineMode);
								}
							}
						}
					}

					public void renderImage(ImageRenderInfo arg0) {
					}

					public void endTextBlock() {

					}

					public void beginTextBlock() {
					}
				});
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	public static void main(String[] args) throws Exception {
		List<String> keywords = new ArrayList<String>();
		keywords.add("价格");
		keywords.add("金额");
		new ITextPdfUtil().manipulatePdf("E:/del/1.pdf", "E:/del/1--1.pdf", keywords);
	}
}

四、需要的jar包

	<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
	<dependency>
		<groupId>com.itextpdf</groupId>
		<artifactId>itextpdf</artifactId>
		<version>5.5.6</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
	<dependency>
		<groupId>com.itextpdf</groupId>
		<artifactId>itext-asian</artifactId>
		<version>5.2.0</version>
	</dependency>
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值