我目前正在尝试迭代现有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);
}
}
是否有人可能对可能出现的问题有所了解?
答案 0 :(得分:4)
按照@ BrunoLowagie的建议,我选择了以前的选项,从导入的页面创建PageStamp
,并在迭代导入的PDF集合时更改其内容。
您可以继续使用
PdfCopy
并使用PageStamp
添加文字 每个添加的页面。或者您可以通过两次创建PDF: 首先使用PdfCopy
在内存中创建连接的PDF;然后添加 第二遍中有PdfStamper
的页脚。
我以前的attgpts没有奏效的原因是因为,
时定义页面事件
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);
}