我目前正在尝试遍历现有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
页脚。
我以前的助手没有工作的原因是,
PdfPageEventHelper
和PdfCopy
是互斥的。你不能
使用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);
}