我目前正在尝试遍历现有PDF,并使用iText文档Chapter 5: Table, cell, and page events中详细介绍的OnPageEnd事件在每个页面上添加一些页脚文本。

当我将新的自定义事件类分配给PdfCopy实例时,我收到此异常:


  位于“由于对象的当前状态,操作无效”
  iTextSharp.text.pdf.PdfCopy.set_PageEvent(IPdfPageEvent值)


以下是我为执行该操作而编写的代码:

PdfReader pdf = new PdfReader(file.Value);
int pages = pdf.NumberOfPages;

pdf.SelectPages(string.Format("0 - {0}", pages));
using (MemoryStream stream = new MemoryStream())
{
    Document doc = new Document();
    PdfCopy copy = new PdfCopy(doc, stream) { PageEvent = new PdfFooterStamp() };

    doc.Open();
    for (int x = 0, y = pages; x < y; x++)
    {
        copy.AddPage(copy.GetImportedPage(pdf, x + 1));
    }

    doc.Close();
    copy.Flush();
    copy.Close();

    collection[file.Key] = stream.ToArray();
}


这是我的自定义事件类定义:

public class PdfFooterStamp : PdfPageEventHelper
{
    public override void OnEndPage(PdfWriter writer, Document document)
    {
        Rectangle rect = writer.PageSize;
        ColumnText.ShowTextAligned(writer.DirectContent,
            Element.ALIGN_CENTER, new Phrase("PERSONALISED DOCUMENT"),
                (rect.Left + rect.Right) / 2, rect.Bottom - 18, 0);
        base.OnEndPage(writer, document);
    }
}


是否有人可能会出什么问题?

最佳答案

遵循@BrunoLowagie的建议,我选择了前一种方法,即从导入的页面创建PageStamp,并在遍历导入的PDF集合时更改其内容。


  您可以继续使用PdfCopy并使用PageStamp将文本添加到
  每个添加的页面。或者,您可以通过两步创建PDF:
  首先使用PdfCopy在内存中创建串联的PDF;然后添加
  在第二遍中使用PdfStamper页脚。


我以前的助手没有工作的原因是,


  PdfPageEventHelperPdfCopy是互斥的。你不能
  使用PdfCopy定义页面事件-@BrunoLowagie


以下代码是首选解决方案的示例,并且测试证明了它可以按预期工作。

Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, stream);
doc.Open();
for (int x = 0, y = pages; x < y; x++)
{
    PdfImportedPage import = copy.GetImportedPage(pdf, x + 1);
    PageStamp stamp = copy.CreatePageStamp(import);
    Rectangle rect = stamp.GetUnderContent().PdfWriter.PageSize;
    ColumnText.ShowTextAligned(stamp.GetUnderContent(),
        Element.ALIGN_CENTER, new Phrase(User.Identity.Name, font),
            (rect.Bottom + rect.Top) / 2, rect.Bottom + 8, 0);

    stamp.AlterContents();
    copy.AddPage(import);
}

10-04 17:22