我有一个要求用实际值替换$ {placeholder}之类的占位符,但是我找不到任何有效的解决方案...我本来会跟随https://itextpdf.com/en/resources/examples/itext-7/replacing-pdf-objects,但它不起作用。有人知道怎么做吗?
答案 0 :(得分:1)
通常,“替换” pdf文件的内容并不容易,因为它可以用不同的方式编写。例如,假设您要用块“ World”替换块“ Hello”。如果将“ Hello”作为一个整体写到pdf中,您将很幸运。它可能被写为“ He”和“ llo”,甚至是“ o”,“ l”,“ l”,“ e”,“ H”,并且字母migth被放置在内容流的不同部分中
但是,可以删除内容,然后将其他一些内容放在同一位置。
让我们看看如何实现。
1)我建议您使用iText的pdfSweep
,因为此工具能够检测放置内容的区域并删除内容(重要的是要注意pdfSweep不会隐藏内容,它会完全删除它)
我们来讨论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();
}