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