2013-02-24 29 views
7

私は1つのテーブルが動的であるという点で1つのPDFを持っており、既存のPDFに動的にそのテーブルに別のテーブルを追加します。iTExtsharpを使用して既存のPDFにテーブルを追加する

既存のPDFの特定の場所にテーブルを追加する方法はありますか(ドキュメントの最後ではありません)が完了したら、テーブルを追加します。

どうすれば追加できますか?私には良い方法を教えてください。

下記の画像をご覧ください。

enter image description here

おかげで、DataTableの

+0

あなたはiTextSharpに言及しています。このライブラリは、PdfStamperクラスを使用して既存のpdfsを操作することを可能にします。より興味深いのは、新しいデータを追加する既存のPDFの位置をどのように認識するかという疑問です。 – mkl

+0

あなたのコメントのためにこんにちはMklありがとう。どのように私は既存のPDFの位置を認識できるので、私はテーブルを追加することができます。どんな例を挙げてもいいですか? –

+1

例はありますか?いいえ、多くの場合(すべてではない)不可能なことを求めているからです。そのため、mklが既存のPDFの位置を認識する方法についての質問を書いたのは、より興味深い質問です。その質問に答えることができない場合は(おそらく不可能なことを尋ねているので)実際の質問は無関係です。誰もあなたのためにその質問に答えることはできません。誰も既存のPDFがどのように見えるか知っているからです。 –

答えて

4
using iTextSharp.text; 
using iTextSharp.text.pdf; 

/// Function which will create pdf document and save in the server folder 

private void ExportDataToPDFTable() 
    { 
     Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35); 
     try 
      { 
      string pdfFilePath = Server.MapPath(".") + "/pdf/myPdf.pdf"; 
      //Create Document class object and set its size to letter and give space left, right, Top, Bottom Margin 
      PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(pdfFilePath, FileMode.Create)); 

      doc.Open();//Open Document to write 

      Font font8 = FontFactory.GetFont("ARIAL", 7); 

      //Write some content 
      Paragraph paragraph = new Paragraph("Using ITextsharp I am going to show how to create simple table in PDF document "); 

      DataTable dt = GetDataTable(); 

      if (dt != null) 
       { 
       //Craete instance of the pdf table and set the number of column in that table 
       PdfPTable PdfTable = new PdfPTable(dt.Columns.Count); 
       PdfPCell PdfPCell = null; 


       //Add Header of the pdf table 
       PdfPCell = new PdfPCell(new Phrase(new Chunk("ID", font8))); 
       PdfTable.AddCell(PdfPCell); 

       PdfPCell = new PdfPCell(new Phrase(new Chunk("Name", font8))); 
       PdfTable.AddCell(PdfPCell); 


       //How add the data from datatable to pdf table 
       for (int rows = 0; rows < dt.Rows.Count; rows++) 
        { 
        for (int column = 0; column < dt.Columns.Count; column++) 
         { 
          PdfPCell = new PdfPCell(new Phrase(new Chunk(dt.Rows[rows][column].ToString(), font8))); 
          PdfTable.AddCell(PdfPCell); 
          } 
         } 

         PdfTable.SpacingBefore = 15f; // Give some space after the text or it may overlap the table 

         doc.Add(paragraph);// add paragraph to the document 
         doc.Add(PdfTable); // add pdf table to the document 

        } 

       } 
       catch (DocumentException docEx) 
       { 
        //handle pdf document exception if any 
       } 
       catch (IOException ioEx) 
       { 
        // handle IO exception 
       } 
       catch (Exception ex) 
       { 
        // ahndle other exception if occurs 
       } 
       finally 
       { 
        //Close document and writer 
        doc.Close(); 

     } 
} 

サンプル:これを行う最も簡単な方法は、所望の位置に目的のテーブルを使用して新しいPDFを作成することです

private DataTable GetDataTable() 
    { 
     // Create an object of DataTable class 
     DataTable dataTable = new DataTable("MyDataTable");//Create ID DataColumn 
     DataColumn dataColumn_ID = new DataColumn("ID", typeof(Int32)); 
     dataTable.Columns.Add(dataColumn_ID);//Create another DataColumn Name 
     DataColumn dataColumn_Name = new DataColumn("Name", typeof(string)); 
     dataTable.Columns.Add(dataColumn_Name); 
     //Now Add some row to newly created dataTable 
     DataRow dataRow;for (int i = 0; i < 5; i++) 
     { 
      dataRow = dataTable.NewRow(); 
      // Important you have create New row 
      dataRow["ID"] = i;dataRow["Name"] = "Some Text " + i.ToString(); 
      dataTable.Rows.Add(dataRow); 
     } 
     dataTable.AcceptChanges(); 
     return dataTable; 
    } 
+4

あなたのコードは新しいPDFを作成しますが、元の質問は既存の質問に既存の質問を追加するよう求めます。 – mkl

+0

はい@mklこれはIRELEVENT ANSWER ..です! –

2

断然それを既存のPDFにスタンプします。これはコード内で(例えば)PdfStamperクラスを使用して行うことができますが、pdftkなどのスタンドアロンツールもあります。これをPDFの「編集」とはみなさず、元のものの上に新しいものを落とすと考えてください。

pdftk original.pdf stamp newtable.pdf output combined.pdf 

本当に面白いと潜在的に難しい部分は、@のMKLの元の質問で取り上げた - どのように新しいテーブルの正確な位置を決定します。あなたが幾何学的なルールを考え出すことができれば、あなたは良い形になっています。これに元のファイルの解析が含まれている場合は、既存のテーブルの行数を決定する(一見)簡単なことが時には非常に困難になることがあることに注意してください。おそらく、HTMLの<table>タグがコンテンツストリームに埋め込まれているように見えます。実際のPDFの例があれば、非常に役に立ちます。 PDFのイメージは同じものではありません。

のレイアウトを解析すると、のPDFが簡単に読み取れます。これはPDFリーダーが行うことです。 PDFののコンテンツを解析することは、まったく異なるものであり、はるかに困難です。たとえば、投稿したPDF画像を上から下に描画したり、ヘッダーとフッターを最初に描画したり、すべての太字の項目を入力したり、プレーンテキストを続けたりすることができます。物理レイアウト内で2つのものが隣り合っているからといって、それらがファイル構造、オブジェクトツリー、またはコンテンツストリームで互いに隣り合っていることを意味するわけではありません。それは、テキストファイルやビットマップではなく、ベクトルグラフィックです。 PDFは、それを作成するソフトウェアが、コンテンツの編集方法の手がかりを提供しない限り、編集可能に設計されていません。 のようなものがたくさんあります。は簡単ですが、PDFがどのように構築されているか理解すれば、それは難しいことになります。私はあなたの仕事の大きさに感謝するために、これをあなたを落胆させるために言っているわけではありません。このPDFが作成されたソース文書をトレースすることができれば、より多くの成功を収めることができます。

関連する問題