c# – 来自HTML的iText 7可访问的PDF:当使用display:table时,如何避免表标记;
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 来自HTML的iText 7可访问的PDF:当使用display:table时,如何避免表标记;,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3372字,纯文字阅读大概需要5分钟。
内容图文
![c# – 来自HTML的iText 7可访问的PDF:当使用display:table时,如何避免表标记;](/upload/InfoBanner/zyjiaocheng/797/2f6a93d488b446e69604de7d3485e054.jpg)
我正在开发一个将视图转换为PDF的ASP.NET MVC项目.以前,使用了Rotavia,但随后新的客户要求是PDF可访问/ 508兼容.出于布局目的,以前的开发人员有一个完整的标题部分(徽标,标题,免责声明等)作为没有元素的表(只是td).我需要将它们转换为div,但看起来保持不变.所以,我做的是使它们成为div,然后使用CSS属性,display:table,display:table-row-group,display:table-row,display:table-cell.最终看起来几乎完全相同.
问题是,即使它们现在是div,也使用iText DefaultTagWorkerFactory,如下所示:
ConverterProperties props = new ConverterProperties();
FontProvider fp = new FontProvider();
fp.AddStandardPdfFonts();
props.SetFontProvider(fp);
var tagWorkerFactory = new DefaultTagWorkerFactory();
props.SetTagWorkerFactory(tagWorkerFactory);
HtmlConverter.ConvertToPdf(html, pdfDoc, props);
它仍然将Div标签转换为table,tr和td标签.显然,在div上使用display:table的整个目的是避免使用表但获得相同的布局效果.
为什么iText会实现这种行为并且有什么办法吗?如果没有,任何人都可以提供任何精确的CSS等效显示:table,display:table-row-group,display:table-row,display:table-cell,因为看起来iText只看到属性“display:table”并使用table-tag.我在自定义标记工作器工厂中尝试了以下操作,该工厂通过向我的div添加一个类“make-div”来继承DefaultTagWorkerFactory,如下所示:
public class AccessibilityTagWorkerFactory : DefaultTagWorkerFactory
{
public override ITagWorker GetCustomTagWorker(IElementNode tag, ProcessorContext context)
{
var attributes = tag.GetAttributes();
var cssClass = attributes.GetAttribute("class");
if (!string.IsNullOrWhiteSpace(cssClass) && cssClass.Contains("make-div"))
{
return new DivTagWorker(tag, context);
}
return null;
}
}
但是,它会引发一个异常,例如“无法将DivTagWorker隐式转换为DisplayTableRowTagWorker”.
所有这一切都让我满怀信心.任何帮助,将不胜感激.谢谢.
解决方法:
您似乎已将标记worker替换为display:table-row元素,但未对display:table执行此操作.当然,我无法确定,因为您没有共享示例HTML文件来重现该问题.
无论如何,替代标签工人的方法并不是最好的.它只会丢弃由自定义显示CSS属性引起的布局调整,而您的目标是保存布局,但只需更改标记.
要保存布局并更改标记,不应更改已创建的标记工作程序,而应为由这些标记工作程序创建的表和单元格布局元素设置正确的角色.
相应的重载标记工作者可能如下所示:
private static class DivRoleDisplayTableTagWorker extends DisplayTableTagWorker {
public DivRoleDisplayTableTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
if (getElementResult() instanceof Table) {
Table table = (Table) getElementResult();
table.getAccessibilityProperties().setRole(StandardRoles.DIV);
for (int i = 0; i < table.getNumberOfRows(); i++) {
for (int j = 0; j < table.getNumberOfColumns(); j++) {
Cell cell = table.getCell(i, j);
if (cell != null) {
cell.getAccessibilityProperties().setRole(StandardRoles.DIV);
}
}
}
}
}
}
您需要做的就是使用display:table替换tag worker for div,并使用自定义标记worker.根据您的文档,您可能会使用不同的条件,但对于简单的情况,自定义标记工作者工厂将如下所示:
ITagWorkerFactory customFactory = new DefaultTagWorkerFactory() {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if (CssConstants.TABLE.equals(tag.getStyles().get(CssConstants.DISPLAY)) && TagConstants.DIV.equals(tag.name())) {
return new DivRoleDisplayTableTagWorker(tag, context);
}
return super.getCustomTagWorker(tag, context);
}
};
现在你的表格及其单元格将被标记为div.
内容总结
以上是互联网集市为您收集整理的c# – 来自HTML的iText 7可访问的PDF:当使用display:table时,如何避免表标记;全部内容,希望文章能够帮你解决c# – 来自HTML的iText 7可访问的PDF:当使用display:table时,如何避免表标记;所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。