用 itext7 标记

Tagging with itext7

我正在研究 iText7 的可访问性标签,我想要标签的特定结构。我看到 itext7 有库方法,但我无法在 itext 站点或任何其他开发人员论坛上的任何地方找到用法。我希望结构是这样的。

我看到了用于标记但不知道如何实现的 TagTreePointer class 和子方法。

我正在尝试实现上述功能的示例代码,但发现了一些不一致之处。

Document document = new Document(pdf);
        pdf.setTagged();
        pdf.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true));
        pdf.getCatalog().setLang(new PdfString("en-US"));
        PdfDocumentInfo info = pdf.getDocumentInfo();
        info.setTitle("English pangram");
        Paragraph p = new Paragraph("Tested");
        p.getAccessibilityProperties().setRole("H");
        Paragraph p2 = new Paragraph("Child H1");
        p2.getAccessibilityProperties().setRole("H1");
        document.add(p.add(p2.add(new Paragraph("Testing ChildChild"))));
        document.close();

我正在向页眉段落添加段落,我看到添加的段落相互附加。正确的使用方法是什么?

我有四个例子给你。

示例 1 是简单的示例:

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    pdf.setTagged();
    pdf.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true));
    pdf.getCatalog().setLang(new PdfString("en-US"));
    PdfDocumentInfo info = pdf.getDocumentInfo();
    info.setTitle("Testing tags");
    Document document = new Document(pdf);
    Paragraph p = new Paragraph("Tested");
    p.getAccessibilityProperties().setRole("H");
    Paragraph p2 = new Paragraph("Child H1");
    p2.getAccessibilityProperties().setRole("H1");
    document.add(p).add(p2).add(new Paragraph("Testing ChildChild"));
    document.close();
}

生成以下 PDF:

结构的奇怪之处在于您混合了 header 标签。当你使用 H 时,我不希望你使用 H1。我希望您只使用 H 一级 headers。如果您需要更多级别,我希望您使用H1H2、...

您还注意到您的评论经不起现实的考验。您写道:

I changed the code with document.add(p).add(p2).add(new Paragraph("Testing ChildChild")); and I see the new paragraphs which I add doesnot show on new line. I want each paragraph to be on new line.

但是,如果您查看屏幕截图,您会清楚地看到每个段落都从一个新行开始。请避免发表很容易被证明是错误的评论。这可能会导致人们帮助你。

如果想要更多的结构层数,可以引入一个Div:

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    pdf.setTagged();
    pdf.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true));
    pdf.getCatalog().setLang(new PdfString("en-US"));
    PdfDocumentInfo info = pdf.getDocumentInfo();
    info.setTitle("Testing tags");
    Document document = new Document(pdf);
    Paragraph p = new Paragraph("Tested");
    p.getAccessibilityProperties().setRole("H");
    Div divH = new Div().add(p);
    Paragraph p2 = new Paragraph("Child H1");
    p2.getAccessibilityProperties().setRole("H1");
    Div divH1 = new Div().add(p2);
    divH1.add(new Paragraph("Testing ChildChild"));
    divH.add(divH1);
    document.add(divH);
    document.close();
}

这个结果看起来像这样:

这看起来更复杂,尤其是对于像这样简单的示例,但如果您的文档更大,这个额外的结构可能会有所帮助。

在我的评论中,我提到了 HTML,因为 PDF 中的标记模仿了 HTML 中的标记。当 iText 从头开始​​重写时,它被重写为 HTML。

我知道你写了:

We are not creating any HTML tags. Instead we are getting the data from DB and inserting into paragraphs.

我想你没有理解我的意思。我只是想解释一下,无论您如何创建带标签的 PDF,记住如何在 HTML.

中标记内容总是好的。

举个例子:

<h1>Introduction</h1>
<h2>TOC</h2>
<p>List</p>
<h1>Appendix</h1>
<h2>Heading</h2>
<p>Description</p>

现在运行这段代码:

 */
public void createPdf(String baseUri, String src, String dest) throws IOException {
    PdfWriter writer = new PdfWriter(dest);
    PdfDocument pdf = new PdfDocument(writer);
    pdf.setTagged();
    HtmlConverter.convertToPdf(new FileInputStream(src), pdf);
}

结果将是:

这与第一个示例非常相似。

现在,如果我们像这样添加一些额外的结构:

<div>
    <h1>Introduction</h1>
    <div>
        <h2>TOC</h2>
        <p>List</p>
    </div>
</div>
<div>
    <h1>Appendix</h1>
    <div>
        <h2>Heading</h2>
        <p>Description</p>
    </div>
</div>

我们得到这个结果(使用相同的代码):

这个结构看起来更像第二个例子。

我认为你误解了我对 HTML 的评论。我使用 HTML 来为我的代码建模。调整 HTML、转换为 PDF 并查看生成的标签结构比不断更改我的 Java 代码、编译和 运行 该代码然后查看要容易得多结果。

我建议您尝试使用 HTML,即使您的应用程序不需要 HTML。试验 HTML 有助于您对结构做出决定。