1.思路:
  • 使用pdfbox加载出页面所有的token
  • COSString类型存储的是文字信息
  • 由于获取的中文是乱码,无法直接匹配,
  • 找到要去除的文字对应的乱码,获取其字节数组信息,然后据此进行匹配清除
2.添加依赖pdfbox
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

3.代码

public static void handlePdfBook(String pdfPath) {
    try (PDDocument pdfDocument = PDDocument.load(new File(pdfPath))) {
        //加载PDF文件
        //处理PDF中的每一页
        for (PDPage page : pdfDocument.getPages()) {
            //解析PDF,找出其中有"xxxx"文字的token也就是COSString元素,找到后把值改掉即可
            PDFStreamParser parser = new PDFStreamParser(page);
            parser.parse();
            List<Object> tokens = parser.getTokens();
            for (Object o : tokens) {
                if (o instanceof COSString) {
                    COSString cs = (COSString) o;
                    byte[] byte1 = cs.toString().getBytes();
                    byte[] byte2 = getTargetByte();
                    // 比较byte[]是否一致,若相同则将当前token设置为空
                    if (Arrays.equals(byte1, byte2)) {
                        cs.setValue(new byte[0]);
                    }
                }
            }
            //将修改后的token要存进page中去,即修改page中原来的tokens
            PDStream updatedStream = new PDStream(pdfDocument);
            OutputStream out = updatedStream.createOutputStream(COSName.FLATE_DECODE);
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
            tokenWriter.writeTokens(tokens);
            out.close();
            page.setContents(updatedStream);
        }
        //将修改后的PDF保存
        pdfDocument.save(pdfPath.replace(".pdf", "-修改.dpf"));
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

public static byte[] getTargetByte() {
    // 找一页容易获取待清除文字的页面
    File src = new File("F:\\PDF\\SQL\\页面1.pdf");
    try (PDDocument pdfDocument = PDDocument.load(src)) {
        PDFStreamParser parser = new PDFStreamParser(pdfDocument.getPage(0));
        parser.parse();
        List<Object> tokens = parser.getTokens();
        for (Object o : tokens) {
            if (o instanceof COSString) {
                COSString cs = (COSString) o;
                // 获取待清除内容的byte[]
                return cs.toString().getBytes();
            }
        }
    } catch (Exception e) {
        System.out.println(src.getParentFile().getName());
        System.out.println(e.getMessage());
    }
    return null;
}