2

基本上,我想做的是实现这个问题的 OP 想要的:

iText 避免在页面跳转时切表

但是,目前我正在生成一个 XHTML 文档并使用 XMLWorker(iTextSharp 版本)来解析该文档以生成我的内容。如何设置由 XmlWorker.Parse 方法生成的表对象的 KeepRowsTogether 标志?

4

1 回答 1

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”的所有表格元素都不会跨页面中断!

这是矫枉过正吗?有没有更简单的方法来达到这种效果?

于 2013-09-24T10:53:47.797 回答