itext7没有自动创建新的pdf页面

本文关键字:pdf 页面 创建 itext7 | 更新日期: 2023-09-27 18:16:50

当我将多个表添加到iText7-pdf中,并且表的数量超过一个页面的数量时,会引发以下异常。

异常:"对象引用未设置为对象的实例。"来源:位于的"itext.layout"StackTrace:"iText.Layout.RRenderer.TableRenderer.Layout(LayoutContextlayoutContext(位于iText.Layout.RRenderer.RootRenderer.AddChild(IRender渲染器(在iText.Layout.RootElement 1.Add[T2](BlockElement 1元素(位于iText.Layout.Document.Add[T](BlockElement`1元素(在iTextSharp7_Test.Controller.PdfController.ReplateBug(字符串pdfFile(2015''Projects''App_Test''iTextSharp7_Test''Controllers''PdfController.cs:line443">

在所提供的示例中,当即将添加第6个表时抛出异常。

我能够处理这个问题的唯一方法是假设异常是通过向pdf中添加比一个页面中容纳的数据更多的数据而抛出的,并在try-catch块中添加一个新页面,这种解决方案非常丑陋,从长远来看并不好。

示例:

public void ReplicateBug(string pdfFile)
{
    iText.Kernel.Pdf.PdfWriter writer = null;
    iText.Kernel.Pdf.PdfDocument pdf = null;
    iText.Layout.Document document = null;
    try
    {
        writer = new iText.Kernel.Pdf.PdfWriter(pdfFile);
        pdf = new iText.Kernel.Pdf.PdfDocument(writer);
        document = new iText.Layout.Document(pdf, iText.Kernel.Geom.PageSize.A4);
        document.Add(new iText.Layout.Element.Paragraph("*** PRODUCTS ***"));
        iText.Kernel.Pdf.Canvas.Draw.DashedLine dashedLine = new iText.Kernel.Pdf.Canvas.Draw.DashedLine();
        document.Add(new iText.Layout.Element.LineSeparator(dashedLine));
        iText.Layout.Element.Table table = null;
        for (int i = 0; i < 10; ++i)
        {
            iText.Layout.Element.Cell cell = null;
            table = new iText.Layout.Element.Table(2);
            table.SetMarginTop(10);
            cell = new iText.Layout.Element.Cell().Add("-- PRODUCT --");
            table.AddCell(cell);
            cell = new iText.Layout.Element.Cell(3, 1).Add("image");
            cell.SetHorizontalAlignment(iText.Layout.Properties.HorizontalAlignment.CENTER);
            cell.SetVerticalAlignment(iText.Layout.Properties.VerticalAlignment.MIDDLE);
            table.AddCell(cell);
            cell = new iText.Layout.Element.Cell().Add("Product text." + Environment.NewLine + "Welcome");
            cell.SetHeight(75);
            table.AddCell(cell);
            cell = new iText.Layout.Element.Cell().Add((i + 1).ToString().PadLeft(10, '0'));
            table.AddCell(cell);
            try
            {
                document.Add(table);
                document.Add(new iText.Layout.Element.LineSeparator(dashedLine));   // Default LineWidth is 1
            }
            catch
            {
                // NOTE: After adding 5 tables to the pdf an exception is thrown of the following kind.
                // Exception: "Object reference not set to an instance of an object."
                // Source: "itext.layout"
                // StackTrace: "at iText.Layout.Renderer.TableRenderer.Layout(LayoutContext layoutContext)
                //              at iText.Layout.Renderer.RootRenderer.AddChild(IRenderer renderer)
                //              at iText.Layout.RootElement`1.Add[T2](BlockElement`1 element)
                //              at iText.Layout.Document.Add[T](BlockElement`1 element)
                //              at iTextSharp7_Test.Controllers.PdfController.ReplicateBug(String pdfFile) in C:''Users''me''Documents''Visual Studio 2015''Projects''App_Test''iTextSharp7_Test''Controllers''PdfController.cs:line 443"
            }
        }
        document.Close();
        pdf.Close();
        writer.Close();
    }
    catch
    {
        if (document != null)
        {
            document.Close();
        }
        if (pdf != null)
        {
            pdf.Close();
        }
        if (writer != null)
        {
            writer.Close();
        }
        throw;
    }
}

提前感谢

itext7没有自动创建新的pdf页面

此问题已在7.0.2(以及7.0.2-SNAPSHOT,在.NET版本中称为7.0.1.1(中得到修复。快照NuGet包可以从Artifactory下载。7.0.2发布版本将在最近几周内在NuGet上提供。