使用iTExtsharp将表添加到现有PDF中

时间:2013-02-24 13:30:23

标签: c# asp.net pdf pdf-generation itextsharp

我有一个PDF,因为有一个表是动态的表,我想在我现有的PDF中动态地在下面添加另一个表。

有没有办法在现有PDF中添加现有表格(不在文档末尾)的特定位置,然后我想添加我的表格。

我该如何添加?请建议我一些好方法。

如下图所示。

enter image description here

谢谢,

2 个答案:

答案 0 :(得分:3)

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();

       }
 }

数据表示例:

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;
    }

答案 1 :(得分:3)

到目前为止,最简单的方法是在所需位置创建一个包含所需表格的新PDF,然后将其标记到现有PDF上。这可以使用(例如)PdfStamper类在代码中完成,但也有独立的工具,如pdftk和许多其他工具。不要将此视为“编辑”PDF,将其视为在原始文件之上删除新内容。

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

@ mkl的原始问题解决了真正有趣且可能很困难的部分 - 如何确定新表的正确位置。如果你能想出一个几何规则,那么你就处于良好的状态。如果这涉及原始文件的任何解析,您应该意识到某些事情(看似)很简单,因为确定现有表中的行数有时会非常困难。很有可能,内容流中隐藏着一个html <table>标记。有一个实际PDF的例子将非常有帮助。 PDF的图像不是一回事。

为了向您提供一些背景信息,解析PDF的布局很容易,这就是PDF阅读器的功能。解析PDF的内容是完全不同的,也是更难的。举个例子,您发布的PDF图像可以从上到下绘制,或者首先绘制页眉和页脚,然后是所有粗体面部项,然后是平面文本。仅仅因为物理布局中两个事物彼此相邻并不意味着它们在文件结构,对象树或内容流中彼此相邻。它是矢量图形而不是文本文件或位图。 PDF不是可编辑的,除非创建它的软件专门提供有关如何编辑内容的线索。有很多东西看起来像应该很容易,但是一旦你理解了PDF的构建方式,就很难理解它。我不是说这会劝阻你,只是为了让你欣赏任务的重要性。如果您可以追溯创建此PDF的源文档,我保证您将获得更多成功而不会感到沮丧。