基本上,我想做的是实现这个问题的 OP 想要的:
但是,目前我正在生成一个 XHTML 文档并使用 XMLWorker(iTextSharp 版本)来解析该文档以生成我的内容。如何设置由 XmlWorker.Parse 方法生成的表对象的 KeepRowsTogether 标志?
基本上,我想做的是实现这个问题的 OP 想要的:
但是,目前我正在生成一个 XHTML 文档并使用 XMLWorker(iTextSharp 版本)来解析该文档以生成我的内容。如何设置由 XmlWorker.Parse 方法生成的表对象的 KeepRowsTogether 标志?
好的,想通了。基本上,我从 iTextSharp.tool.xml.html.table.Table 派生了一个 TagProcessor 并覆盖了 End 方法,以便它检查标记是否具有 keeprowstogether 属性,如果有,则遍历基类的输出并调用 KeepRowsTogether 方法PdfPTable 对象的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using iTextSharp.tool.xml.html;
using iTextSharp.tool.xml.html.table;
using iTextSharp.text.pdf;
namespace MySolution
{
public class TableHtmlTagProcessor : Table
{
public override IList<iTextSharp.text.IElement> End(iTextSharp.tool.xml.IWorkerContext ctx, iTextSharp.tool.xml.Tag tag, IList<iTextSharp.text.IElement> currentContent)
{
string keeprowstogetherattr = "keeprowstogether";
var retval = base.End(ctx, tag, currentContent);
if (tag.Attributes.ContainsKey(keeprowstogetherattr) && tag.Attributes[keeprowstogetherattr] == "true")
{
foreach (PdfPTable table in retval.OfType<PdfPTable>())
{
table.KeepRowsTogether(0);
}
}
return retval;
}
}
}
然后,在解析之前,我将此处理器添加到 TagProcessorFactory 以便它处理表标签而不是默认实现:
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
var tagProcessorFactory = Tags.GetHtmlTagProcessorFactory();
tagProcessorFactory.AddProcessor(new TableHtmlTagProcessor(), new[] { "table" });
htmlContext.SetTagFactory(tagProcessorFactory);
瞧!源 XHTML 中将 keeprowstogether 属性设置为“true”的所有表格元素都不会跨页面中断!
这是矫枉过正吗?有没有更简单的方法来达到这种效果?