我正在根据我的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);
答案 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.Left
和document.Top
,因为现在,它会将表格添加到每个页面的右上角,您可能希望使用{{ 1}}和document.Left + 36
或类似的东西。
另外:确保标题有足够的空间,否则您的标题将与您使用document.Top - 5
直接添加到Document
的内容重叠。您可以更改document.Add()
类的构造函数中的边距。