如何使用 itextpdf-5.5.13 的低级对象标记 PDF

How to Tagged PDF with low level object of itextpdf-5.5.13

我正在尝试使用 itext5 的低级对象创建带标签的 PDF,如下所示

    document.open();
    PdfStructureTreeRoot structureTreeRoot = writer.getStructureTreeRoot();
    PdfStructureElement top = new PdfStructureElement(structureTreeRoot, PdfName.DOCUMENT);
    PdfStructureElement element = new PdfStructureElement(top, PdfName.P);
    PdfContentByte cb = writer.getDirectContent();
    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, false);
    cb.setLeading(16);
    cb.setFontAndSize(bf, 12);
    cb.beginText();
    cb.setTextMatrix(50, 700);
    cb.beginMarkedContentSequence(element);
    cb.newlineShowText("Hello There");
    cb.endMarkedContentSequence();
    cb.endText();
    document.close();`

代码生成 pdf,它在 acrobat DC pro 中打开,但是当我检查标签时,acrobat 没有响应。 在 itext-rups 中检查结构树时,我发现 StructureTreeRoot 数组包含 null 而不是 StructureElement 并且在 XRef 中第二和第三个对象也丢失

我是 pdf 生成的新手,编写的代码参考了 Tagged PDF。项目必须使用 itext5 低级对象

由于您在此处使用的是低级 API,因此您必须明确执行大量工作,否则这些工作会自动为您完成。

例如,在手头的情况下,您必须在关闭文档之前明确地将 PdfStructureElement 添加到文档中,即

[...]
cb.endText();
writer.addToBody(element, element.getReference());
writer.addToBody(top, top.getReference());
document.close();