将自定义页面事件分配给PdfCopy时抛出异常

时间:2017-08-01 11:41:17

标签: c# exception itext

我目前正在尝试迭代现有PDF并使用OnPageEnd事件在每个页面上标记一些页脚文本,详见iText文档Chapter 5: Table, cell, and page events

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

  

"由于对象的当前状态,操作无效"在   iTextSharp.text.pdf.PdfCopy.set_PageEvent(IPdfPageEvent value)

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

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);
    }
}

是否有人可能对可能出现的问题有所了解?

1 个答案:

答案 0 :(得分:4)

按照@ BrunoLowagie的建议,我选择了以前的选项,从导入的页面创建PageStamp,并在迭代导入的PDF集合时更改其内容。

  

您可以继续使用PdfCopy并使用PageStamp添加文字   每个添加的页面。或者您可以通过两次创建PDF:   首先使用PdfCopy在内存中创建连接的PDF;然后添加   第二遍中有PdfStamper的页脚。

我以前的attgpts没有奏效的原因是因为,

  

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);
}