使用itext7标记

时间:2018-07-05 15:31:53

标签: pdf tags itext accessibility itext7

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

enter image description here

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

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

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 个答案:

答案 0 :(得分:1)

我为您提供四个示例。

示例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:

enter image description here

关于结构的奇怪之处是您正在混合标题标签。当您使用H时,我不希望您使用H1。我希望您可以只使用H一级标题。如果您需要更多级别,我希望您使用H1H2,...

您还注意到,您的评论无法经受现实的考验。您写道:

  

我用document.add(p).add(p2).add(new Paragraph(“ Testing ChildChild”));更改了代码并且我看到添加的新段落没有显示在新行上。我希望每个段落都换行。

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

如果需要更多结构层,可以引入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();
}

结果如下:

enter image description here

这看起来更令人费解,尤其是对于像这样简单的示例而言,但是如果您的文档较大,那么这种额外的结构可能会有所帮助。

在我的评论中,我提到HTML是因为PDF中的标记模仿HTML中的标记。从头开始重写iText时,考虑到HTML进行了重写。

我知道你写过:

  

我们没有创建任何HTML标签。相反,我们从数据库获取数据并将其插入到段落中。

我想你错过了我的意思。我只是想解释一下,无论您如何创建带标签的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);
}

结果将是:

enter image description here

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

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

<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>

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

enter image description here

此结构看起来更像第二个示例。

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

我建议您即使您的应用程序不需要HTML,也要尝试HTML。试用HTML可以帮助您做出有关结构的决定。