如何用ITextPDF库替换pdf文件中的文本?

时间:2019-05-30 10:30:17

标签: java pdf itext

我有一个要求用实际值替换$ {placeholder}之类的占位符,但是我找不到任何有效的解决方案...我本来会跟随https://itextpdf.com/en/resources/examples/itext-7/replacing-pdf-objects,但它不起作用。有人知道怎么做吗?

2 个答案:

答案 0 :(得分:1)

通常,“替换” pdf文件的内容并不容易,因为它可以用不同的方式编写。例如,假设您要用块“ World”替换块“ Hello”。如果将“ Hello”作为一个整体写到pdf中,您将很幸运。它可能被写为“ He”和“ llo”,甚至是“ o”,“ l”,“ l”,“ e”,“ H”,并且字母migth被放置在内容流的不同部分中

但是,可以删除内容,然后将其他一些内容放在同一位置。

让我们看看如何实现。

1)我建议您使用iText的pdfSweep,因为此工具能够检测放置内容的区域并删除内容(重要的是要注意pdfSweep不会隐藏内容,它会完全删除它)

请查看下一个示例:https://github.com/itext/i7j-pdfsweep/blob/develop/src/test/java/com/itextpdf/pdfcleanup/BigDocumentAutoCleanUpTest.java

我们来讨论redactTonySoprano测试。如您所见,您可以提供一些正则表达式(例如““ Tony(| _)Soprano”,“ Soprano”和“ Sopranoes”),而iText会编辑内容的所有匹配项。

然后,您可以使用iText通过低级api(PdfCanvas)或更复杂的高级api(Canvas等)在这些区域上写一些文本。

让我们修改一下我之前提到的女高音样本:

2)让我们在编辑区域上添加一些文本:

for (IPdfTextLocation location : strategy.getResultantLocations()) {
PdfPage page = pdf.getPage(location.getPageNumber()+1);
PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), page.getDocument());
Canvas canvas = new Canvas(pdfCanvas, pdf, location.getRectangle());
canvas.add(new Paragraph("SECURED").setFontSize(8));

}

结果并不理想,但这仅仅是概念的证明。可以重写提取策略并定义编辑内容的字体,以便将其用于将新文本放置在编辑区域上。

答案 1 :(得分:0)

下面的示例代码,用于使用iText替换PDF中的内容

    File dir = new File("./");
    File [] files = dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".pdf");
        }
    });

    for (File pdffile : files) {
        System.out.println(pdffile.getName());
        PdfReader reader = null;
        reader = new PdfReader(pdffile.toString()); 

      PdfDictionary dict = reader.getPageN(1);
      PdfObject object = dict.getDirectObject(PdfName.CONTENTS);
      if (object instanceof PRStream) {
          PRStream stream = (PRStream)object;
          byte[] data = PdfReader.getStreamBytes(stream);
          String dd = new String(data);
          dd = dd.replace("0 0 0 rg\n()Tj", "0 0 0 rg\n(Plan Advanced Payment)Tj");
          System.out.print(dd);
          stream.setData(dd.getBytes());
      }
      PdfStamper stamper = new PdfStamper(reader,
      new FileOutputStream("./output/"+pdffile.getName())); // output PDF
      stamper.close();
      reader.close();
    }