首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iText7表摘要

iText7表摘要
EN

Stack Overflow用户
提问于 2018-08-29 04:15:21
回答 2查看 725关注 0票数 1

我使用iText7和pdfHTML加载项将表添加到PDF中。若要设置表的可访问性,我希望设置表的摘要。我在下面发现了同样的问题。但这还没有明确的答案。如何设置表摘要。请指点。

iText7 508 Table Summary

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-29 12:02:35

谢谢布鲁诺。我用的是C#。ProcessEnd方法应更改如下。

代码语言:javascript
复制
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));
    }
    }

要查看表格标题,您必须使用打开pdf。右击表格并选择“编辑表格摘要”。标题将在这里显示。

票数 1
EN

Stack Overflow用户

发布于 2018-08-29 07:36:49

我刚试过这个:

代码语言:javascript
复制
PdfDictionary attr = new PdfDictionary();
attr.put(new PdfName("Summary"), new PdfString("Info about the table"));
table.getAccessibilityProperties().addAttributes(new PdfStructureAttributes(attr));

这似乎起作用了。现在,您需要对标记工作者进行调整,以确保在遇到table标记时执行此代码。

更新1:

我使用了以下HTML文件:

代码语言:javascript
复制
<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文件:

代码语言:javascript
复制
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文件。

然后我做了“人”检查:表摘要是否存在?不幸的是,它不是,所以我查看了pdfHTML插件的代码,没有找到对table标记的summary属性的任何引用。我认为当pdfHTML被实现时,它被遗忘了。

在第一个例子中,我将编写一个自定义标记工作者,负责添加摘要。一旦完成,我将要求iText组实现summary属性,以便将其添加到下一个版本中。

更新2:

我把我的例子改编成这样:

代码语言:javascript
复制
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,但是它没有提到任何地方的表摘要。当我查看PDF文档时,我现在可以看到以下摘要:

现在我将与iText集团分享这个信息,并要求他们检查我的解决方案是否正确(如果没有解决您的问题,请添加评论)。如果是的话,这很有可能是从iText 7.1.4开始实现的。

更新3:

我根据OP提供的答案修改了我的代码。在OP的代码中有一个错误。在该代码中,/Summary作为PDF名称添加,而应该是PDF字符串。

代码语言:javascript
复制
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));
        }
    }
}

现在,当您检查结果时,您会得到以下报告:

如您所见,摘要测试通过了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52069385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档