0

这个问题,关于使用 itextSharp 创建 pdf

我在该表的第一行中的文档中添加了表,我手动添加了名称,ID 等,并且该表名称和 id 来自数据库现在我的问题是,当页面再次结束时,我想手动添加相同的行,例如名称, ID 和数据将继续来自数据库所以我该怎么办?请帮我解决这些问题..

4

1 回答 1

1

这完全取决于您如何创建文档。您是追加到现有文档,还是从头开始生成新文档?无论哪种方式,您可能最终都会使用PageEvents来完成此操作。OnPageEnd当作者到达新页面的开头时,您可以编写自定义事件来“重写”表头。如果你是从“从头开始”的角度来做这件事,它可能会变得很棘手,但你应该没问题,只要你在期间触发事件你的表创建。如果您要附加到现有文档,最好创建一个包含表格的文件,并在完成表格后将它们合并在一起。无论哪种方式,这都不是一个特别复杂的过程。如果您在 for 或 while 循环中创建表,例如:

for(int i = 0; a < 100; i++)
{
    //OnPageEnd Event that adds the Table Header
    table.addCell(cell)
} 

这样,对于循环的每次迭代,它都会检查是否必须写入新页面。如果没有,它将继续添加单元格。如果是这样,它将插入您的标题行,并继续循环。

这应该很简单。我通常会创建一个包含我的页面事件的类文件,并在需要时调用它们。创建类文件并创建函数后,只需添加用于将当前标题写入事件的代码即可。页面事件似乎比实际更令人生畏,但是一旦您花一点时间阅读一下它们,您就可以省去很多麻烦,并且可以创建更多动态文档。

希望这为您指明了一个好的方向,因为我自己在创建表格和干净地处理分页符方面遇到了困难。

编辑


我将向您展示一种简单的方法,用于创建一个简单的 1 单元格表,但它可以扩展到您需要的任意数量。这是假设您正在为表格文件创建一个单独的文档,然后将它们合并。这实际上不是您问题的一部分,因此除非您要求进一步说明如何解决此问题,否则我会将其省略。

private void appendTable(string inputFile, string outputFile, string id)
{
    Document outputDoc = new Document(PageSize.LETTER, 15, 15, 35, 50);
    PdfReader reader = new PdfReader(inputFile);
    string sql = string.Format("SELECT * FROM table WHERE id='{0}'", id);
    try
    {
        DataTable dt = db.GetDataTable(sql);
        PdfPTable table = new PdfPTable(1);
        iTextSharp.text.Font arial = FontFactory.GetFont("Arial", 8);
        iTextSharp.text.Font arialheader = FontFactory.GetFont("Arial", 12);
        table.WidthPercentage = 95;
        PdfPCell headerCell = new PdfPCell(new Phrase("Cell Header", arialheader));
        headerCell.HorizontalAlignment = 1;
        table.AddCell(headerCell);

        PdfWriter wr = PdfWriter.GetInstance(outputDoc, new FileStream(outputFile, FileMode.Create, FileAccess.ReadWrite));
        foreach(DataRow row in dt.Rows)
        {
            PdfPCell cell = new PdfPCell(new Phrase("Cell Text", arial));
            meterCell.HorizontalAlignment = 1; //Center Aligned
            table.AddCell(meterCell);
        }

        outputDoc.Open();
        wr.PageEvent = new PageEvents.Header();
        wr.PageEvent = new PageEvents.Footer();
        outputDoc.Add(table);
        outputDoc.NewPage();
        outputDoc.Close();
    }

    catch (PdfException ex)
    {
        MessageBox.Show(ex.Message.ToString() + " **** " + ex.StackTrace);
    }
    catch (NpgsqlException ex)
    {
    MessageBox.Show(ex.Message.ToString() + " **** " + ex.StackTrace);
    }
 }
于 2012-08-21T19:45:00.523 回答