【发布时间】:2018-07-13 08:35:09
【问题描述】:
我正在开发一个将视图转换为 PDF 的 ASP.NET MVC 项目。以前,使用的是 Rotavia,但新的客户要求是 PDF 可访问/符合 508。出于布局目的,以前的开发人员将整个标题部分(徽标、标题、免责声明等)作为没有 th 元素的表格(仅 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 等效项 display:table、display:table-row-group、display:table-row 和 display:table-cell,因为 iText 似乎只看到属性“display:table”并使用表标签。我在继承 DefaultTagWorkerFactory 的自定义标签工作者工厂中尝试了以下操作,方法是向我的 div 添加一个类“make-div”,如下所示:
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”的异常。
我对这一切都束手无策。任何帮助,将不胜感激。谢谢。
【问题讨论】:
-
驯兽师,如果您有解决此问题的方法,请随时通知我。
-
@Fadeel : 会的...不过目前看起来不太好
-
@Fadeel,有人回答了!
标签: c# css itext itext7 html-to-pdf