修复链接中的PDF辅助功能问题(注释缺少替代说明)

问题描述 投票:0回答:1

使用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

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

c# itext7
1个回答
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标签工作者:

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);
            }
        }


    }

}
© www.soinside.com 2019 - 2024. All rights reserved.