一、背景
跟第三方对接获取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>