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

时间:2018-03-29 18:29:18

标签: java itext itext7

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

1 个答案:

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