2011-03-03 372 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

相關問題