iText7 Table 总结
iText7 Table Summary
我使用 iText7 和 pdfHTML 插件将 table 添加到 PDF。要设置 table 的可访问性,我想设置 table 的摘要。我在下面的一个中发现了同样的问题。但对此没有明确的答案。如何设置 table 摘要。请指教
iText7 508 Table Summary
我刚试过这个:
PdfDictionary attr = new PdfDictionary();
attr.put(new PdfName("Summary"), new PdfString("Info about the table"));
table.getAccessibilityProperties().addAttributes(new PdfStructureAttributes(attr));
这似乎可以解决问题。现在您需要调整标记工作程序以确保在遇到 table
标记时执行此代码。
更新 1:
我获取了以下 HTML 文件:
<body>
<table summary="some keys and values">
<thead>
<tr><th scope="col">KEY</th><th scope="col">VALUE</th></tr>
</thead>
<tbody>
<tr><td>Color</td><td>Blue</td></tr>
<tr><td>Shape</td><td>Rectangle</td></tr>
<tr><td>Description</td><td>Blue rectangle</td></tr>
</tbody>
</table>
</body>
我已将其转换为可访问的 PDF 文档,如下所示:
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessible tables");
ConverterProperties properties = new ConverterProperties();
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
用 PAC3 检查结果时,我得到以下结果:
到目前为止,从技术角度来看,PDF 被认为是可访问的 PDF/UA 文件。
然后我进行了 "human" 检查:是否存在 table 摘要?不幸的是,事实并非如此,所以我查看了 pdfHTML 附加组件的代码,但没有找到对 table
标签的 summary
属性的任何引用。我认为它在实施pdfHTML时被遗忘了。
首先,我将编写一个自定义标签工作者来负责添加摘要。完成后,我将要求 iText Group 实施 summary
属性,以便将其添加到下一个版本中。
更新二:
我这样改编我的例子:
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessible tables");
ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new AdaptedTagWorkerFactory());
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
class AdaptedTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if(tag.name().equals("table")){
return new TableWithSummaryTagWorker(tag, context);
}
return null;
}
}
class TableWithSummaryTagWorker extends TableTagWorker {
private String summary = null;
public TableWithSummaryTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
summary = element.getAttribute("summary");
if (summary != null) {
Table table = (Table) super.getElementResult();
PdfDictionary attr = new PdfDictionary();
attr.put(new PdfName("Summary"), new PdfString(summary));
table.getAccessibilityProperties().addAttributes(new PdfStructureAttributes(attr));
}
}
}
我通过 PAC3 运行 它,它仍然验证为 PDF/UA,但它没有在任何地方提到 table 摘要。当我查看 PDF 时,我现在可以看到摘要:
我现在将与 iText Group 分享此信息,并请他们检查我的解决方案是否正确(如果这不能解决您的问题,请添加评论)。如果是这样,很有可能从 iText 7.1.4 开始实施。
更新 3:
我已经根据OP提供的答案修改了我的代码。 OP 的代码中有一个错误。在该代码中,/Summary
添加为 PDF 名称,而它应该是 PDF 字符串。
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessibility example");
ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new AdaptedTagWorkerFactory());
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
class AdaptedTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if(tag.name().equals("table")){
return new TableWithSummaryTagWorker(tag, context);
}
return null;
}
}
class TableWithSummaryTagWorker extends TableTagWorker {
private String summary = null;
public TableWithSummaryTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
IPropertyContainer elementResult = super.getElementResult();
summary = element.getAttribute("summary");
if (summary != null && elementResult instanceof IAccessibleElement) {
AccessibilityProperties properties = ((IAccessibleElement)elementResult).getAccessibilityProperties();
properties.addAttributes(new PdfStructureAttributes("Table").addTextAttribute("Summary", summary));
}
}
}
现在当你检查结果时,你会得到这个报告:
如您所见,摘要测试通过。
谢谢布鲁诺。我用的是 C#。 ProcessEnd 方法应更改如下。
public override void ProcessEnd(IElementNode element, ProcessorContext context)
{
base.ProcessEnd(element, context);
IPropertyContainer elementResult = base.GetElementResult();
if (elementResult is IAccessibleElement)
{
string summary= element.GetAttribute("summary"); //This is the summary="tbl summary" in HTML
AccessibilityProperties properties = ((IAccessibleElement)elementResult).GetAccessibilityProperties();
properties.AddAttributes(new PdfStructureAttributes("Table").AddEnumAttribute("Summary", summary));
}
}
要查看 table 标题,您必须使用 Adobe Acrobat Professional 打开 pdf。右键单击 table 和 select "Edit table Summary"。标题会显示在这里。
我使用 iText7 和 pdfHTML 插件将 table 添加到 PDF。要设置 table 的可访问性,我想设置 table 的摘要。我在下面的一个中发现了同样的问题。但对此没有明确的答案。如何设置 table 摘要。请指教
iText7 508 Table Summary
我刚试过这个:
PdfDictionary attr = new PdfDictionary();
attr.put(new PdfName("Summary"), new PdfString("Info about the table"));
table.getAccessibilityProperties().addAttributes(new PdfStructureAttributes(attr));
这似乎可以解决问题。现在您需要调整标记工作程序以确保在遇到 table
标记时执行此代码。
更新 1:
我获取了以下 HTML 文件:
<body>
<table summary="some keys and values">
<thead>
<tr><th scope="col">KEY</th><th scope="col">VALUE</th></tr>
</thead>
<tbody>
<tr><td>Color</td><td>Blue</td></tr>
<tr><td>Shape</td><td>Rectangle</td></tr>
<tr><td>Description</td><td>Blue rectangle</td></tr>
</tbody>
</table>
</body>
我已将其转换为可访问的 PDF 文档,如下所示:
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessible tables");
ConverterProperties properties = new ConverterProperties();
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
用 PAC3 检查结果时,我得到以下结果:
到目前为止,从技术角度来看,PDF 被认为是可访问的 PDF/UA 文件。
然后我进行了 "human" 检查:是否存在 table 摘要?不幸的是,事实并非如此,所以我查看了 pdfHTML 附加组件的代码,但没有找到对 table
标签的 summary
属性的任何引用。我认为它在实施pdfHTML时被遗忘了。
首先,我将编写一个自定义标签工作者来负责添加摘要。完成后,我将要求 iText Group 实施 summary
属性,以便将其添加到下一个版本中。
更新二:
我这样改编我的例子:
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessible tables");
ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new AdaptedTagWorkerFactory());
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
class AdaptedTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if(tag.name().equals("table")){
return new TableWithSummaryTagWorker(tag, context);
}
return null;
}
}
class TableWithSummaryTagWorker extends TableTagWorker {
private String summary = null;
public TableWithSummaryTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
summary = element.getAttribute("summary");
if (summary != null) {
Table table = (Table) super.getElementResult();
PdfDictionary attr = new PdfDictionary();
attr.put(new PdfName("Summary"), new PdfString(summary));
table.getAccessibilityProperties().addAttributes(new PdfStructureAttributes(attr));
}
}
}
我通过 PAC3 运行 它,它仍然验证为 PDF/UA,但它没有在任何地方提到 table 摘要。当我查看 PDF 时,我现在可以看到摘要:
我现在将与 iText Group 分享此信息,并请他们检查我的解决方案是否正确(如果这不能解决您的问题,请添加评论)。如果是这样,很有可能从 iText 7.1.4 开始实施。
更新 3:
我已经根据OP提供的答案修改了我的代码。 OP 的代码中有一个错误。在该代码中,/Summary
添加为 PDF 名称,而它应该是 PDF 字符串。
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessibility example");
ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new AdaptedTagWorkerFactory());
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
class AdaptedTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if(tag.name().equals("table")){
return new TableWithSummaryTagWorker(tag, context);
}
return null;
}
}
class TableWithSummaryTagWorker extends TableTagWorker {
private String summary = null;
public TableWithSummaryTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
IPropertyContainer elementResult = super.getElementResult();
summary = element.getAttribute("summary");
if (summary != null && elementResult instanceof IAccessibleElement) {
AccessibilityProperties properties = ((IAccessibleElement)elementResult).getAccessibilityProperties();
properties.addAttributes(new PdfStructureAttributes("Table").addTextAttribute("Summary", summary));
}
}
}
现在当你检查结果时,你会得到这个报告:
如您所见,摘要测试通过。
谢谢布鲁诺。我用的是 C#。 ProcessEnd 方法应更改如下。
public override void ProcessEnd(IElementNode element, ProcessorContext context)
{
base.ProcessEnd(element, context);
IPropertyContainer elementResult = base.GetElementResult();
if (elementResult is IAccessibleElement)
{
string summary= element.GetAttribute("summary"); //This is the summary="tbl summary" in HTML
AccessibilityProperties properties = ((IAccessibleElement)elementResult).GetAccessibilityProperties();
properties.AddAttributes(new PdfStructureAttributes("Table").AddEnumAttribute("Summary", summary));
}
}
要查看 table 标题,您必须使用 Adobe Acrobat Professional 打开 pdf。右键单击 table 和 select "Edit table Summary"。标题会显示在这里。