我正在研究iText7的可访问性标签,我希望标签具有特定的结构。我看到itext7具有库方法,但是在itext网站或任何其他开发人员论坛上的任何地方都找不到用法。我希望结构像这样。
我看到用于标记的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();
我正在将段落添加到标题段落,我看到添加的段落彼此附加。正确的使用方式是什么?
答案 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:
关于结构的奇怪之处是您正在混合标题标签。当您使用H
时,我不希望您使用H1
。我希望您可以只使用H
和一级标题。如果您需要更多级别,我希望您使用H1
,H2
,...
您还注意到,您的评论无法经受现实的考验。您写道:
我用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();
}
结果如下:
这看起来更令人费解,尤其是对于像这样简单的示例而言,但是如果您的文档较大,那么这种额外的结构可能会有所帮助。
在我的评论中,我提到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);
}
结果将是:
这与第一个示例非常相似。
现在,如果我们添加一些额外的结构,例如:
<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可以帮助您做出有关结构的决定。