【问题标题】:Fixing a PDF Accessibility Issue (Alternative description missing for an annotation) in links修复链接中的 PDF 可访问性问题(注释缺少替代描述)
【发布时间】:2018-08-29 12:41:58
【问题描述】:

使用 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 类型的元素设置可访问属性? 请帮我解决这个问题。 谢谢

【问题讨论】:

    标签: c# itext7


    【解决方案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);
                }
            }
    
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-04
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 2015-12-23
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多