2011-03-03 158 views
2

嗨我正在尝试在使用了压模之后向pdf中添加表格。iTextSharp在使用PDFStamper之后将表格附加到内存流中的文档

// CREATE MEMORY STRING 
    MemoryStream ms = new MemoryStream(); 

    string formFile = Server.MapPath("testImg.pdf");  

    PdfReader reader = new PdfReader(formFile); 
    PdfStamper outStamper = new PdfStamper(reader, ms); 
    AcroFields fields = outStamper.AcroFields; 

    // UPDATE THE FORM FIELDS 
    fields.SetField("Text1", "John Smith"); 
    fields.SetField("Text2", "1234567890"); 
    fields.SetField("Text3", "1234567890"); 

    //ADD LOGO 
    iTextSharp.text.Image headerlogo = iTextSharp.text.Image.GetInstance(Server.MapPath("logo.jpg")); 
    headerlogo.ScaleToFit(140, 399); 
    headerlogo.Alignment = iTextSharp.text.Image.UNDERLYING; 
    headerlogo.SetAbsolutePosition(200, 500); 

    int pageCount = reader.NumberOfPages; 
    PdfContentByte body = outStamper.GetOverContent(pageCount); 

    body.AddImage(headerlogo);  

    outStamper.Close(); 

    Response.ContentType = "application/pdf"; 
    Response.AddHeader("content-disposition", "attachment;filename=test"); 
    Response.Buffer = true; 
    Response.Clear(); 
    Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); 
    Response.OutputStream.Flush(); 
    Response.End(); 

我希望能够附加与表的文件。

 PdfPTable table = new PdfPTable(3); 
     PdfPCell cell = new PdfPCell(new Phrase("Header spanning 3 columns")); 
     cell.Colspan = 3; 
     cell.BorderWidth = 5; 
     cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right 
     table.AddCell(cell); 
     table.AddCell("Col 1 Row 1"); 
     table.AddCell("Col 2 Row 1"); 
     table.AddCell("Col 3 Row 1"); 
     table.AddCell("Col 1 Row 2"); 
     table.AddCell("Col 2 Row 2"); 
     table.AddCell("Col 3 Row 2"); 
     document.Add(table); 

我在定义要添加表的文档时遇到问题。请有人建议我如何将表添加到内存流中的PDF中。

任何帮助将不胜感激。

亚历

回答

1

不知道你有两件一起工作,但这里是如何我已经做到了我的申请。

基本上我保持加盖结构化内容,然后合并结果成一个大的PDF分开。你可以用table.WriteSelectedRows(这需要PdfContentByte作为它的参数之一)尝试并且一起完成所有的工作,但是我必须花费在手动布局上的时间往往超过将它全部在一个工作中完成的好处步骤(除了它成为一个巨大的方法,这是很难维持/重用的事实)

为了澄清&测试目的,我用的FileStream但当然,细跟的MemoryStream相同的作品和重用流,你应该结束在开发代码中创建一个单一的函数。

这里是我的测试应用程序,我用来确认代码并运行您的方案:从检验.pdf

  1. 创建Test2.pdf(加盖内容原始来源的 ):

    步骤(我们的原始源)

  2. 创建Test3.pdf(含有我们所有的内容在端部要追加)
  3. 打开Test2.pdf & Test3.pdf和它们合并到Test4.pd赛决赛流

注:我没有使用图像冲压代码,你可能不得不在首节Document调整using如果PdfStamper关闭底层Document以及(如果它的顶部确实不记得我的头,但它扔在情况下,你需要调整using声明一个有用的除外)

private static void Main(string[] args) 
    { 
     using (FileStream ms = new FileStream("C:\\Test2.pdf", FileMode.Create)) 
     using (FileStream formFile = new FileStream("C:\\Test.pdf", FileMode.Open)) 
     { 
      PdfReader reader = new PdfReader(formFile); 
      using (Document document = new Document(reader.GetPageSizeWithRotation(1))) 
      { 
       //PdfStamper outStamper = new PdfStamper(reader, ms); 
       //PdfContentByte body = outStamper.GetOverContent(reader.NumberOfPages); 

       //document.Open(); //Open document to work with 

       //AcroFields fields = outStamper.AcroFields; 

       //// UPDATE THE FORM FIELDS 
       //fields.SetField("Text1", "John Smith"); 
       //fields.SetField("Text2", "1234567890"); 
       //fields.SetField("Text3", "1234567890"); 

       ////ADD LOGO 
       //iTextSharp.text.Image headerlogo = iTextSharp.text.Image.GetInstance(Server.MapPath("logo.jpg")); 
       //headerlogo.ScaleToFit(140, 399); 
       //headerlogo.Alignment = iTextSharp.text.Image.UNDERLYING; 
       //headerlogo.SetAbsolutePosition(200, 500); 

       //body.AddImage(headerlogo); 

       //outStamper.Close(); 
      } 
     } 

     using (FileStream ms = new FileStream("C:\\Test3.pdf", FileMode.Create)) 
     using (FileStream formFile = new FileStream("C:\\Test2.pdf", FileMode.Open)) 
     { 
      PdfReader reader = new PdfReader(formFile); 
      using (Document document = new Document(reader.GetPageSizeWithRotation(1))) 
      { 
       PdfWriter pdfWriter = PdfWriter.GetInstance(document, ms); 
       document.Open(); 

       PdfPTable table = new PdfPTable(3); 
       PdfPCell cell = new PdfPCell(new Phrase("Header spanning 3 columns")) { Colspan = 3, BorderWidth = 5, HorizontalAlignment = 1 }; 
       table.AddCell(cell); 
       table.AddCell("Col 1 Row 1"); 
       table.AddCell("Col 2 Row 1"); 
       table.AddCell("Col 3 Row 1"); 
       table.AddCell("Col 1 Row 2"); 
       table.AddCell("Col 2 Row 2"); 
       table.AddCell("Col 3 Row 2"); 

       table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table 
       document.Add(table); 
      } 
     } 

     using (FileStream ms = new FileStream("C:\\Test4.pdf", FileMode.Create)) 
     using (FileStream stampedfile = new FileStream("C:\\Test2.pdf", FileMode.Open)) 
     using (FileStream appendfile = new FileStream("C:\\Test3.pdf", FileMode.Open)) 
     { 
      PdfReader stampedContentReader = new PdfReader(stampedfile); 
      PdfReader appendContentReader = new PdfReader(appendfile); 

      using (Document document = new Document(stampedContentReader.GetPageSizeWithRotation(1))) 
      { 
       PdfCopy pdfCopy = new PdfCopy(document, ms); 

       document.Open(); 

       for (int i = 1; i <= stampedContentReader.NumberOfPages; i++) 
        pdfCopy.AddPage(pdfCopy.GetImportedPage(stampedContentReader, i)); 

       for (int i = 1; i <= appendContentReader.NumberOfPages; i++) 
        pdfCopy.AddPage(pdfCopy.GetImportedPage(appendContentReader, i)); 
      } 
     } 
    } 

希望这有助于。

+1

您实际上可以跳过“将加盖的PDF保存到中间文件”阶段。 1:在PDF中创建表格。 2:打开该PDF并将你的表页吸入到“PdfImportedPage”中。 3:在进行其他更改时将其印成原始PDF。 – 2011-03-08 19:07:30

+0

好主意。事实上,我应该做同样的事情,但当时没有发生在我身上。 +1 – Maverik 2011-03-09 09:40:41

相关问题