基本上,我要做的是达到这个问题的OP所需要的:
iText avoid to cut tables on page jump
但是,目前我正在生成XHTML文档并使用XMLWorker(iTextSharp版本)来解析该文档以生成我的内容。如何设置由XmlWorker.Parse方法生成的表对象的KeepRowsTogether标志?
答案 0 :(得分:4)
好的,明白了。基本上我从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”的所有表元素不会跨页面分开!
这有多大意义吗?是否有更简单的方法来实现这种效果?