2011-03-03 77 views
2

こんにちは私はスタンパーを使用した後でpdfにテーブルを追加しようとしています。PDFStamperを使用した後、iTextSharpをメモリストリーム内のドキュメントに追加する

// 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

ないあなたは2枚一緒に働いたが、ここで私は自分のアプリケーションのためにそれをやった方法である持っているか確認してください。

基本的には、スタンプを構造化されたコンテンツの追加とは別に保存し、結果を1つの大きなpdfにマージします。 table.WriteSelectedRows(これは引数の1つとしてPdfContentByteが必要です)を使用して1つの大きなステップですべてを試してみることもできますが、手動レイアウトと一緒に過ごす時間は、すべて1つで済むという利点を上回る傾向があります(私はそれを維持するのが難しい一つの巨大なメソッドになるという事実以外に/再利用)

テスト目的、私はFileStreamを使用しましたが、もちろん、開発コードに1つのモノリシック関数を作成します。ここで

は、私は、コードを確認し、あなたのシナリオを実行するために使用私のテストアプリケーションです:

ステップ:

  1. test.pdfという からTest2.pdf(刻印内容オリジナルソースの )を作成します。 (当社オリジナルソース)
  2. Test3.pdfを
  3. オープンTest2.pdf & Test3.pdf(すべての私たちの最後に追加されるコンテンツを含む)とTest4.pdにマージ作成F最終ストリーム

注:(私は、コードをスタンプ画像を使用していないとPdfStamperは同様に基礎となるDocumentを閉じた場合は、最初のセクションでDocumentusingを調整する必要があるかもしれそれは上からない場合は思い出すことができません私の頭が、それはあなたが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にスタンプして、他の変更を加えます。 –

+0

良いアイデア。確かに私は同じことをしていたはずでしたが、当時私には起こりませんでした。 +1 – Maverik

関連する問題