我计划使用iTextsharp创建发票,在我的发票内部,它由3部分组成
到目前为止,我使用Pdfptable + splitlate
完成了gridview部分 PdfPTable table = new PdfPTable(gv.Columns.Count);
table.AddCell(new PdfPCell(new Phrase(cellText, fontH1)));
...
...
//create PDF document
Document pdfDoc = new Document(PageSize.A4, -30, -30, 15f, 15f);
PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
pdfDoc.Add(table);
pdfDoc.Close();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;" + "filename=GridViewExport.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);
Response.End();
但我不知道如何在每个页面上插入表格。我计划使用html表,因为它需要控制很多东西,比如不同的供应商,地址,显示/隐藏或取消的图像。请帮忙。
答案 0 :(得分:1)
之前已经提出了您的问题。请参阅官方文档中的How to add HTML headers and footers to a page?,或者在StackOverflow上查看How to add HTML headers and footers to a page?。
Roman Sidorov的回答是错误的,因为Roman假定您从代码中触发NewPage()
。这并不总是正确的。您将表添加到Document
,该表跨多个页面。这意味着iText会在内部触发NewPage()
功能。
您可以使用页面事件向每个创建的页面添加内容。在OnEndPage()
操作执行之前触发NewPage()
事件。这是当您向当前页面添加额外内容时。执行OnStartPage()
操作后立即触发NewPage()
事件。禁止在OnStartPage()
事件中添加内容。见iTextSharp - Header and Footer for all pages
这是Java中页面事件实现的一个示例:
public class HeaderFooter extends PdfPageEventHelper {
protected ElementList header;
protected ElementList footer;
public HeaderFooter() throws IOException {
header = XMLWorkerHelper.parseToElementList(HEADER, null);
footer = XMLWorkerHelper.parseToElementList(FOOTER, null);
}
@Override
public void onEndPage(PdfWriter writer, Document document) {
try {
ColumnText ct = new ColumnText(writer.getDirectContent());
ct.setSimpleColumn(new Rectangle(36, 832, 559, 810));
for (Element e : header) {
ct.addElement(e);
}
ct.go();
ct.setSimpleColumn(new Rectangle(36, 10, 559, 32));
for (Element e : footer) {
ct.addElement(e);
}
ct.go();
} catch (DocumentException de) {
throw new ExceptionConverter(de);
}
}
}
您可以轻松将其移植到C#。我用这个答案是因为它是文字问题的字面答案。但是:为什么要在HTML中定义标题(或页脚)。这没有意义,是吗?
为什么不创建PdfPTable
并将其添加到页面事件中的每个页面。问题的答案中解释了这一点How to add a table as a header?官方文档的page events部分还有许多其他示例。