【发布时间】:2014-06-30 19:14:43
【问题描述】:
当您尝试创建具有 0 列的 PdfTable 时,ITextSharp 会引发错误。
我需要获取使用 XSLT 转换生成的 XHTML 并从中生成 PDF。目前我正在使用 ITextSharp 这样做。我遇到的问题是生成的 XHTML 有时包含 0 行的表,因此当 ITextSharp 尝试将它们解析为表时,它会抛出错误,说表中有 0 列。
之所以说 0 列是因为 ITextSharp 将表中的列数设置为每行中的最大列数,并且由于没有行,因此任何给定行中的最大列数为 0。
如何捕获这些 0 行的 HTML 表格声明并阻止它们被解析为 PDF 元素?
我发现导致错误的代码在 HtmlPipeline 中,因此我可以将实现复制并粘贴到扩展 HtmlPipeline 并覆盖其方法的类中,然后执行我的逻辑来检查那里的空表,但这似乎草率且效率低下。
有没有办法在解析之前捕获空表?
=解决方案=
标签处理器
public class EmptyTableTagProcessor : Table
{
public override IList<IElement> End(IWorkerContext ctx, Tag tag, IList<IElement> currentContent)
{
if (currentContent.Count > 0)
{
return base.End(ctx, tag, currentContent);
}
return new List<IElement>();
}
}
并使用标签处理器...
//CSS
var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
//HTML
var fontProvider = new XMLWorkerFontProvider();
var cssAppliers = new CssAppliersImpl(fontProvider);
var tagProcessorFactory = Tags.GetHtmlTagProcessorFactory();
tagProcessorFactory.AddProcessor(new EmptyTableTagProcessor(), new string[] { "table" });
var htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.SetTagFactory(tagProcessorFactory);
//PIPELINE
var pipeline =
new CssResolverPipeline(cssResolver,
new HtmlPipeline(htmlContext,
new PdfWriterPipeline(document, pdfWriter)));
//XML WORKER
var xmlWorker = new XMLWorker(pipeline, true);
using (var stringReader = new StringReader(html))
{
xmlParser.Parse(stringReader);
}
此解决方案删除了空表标签,仍然将 PDF 作为管道的一部分写入。
【问题讨论】:
标签: pdf pdf-generation itextsharp itext html-table