在您的帮助下,我设法获得了一个非常好的PDF生成工具。它基于5页模板构建PDF。在第3页和第5页,可能需要添加其他页面并将下一页向下移动。第5页甚至是风景。除了我正在寻找的一些额外功能之外,一切都很完美。
我构建的模板在第五页上有表单字段。因此,我使用以下代码填写该字段:
var pdfReader = new PdfReader(existingFileStream);
var stamper = new PdfStamper(pdfReader, newFileStream);
var form = stamper.AcroFields;
form.SetField("fkClientName", clientName);
该字段填写得很好,但不在其他页面上。这很奇怪,因为我的确称之为:
PdfImportedPage templatePage = stamper.GetImportedPage(pdfReader, 5);
我觉得应该看到第五页上有表单字段。但是,我读到了压模.GetImportedPage没有检索表单字段。如果它是表单字段或文本,我真的不在乎。我只需要在每个生成的附加页面顶部的客户端名称。以下是我的columntext代码构建其他页面的内容:
while (true)
{
ct.SetSimpleColumn(-75, 75, PageSize.A4.Height + 25, PageSize.A4.Width - 200);
if (!ColumnText.HasMoreText(ct.Go()))
break;
pageNum++;
stamper.InsertPage(pageNum, new Rectangle(792f, 612f));
stamper.GetOverContent(pageNum).AddTemplate(templatePage, 0, -1f, 1f, 0, 0, PageSize.A4.Width);
ct.Canvas = stamper.GetOverContent(pageNum);
}
答案 0 :(得分:0)
如果您的公司信纸具有某种背景,并且您想创建一个具有流动文本的文档(一个可以流到下一页的列),它也有一个重复的标题,那么我更希望使用{{ 1}}。
我使用PdfWriter
添加内容(不使用PdfWriter
,只需使用页面大小和边距来定义列),我会添加背景和标题使用页面事件。例如,请参阅我的书中的Stationery示例。
我为ColumnText
创建了一个子类,并且我将您要重复显示的页面加载到名为PdfPageEventHelper
的{{1}}实例中:
PdfImportedPage
您可能还想要使用客户名称初始化page
:
PdfReader reader = new PdfReader(STATIONERY);
page = writer.getImportedPage(reader, 1);
然后你覆盖Phrase
方法,如下所示:
header = new Phrase(customerName);
现在您不必担心onEndPage()
和新页面。每次创建新页面时,都会自动添加背景和标题。
但是,您使用的是public void onEndPage(PdfWriter writer, Document document) {
writer.getDirectContentUnder().addTemplate(page, 0, 0);
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_RIGHT, header, 36, 806, 0);
}
,因为您的原始文档不是公司文具:它是一个5页的文档。如果此文档不包含任何互动元素(您已使用iTextSharp创建了它,那么您知道它是否是平面文档),我就是仍需尝试ColumnText
方法,并在需要新页面时更改事件中的PdfStamper
实例。
如果您想继续使用PdfWriter
,则必须以不同的方式添加标头。例如,使用不同的page
实例,或者,如果它是单行,则使用PdfStamper
。如果您不知道标题的坐标,则可以使用ColumnText
方法检索字段的位置。