用 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。如果您需要更多级别,我希望您使用H1
、H2
、...
您还注意到您的评论经不起现实的考验。您写道:
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 有助于您对结构做出决定。
我正在研究 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。如果您需要更多级别,我希望您使用H1
、H2
、...
您还注意到您的评论经不起现实的考验。您写道:
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 有助于您对结构做出决定。