解决链接中的PDF可访问性问题(注释缺少替代说明)

时间:2018-08-29 12:41:58

标签: c# itext7

使用iText 7中的pdfHTMl附加组件生成可访问的pdf。要将链接添加到HTML文件中以下代码所用的pdf,

<a href="www.google.com" title="web">www.google.com</a>

C#代码如下:

IList<IElement> elements = HtmlConverter.ConvertToElements(htmlFile,converterProperties);
foreach(IElement element in elements){
    doc.Add((IBlockElement)element);
}

链接按预期出现在pdf中。 PAC工具给出错误,提示“注释缺少替代描述”。 我看到这里已经提出了同样的问题。 Fixing a PDF Accessibility Issue (Alternative description missing for an annotation) when converting an HTML Page to PDF

Fixing link error, pdfHTML

但是没有提到什么是提取答案。这就是为什么我提出了新的理由。 我很累,无法使用aTagWorker创建自定义标签。但是元素在ProcessEnd方法中显示为JSoupElementNode。如何设置元素的JSoupElementNode类型的可访问属性? 请帮助我解决此问题。 谢谢

1 个答案:

答案 0 :(得分:1)

您在正确的轨道上。通常,getElementResult()函数可以被重写以获取可以向其中添加辅助功能属性的对象。链接有点特殊,因为有两个对象,例如段落批注(重叠的可单击框,但与文本不直接相关)。这意味着您必须通过processsEnd()函数。此时,getAllElements()将返回链接的子元素。

这是我与他人合作时想出的解决方案。请注意,它假设链接的子元素是Text元素,在典型情况下是正确的,但不一定在每种情况下都是如此。

设置HtmlWorker使用新的ATagWorker

ConverterProperties converterProperties = new ConverterProperties();
converterProperties.setTagWorkerFactory(new DefaultTagWorkerFactory() {
    @Override
    public ITagWorker getCustomTagWorker(
            IElementNode tag, ProcessorContext context) {
        if ("a".equalsIgnoreCase(tag.name())) {
            return new AccessibleATagWorker(tag, context);
        }
        return null;
    }
});

...
HtmlConverter.convertToPdf( ... , ... , converterProperties);

还有自定义的A标签Worker:

class AccessibleATagWorker extends ATagWorker {

    private String ALTERNATE_DESCRIPTION;

    public AccessibleATagWorker(IElementNode element, ProcessorContext context) {
        super(element, context);
        ALTERNATE_DESCRIPTION = element.getAttribute("title");
    }

    @Override
    public void processEnd(IElementNode element, ProcessorContext context) {
        super.processEnd(element, context);
        List < IPropertyContainer > containedElements = this.getAllElements();
        for (int x = 0; x < containedElements.size(); x++) {
            if (containedElements.get(x) instanceof Text) {
                ((Text) containedElements.get(x)).getAccessibilityProperties().setAlternateDescription(ALTERNATE_DESCRIPTION);
            }
        }


    }

}