使用iTextSharp在多个pdf页面上构建标题

时间:2015-09-24 16:51:40

标签: c# pdf itextsharp

我正在根据我的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);

1 个答案:

答案 0 :(得分: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,因为现在,它会将表格添加到每个页面的右上角,您可能希望使用{{ 1}}和document.Left + 36或类似的东西。

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