如何使用Java库移除PDF中的“TEST”文本并保存修改后的文件
Java实现PDF移除指定TEST文本方案
依赖引入
使用Apache PDFBox,这是Java生态中最成熟的PDF处理开源库,Maven依赖如下:
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.32</version> </dependency>
实现逻辑
- 逐页遍历PDF的所有文本元素,提取每个文本的内容、坐标、尺寸信息
- 匹配内容为
TEST的目标文本,记录对应坐标区域 - 使用白色矩形覆盖目标区域,实现文本擦除效果(相比直接修改内容流,该方式兼容性更高,不会破坏PDF原有排版)
可运行代码示例
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.text.PDFTextStripper; import org.apache.pdfbox.text.TextPosition; import java.awt.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class RemoveTestText { // 存储匹配到的TEST文本的坐标信息 static class TextRegion { float x; float y; float width; float height; public TextRegion(float x, float y, float width, float height) { this.x = x; this.y = y; this.width = width; this.height = height; } } public static void main(String[] args) throws IOException { // 输入输出文件路径替换为实际路径 String inputPath = "输入文件路径.pdf"; String outputPath = "输出文件路径.pdf"; PDDocument document = PDDocument.load(new File(inputPath)); for (int pageNum = 0; pageNum < document.getNumberOfPages(); pageNum++) { PDPage page = document.getPage(pageNum); List<TextRegion> toRemoveRegions = new ArrayList<>(); // 提取当前页所有TEST文本的坐标 PDFTextStripper stripper = new PDFTextStripper() { @Override protected void processTextPosition(TextPosition text) { String content = text.getUnicode().trim(); // 匹配内容为TEST的文本,可根据需求增加坐标、字体大小等校验规则,避免误删 if ("TEST".equals(content)) { float x = text.getX(); float y = text.getY() - text.getHeight(); // 转换为矩形左下角坐标 float width = text.getWidth(); float height = text.getHeight(); toRemoveRegions.add(new TextRegion(x, y, width, height)); } super.processTextPosition(text); } }; stripper.setStartPage(pageNum + 1); stripper.setEndPage(pageNum + 1); stripper.getText(document); // 用白色矩形覆盖所有匹配到的TEST区域 if (!toRemoveRegions.isEmpty()) { PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true); contentStream.setNonStrokingColor(Color.WHITE); for (TextRegion region : toRemoveRegions) { contentStream.addRect(region.x, region.y, region.width, region.height); contentStream.fill(); } contentStream.close(); } } document.save(outputPath); document.close(); } }
注意事项
- 若
TEST是嵌入在PDF图片内的文本,本方案无法直接处理,需先通过OCR识别到目标坐标后再执行覆盖操作 - 处理加密PDF时,需在
PDDocument.load方法中传入正确的文档密码完成解密 - 可根据实际场景增加匹配规则,比如限定目标文本的坐标范围、字体大小、颜色等,避免误删其他合法含
TEST的内容
内容的提问来源于stack exchange,提问作者kishore
相关产品推荐
相关产品推荐

