我需要将一个通用的PdfObject添加到PDF而不将其放在任何地方的文档中。
这里有来自iText 5的代码:
PdfReader reader = new PdfReader(args[0]);
PdfLiteral obj = new PdfLiteral("HelloWorld");
PdfArray arr = new PdfArray();
arr.add(obj);
reader.addPdfObject(arr);
OutputStream fout = new FileOutputStream(args[0] + "-itext5.pdf");
PdfStamper stamper = new PdfStamper(reader, fout);
stamper.close();
fout.close();
reader.close();
这是我在iText 7中尝试做的事情(没有addPdfObject方法):
try (PdfDocument writer = new PdfDocument(new PdfReader(args[0]), new PdfWriter(args[0] + "-itext7.pdf"))) {
PdfLiteral obj = new PdfLiteral("HelloWorld");
PdfArray arr = new PdfArray();
arr.add(obj);
// method 1:
arr.copyTo(writer);
// method 2:
arr.makeIndirect(writer);
}
但是,关闭它后,数组不在PDF中。我想我记得布鲁诺在某处提到iText 7现在删除了关闭时未使用的对象,类似于iText 5中的PdfReader.removeUnusedObjects()。
有没有办法将对象添加到XRef字典中,并将其添加到PDF中,而不像在iText 5中那样在任何地方引用它?
或者,是否有一个安全的地方可以在目录中添加未使用的PdfName或其他不会以任何方式影响查看者的地方?我在这里不清楚PDF规范。
答案 0 :(得分:3)
iText7确实默认情况下不会将未使用的对象写入输出文档。
至少有两种方法可以实现将悬空对象写入文档的用例。
选项1
使用PdfDocument#setFlushUnusedObjects
方法始终刷新未使用的对象。您拥有的其余代码是正确的并保持不变:
pdfDocument.setFlushUnusedObjects(true);
PdfLiteral obj = new PdfLiteral("HelloWorld");
PdfArray arr = new PdfArray();
arr.add(obj);
arr.makeIndirect(pdfDocument);
选项2
使用PdfObject#flush
立即并明确地刷新您想要的对象。这不会更改删除未使用对象的默认逻辑,因此仍未删除任何未调用flush()
的对象。
PdfLiteral obj = new PdfLiteral("HelloWorld");
PdfArray arr = new PdfArray();
arr.add(obj);
arr.makeIndirect(pdfDocument);
arr.flush();