使用 iTextSharp 拷贝 PDF 表单
本文关键字:表单 PDF 拷贝 iTextSharp 使用 | 更新日期: 2023-09-27 17:56:16
我成功地使用iTextSharp阅读带有表单的PDF,填写表单上的字段,然后将其写回给客户。 我现在得到了一个要求,如果某些页面都是空白的,则应删除它们(出于问题的目的,我可以检查布尔变量以了解我是否需要删除页面。 我的理解是在iTextSharp中执行此操作,您实际上是将PDF从一个复制到另一个,并省略要删除的页面。
我有这个工作,但我丢失了复制的PDF上的表格;即没有写出任何值,在尝试复制PDF以"删除"某些页面之前,值被正确写入。
如何在复制表单时保留已创建的 PDF 表单,或者是否有更好的方法来删除页面? 这是我到目前为止的代码,它将PDF写入文件但不填写表单(大概是因为复制时表单未保留):
string file = "output.pdf";
PdfReader reader = new PdfReader("template.pdf");
Document doc = new Document();
using (MemoryStream ms = new MemoryStream())
{
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
doc.Open();
doc.AddDocListener(writer);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
bool skipPage = this.SkipPage; // some nifty logic here
if (skipPage)
continue;
doc.SetPageSize(reader.GetPageSize(i));
doc.NewPage();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage page = writer.GetImportedPage(reader, i);
int rotation = reader.GetPageRotation(i);
if (rotation == 90 || rotation == 270)
cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(i).Height);
else
cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0);
}
reader.Close();
doc.Close();
using (FileStream fs = new FileStream(file, FileMode.Create))
{
// this is the part stumping me; I need to use a PdfStamper to write
// out some values to fields on the form AFTER the pages are removed.
// This works, but there doesn't seem to be a form on the copied page...
this.stamper = new PdfStamper(new PdfReader(ms.ToArray()), fs);
// write out fields here...
stamper.FormFlattening = true;
stamper.SetFullCompression();
stamper.Close();
}
}
没
关系,我似乎已经能够通过在PDF阅读器上使用SelectPages
方法弄清楚它,并且可以避免对文件进行实际复制。