2011-05-10 79 views
2

我成功地使用iTextSharp以PDF形式读取表单,填写表单中的字段,并将其写回客户端。我现在已经得到了一些要求,如果某些页面全部是空白的,就应该删除它(为了这个问题的目的,我可以检查一个布尔变量来知道我是否需要删除这些页面,我的理解是这样做在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(); 
     } 
    } 

回答

1

没关系,我似乎已经能够通过使用SelectPages方法上的PDF阅读器来弄明白,我能避免做一个实际的复制的文件。

+0

打我吧... +1 – 2011-05-10 19:34:22

+3

为什么不发布正确的代码示例而不是提示。 – 2013-08-14 19:27:51

+0

是的,一个正确的代码示例将是一件好事! – CodeIt 2017-03-23 17:33:59