使用iTextSharp将表格添加到现有的PDF文件中。

7
我有一个PDF文件,其中有一个动态表格,我想在现有的PDF中动态地添加另一个表格到该表格下方。
有没有办法在现有表格完成后的特定位置添加表格(该位置不在文档末尾)?
如何添加?请建议一些好的方法。
如下图所示。
谢谢。

你提到了iTextSharp。该库允许使用PdfStamper类来操作现有的pdf文件。更有趣的问题是如何识别现有PDF中添加新数据的位置。 - mkl
嗨Mkl,感谢您的评论。我该如何识别现有PDF中的位置,以便我可以添加表格。您能给出任何示例吗? - Tushar Maru
1
你能给出任何例子吗?不行,因为在许多情况下(并非所有情况),你正在询问一些不可能的事情。这就是为什么mkl提出如何识别现有PDF中的位置更有趣的问题。如果你无法回答那个问题(因为你可能在问一些不可能的事情),那么你实际上的问题是无关紧要的。没有人可以为你回答那个问题,因为没有人知道现有的PDF长什么样子。 - Bruno Lowagie
嗨,布鲁诺,我已经添加了一个示例pdf图像。正如您在上面的图像中所看到的那样,“您的订单中的物品”表是动态的,现在您可以在其中看到四个项目,但在不同的pdf中可能会有所不同。我想在现有pdf的该表格下方添加一个表格。希望这可以帮助您理解。谢谢。 - Tushar Maru
在你的情况下,这似乎是可能的。如果Thank you for your business...这行始终是您的表格之后的第一段文本,那么可以使用它和Items in Your Order来查找位置。我只是想知道什么样的表格适合这个小距离。我希望您不会也希望将*Thank you...*这行及以下内容向下移动,对吗?虽然不是不可能,但这将使这成为一个非常大的项目。 - mkl
嗨Mkl,感谢您的回复。那个订单表格和“谢谢...”之间会有更多的空间,但是在这里我无法展示给您,我只是切掉了那个空间,所以您看不到。 - Tushar Maru
2个回答

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的构建方式,就会明白它为什么很难。我并不是说这样会让您灰心丧气,只是让您意识到任务的重要性。如果您可以追踪创建此PDF的源文档,我保证您将更轻松地成功。

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

5
您的代码创建了一个新的 PDF,而原始问题要求添加到现有的 PDF 中。 - mkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接