【问题标题】:iTextSharp does not render header/footer when using element generated by XmlWorkerHelper使用 XmlWorkerHelper 生成的元素时,iTextSharp 不呈现页眉/页脚
【发布时间】:2013-12-03 00:19:32
【问题描述】:

我正在尝试向其内容由 XMLWorkerHelper 生成的 PDF 添加页眉/页脚。不确定这是否是位置问题,但我看不到页眉/页脚。

这是一个 ASP.NET MVC 应用程序,使用来自 Nuget 的 iTextSharp 和 XmlWorker 包 5.4.4 版。

生成PDF的代码如下:

private byte[] ParseXmlToPdf(string html)
{
     XhtmlToListHelper xhtmlHelper = new XhtmlToListHelper();
     Document document = new Document(PageSize.A4, 30, 30, 90, 90);
     MemoryStream msOutput = new MemoryStream();
     PdfWriter writer = PdfWriter.GetInstance(document, msOutput);
     writer.PageEvent = new TextSharpPageEventHelper();
     document.Open();
     var htmlContext = new HtmlPipelineContext(null);
     htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
     var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
     cssResolver.AddCssFile(HttpContext.Server.MapPath("~/Content/themes/mytheme.css"), true);
     var pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));

     var worker = new XMLWorker(pipeline, true);
     var parser = new XMLParser();
     parser.AddListener(worker);
     using (TextReader sr = new StringReader(html)) 
     {
         parser.Parse(sr);
     }
     //string text = "Some Random Text";
     //for (int k = 0; k < 8; ++k)
     //{
     //    text += " " + text;
     //    Paragraph p = new Paragraph(text);
     //    p.SpacingBefore = 8f;
     //    document.Add(p);
     //}
     worker.Close();
     document.Close();
     return msOutput.ToArray();
    }

现在不用这三行了

     using (TextReader sr = new StringReader(html)) 
     {
         parser.Parse(sr);
     }

如果我将它们注释掉并取消注释代码以添加随机文本段落(在上面的示例中注释),我会看到页眉/页脚以及随机文本。

我做错了什么?

EventHandler如下:

    public class TextSharpPageEventHelper : PdfPageEventHelper
    {
        public Image ImageHeader { get; set; }

        public override void OnEndPage(PdfWriter writer, Document document)
        {
            float cellHeight = document.TopMargin;
            Rectangle page = document.PageSize;
            PdfPTable head = new PdfPTable(2);
            head.TotalWidth = page.Width;
            PdfPCell c = new PdfPCell(ImageHeader, true);
            c.HorizontalAlignment = Element.ALIGN_RIGHT;
            c.FixedHeight = cellHeight;
            c.Border = PdfPCell.NO_BORDER;
            head.AddCell(c);
            c = new PdfPCell(new Phrase(
              DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + " GMT",
              new Font(Font.FontFamily.COURIER, 8)
            ));
            c.Border = PdfPCell.TOP_BORDER | PdfPCell.RIGHT_BORDER |   PdfPCell.BOTTOM_BORDER | PdfPCell.LEFT_BORDER;
            c.VerticalAlignment = Element.ALIGN_BOTTOM;
            c.FixedHeight = cellHeight;
            head.AddCell(c);
            head.WriteSelectedRows(
              0, -1,  // first/last row; -1 flags all write all rows
              0,      // left offset
                // ** bottom** yPos of the table
              page.Height - cellHeight + head.TotalHeight,
              writer.DirectContent
            );
        }
    }

【问题讨论】:

    标签: itextsharp


    【解决方案1】:

    为 Windows 8.1 失去了两个多小时的生命感到愤怒和愚蠢!显然,内置的 PDF 阅读器应用程序不足以显示“页眉”/“页脚”。安装福昕阅读器并打开输出,标题显示正常!

    我想我也应该尝试使用 Adob​​e Reader!!!

    更新: 我尝试在 Adob​​e Acrobat 阅读器中打开生成的 PDF,最后看到了一些错误。这让我更仔细地查看了发送给 XMLWorkerHelper 的 HTML。 HTML 的结构在&lt;table&gt;s 内有&lt;div&gt;s,这会导致生成的PDF 出错。我清理了 HTML 以确保 &lt;table&gt; 在 &lt;table&gt; 内,然后 PDF 在所有读者中都干净利落。

    长话短说,上面的代码没问题,但如果您要测试 PDF 的正确性,请至少使用 Adob​​e Acrobat Reader。其他阅读器的行为无法预测,例如未报告错误或未正确呈现 PDF。

    【讨论】:

    • 这听起来很奇怪,我认为您可能有更深层次的问题。就 PDF 而言,没有“页眉”或“页脚”之类的东西,只有恰好位于页面顶部或底部附近的文本。
    • 嗨,克里斯,确实存在多个问题,我提供的 HTML 在表格结构中的 div 内有一个凌乱的表格。 Adobe 和 Foxit 都以“靠近顶部的文本”打开它,但 Adob​​e 一直抛出格式错误,直到我清理了 HTML 格式。长话短说,iTextSharp 或上面的代码没有问题。 Windows 8 的 PDF 阅读器最容易出错,Foxit 最灵活,Adobe 正确报告错误。
    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 2017-05-25
    • 2015-03-04
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多