如何使用iTextSharp向PDF文档插入表格?

3

我希望在我的现有PDF文档中插入一个表格。

我正在按照一篇关于将图像插入PDF的文章进行操作,但是当我尝试添加表格时,我遇到了空引用异常错误。

以下是我的当前代码:

public static byte[] InsertTable(byte[] pdf, DataTable dt, int pageNum, int x, int y, int columns, int rows, int[] columnWidths, float rowHeight)
{
    using (var inputPDF = new MemoryStream(pdf))
    using (var outputPDF = new MemoryStream())
    {
        var reader = new PdfReader(inputPDF);
        var stamper = new PdfStamper(reader, outputPDF);
        var pdfContentByte = stamper.GetOverContent(pageNum);


        Table t = new Table(columns, rows);
        t.SetWidths(columnWidths);

        foreach (DataRow dr in dt.Rows)
            foreach (object o in dr.ItemArray)
            {
                Cell c = new Cell();
                c.Add(new Chunk(o.ToString()));
                t.AddCell(c);
            }
        pdfContentByte.PdfDocument.Add(t);
        pdfContentByte.PdfDocument.Close();
        return outputPDF.ToArray();
    }
}

空引用异常发生在哪个对象上:pdfContentByte、pdfContentByte.PdfDocument还是table?能否提供异常信息(堆栈跟踪)? - Nimrod
@Nimrod 异常从.Add()调用中冒出。 - Biff MaGriff
在该语句上设置断点,并在调用Add方法之前检查pdfContentByte的PdFDocument是否正常(我想它是正常的,但为了确保安全起见)。 - Maverik
是的,实际对象存在,但是有一个空引用冒出来了。也许我应该更新我的库。 - Biff MaGriff
2个回答

2
尽管代码看起来没问题,但是你的那一行让我有点困惑。
Table t = new Table(columns, rows);

你确定你需要的不是PdfPTable而是普通的Table吗?你的代码中其他部分都在使用PdfPTable,我也没有在iTextSharp中找到普通的Table
巧合的是,我现在正在处理一个类似的问题。
修改后的代码已经清理掉了不再使用的字段。
public static byte[] InsertTable(byte[] buffer, DataTable dt, int columns, float[] columnWidths)
    {
        using (MemoryStream inputPDF = new MemoryStream(buffer))
        using (MemoryStream outputPDF = new MemoryStream())
        {
            PdfReader reader = new PdfReader(inputPDF);
            iTextSharp.text.Document doc = new iTextSharp.text.Document();
            PdfWriter write = PdfWriter.GetInstance(doc, outputPDF);
            doc.Open();

            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                doc.NewPage();
                write.DirectContent.AddTemplate(write.GetImportedPage(reader, i), 1f, 0, 0, 1, 0, 0);
            }

            //adding my table
            PdfPTable t = new PdfPTable(columns);
            t.SetTotalWidth(columnWidths);

            foreach (DataRow dr in dt.Rows)
                foreach (object o in dr.ItemArray)
                {
                    PdfPCell c = new PdfPCell();
                    c.AddElement(new Chunk(o.ToString()));
                    t.AddCell(c);
                }

            doc.NewPage();

            doc.Add(t);
            doc.Close();
            write.Close();
            reader.Close();
            return outputPDF.ToArray();
        }
    }

希望这可以解决您的问题。我接下来的六个小时都在线,并将尝试密切关注此事,直到我回家为止:)


我正在使用的表格位于 iTextSharp.Text.Table 下。 - Biff MaGriff
我猜我们使用的是不同版本。我正在使用iTextSharp dll的5.0.6版本,而在Text(iTextSharp.text)命名空间中没有Table。 - Maverik
哈哈,是的,我正在使用4.1.6版本。我要切换到PdfTable类。等我试完了再告诉你结果。 - Biff MaGriff
谢谢Maverik,我几天后会重新审视这个问题。目前我在外地参与另一个项目。我想要叠加我的表格,所以我把表格构建的代码移到了“newpage”循环中。现在我只需要弄清楚如何精确地定位它。再次感谢你的帮助! - Biff MaGriff

0

好的,我已经更新到5.0.6版本了,并且我成功插入了表格。不过现在所有内容都只显示在第一页。

public static byte[] InsertTable(byte[] pdf, DataTable dt, int pageNum, float x, float y, int columns, int rows, float[] columnWidths, float rowHeight)
{
    using (var inputPDF = new MemoryStream(pdf))
    using (var outputPDF = new MemoryStream())
    {
        //loading existing
        var reader = new PdfReader(inputPDF);
        Document doc = new Document();
        PdfWriter write = PdfWriter.GetInstance(doc, outputPDF);
        doc.Open();
        PdfContentByte canvas = write.DirectContent;
        PdfImportedPage page;
        for (int i = 1; i <= reader.NumberOfPages; i++) {
            page = write.GetImportedPage(reader, i);
            canvas.AddTemplate(page, 1f, 0, 0, 1, 0, 0);
        }

        //adding my table
        PdfPTable t = new PdfPTable(columns);
        t.SetTotalWidth(columnWidths);

        foreach (DataRow dr in dt.Rows)
            foreach (object o in dr.ItemArray)
            {
                PdfPCell c = new PdfPCell();
                c.AddElement(new Chunk(o.ToString()));
                t.AddCell(c);
            }
        doc.Add(t);
        doc.Close();
        return outputPDF.ToArray();
    }
}

您希望表格出现在哪里?我猜是在现有文档的末尾? - Maverik
喝了早上的咖啡,现在我明白你的意思了!你缺少Doc.NewPage()(以及相关的DirectContent),所以你最终会一遍又一遍地写在同一个内容上,因此导致结果出错。我修改了你的代码并在我的应用程序中进行了测试;看起来现在可以工作了。新代码已添加到我的原始帖子中。 - Maverik
实际上,我想将它精确地定位在现有表格的顶部。 - Biff MaGriff

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