如何在生成的PDF页面上标记文本?

时间:2014-03-11 20:36:12

标签: pdf-generation itextsharp

在您的帮助下,我设法获得了一个非常好的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);
      }

1 个答案:

答案 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方法检索字段的位置。