迁移到 iText 7 - 将通用对象添加到 PDF

Migrating to iText 7 - Adding generic object to PDF

我需要将通用 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 规范。

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();