【问题标题】:Using iTextSharp to construct header on multiple pdf pages使用 iTextSharp 在多个 pdf 页面上构造标题
【发布时间】:2015-09-24 16:51:39
【问题描述】:

我正在根据在我的 datagridview 中选择的记录生成 PDF 文件。它将由 3-5 页组成。我创建了一个包含 2 列的表来表示我的标题。第一个单元格左对齐,第二个单元格右对齐。我希望在所有页面上都显示相同的信息。

做了一些谷歌搜索后,我看到了一个 header.WriteSelectedRows() 属性,它应该有助于解决这个问题?一个例子是:

header.WriteSelectedRows(0, -1, doc.PageSize.GetLeft(5), doc.PageSize.GetTop(5), wri.DirectContent);

第二个是:

 header.WriteSelectedRows(0, -1, doc.LeftMargin, doc.PageSize.Height - 36, wri.DirectContent);

但是,两者都导致只有第一页有表格/标题。关于我需要解决的问题有什么想法吗?谢谢!

代码:

 PdfPTable header = new PdfPTable(2);
 header.HorizontalAlignment = Element.ALIGN_LEFT;
 header.TotalWidth = doc.PageSize.Width - 20f;
 header.LockedWidth = true;
 Phrase cell1 = new Phrase(signal.ProformaType);
 Phrase cell2 = new Phrase("text" + Environment.NewLine + "text"
     + Environment.NewLine + signal.Signal);

 PdfPCell c1 = new PdfPCell(cell1);
 c1.Border = iTextSharp.text.Rectangle.NO_BORDER;
 c1.VerticalAlignment = iTextSharp.text.Element.ALIGN_TOP;
 c1.HorizontalAlignment = iTextSharp.text.Element.ALIGN_LEFT;
 header.AddCell(c1);

 PdfPCell c2 = new PdfPCell(cell2);
 c2.Border = iTextSharp.text.Rectangle.NO_BORDER;
 c2.VerticalAlignment = iTextSharp.text.Element.ALIGN_TOP;
 c2.HorizontalAlignment = iTextSharp.text.Element.ALIGN_RIGHT;             
 header.AddCell(c2);
 header.WriteSelectedRows(0, -1, doc.LeftMargin, doc.PageSize.Height - 36, wri.DirectContent);

【问题讨论】:

    标签: c# pdf itextsharp


    【解决方案1】:

    PdfPTable 被添加到第一页只是因为您只是将它添加到第一页。如果您想将它添加到 iText 创建的每个页面,则不应在您现在添加它的位置添加 PdfPTable

    您应该将它添加到页面事件的OnEndPage() 方法中。这在以下问题的答案中得到了解释:

    换句话说,您需要创建自己的PdfPageEvent 接口实现。最好的方法是扩展PdfPageEventHelper 类:

    public class MyPageHeader : PdfPageEventHelper
    {
    
        PdfPTable header = ... // define header table here        
    
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            header.WriteSelectedRows(0, -1, document.Left, document.Top, writer.DirectContent);
        }
    }
    

    要实现这一点,您需要在打开 Document 之前声明此页面事件:

    PdfWriter pdfWriter = PdfWriter.GetInstance(document, pdfFileStream);
    pdfWriter.PageEvent = new MyPageHeader();
    document.Open();  
    

    现在,每次创建新页面时,都会自动添加页眉。

    你可能想在上面的代码中适配document.Leftdocument.Top,因为现在它会在每个页面的右上角添加表格,你可能想使用document.Left + 36和@987654335 @ 或类似的东西。

    另外:确保标题有足够的空间,否则您的标题将与您使用document.Add() 直接添加到Document 的内容重叠。您可以在Document 类的构造函数中更改边距。

    【讨论】:

    • 感谢您的详细回答。不过,我有一两个问题。那我会定义我的表两次吗?一次在课堂上,一次在 UI 中?我假设我仍在以我的主要形式添加表格和属性。但是我的表是在课堂上声明的。我很困惑。
    • 当您说您将在 UI 中定义表格时,我不确定您的意思:什么是 UI?在我的示例中,我只定义了一次表:在MyPageHeader 类中。我看不出您需要在其他地方定义 PdfPTable 的任何理由,但话又说回来:我不知道您在编写 UI 时是什么意思。 iText(Sharp) 是一个没有用户界面的库。当你在 iText(Sharp) 的上下文中谈论 UI 时,我会感到困惑。
    • 我对“UI”说错了。我的意思是表单代码和类代码。所以我把我的 Header 表和属性放在 OnEndPage() 的类中。它看起来不错(除了您警告的格式/对齐问题)。我最近才开始学习如何生成 pdf。谢谢!
    • 如果您将header 的创建放在OnEndPage() 方法中,那么您每次完成一个页面时都会使用CPU 创建PdfPTable。最好只创建一次header,例如在页面事件的构造函数中。
    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多