2016-11-08 3 views
0

Когда я добавляю несколько таблиц в iText7 pdf, а количество таблиц больше, чем подходит на одной странице, генерируется следующее исключение.itext7 автоматически не создает новую pdf-страницу

Исключение: «Ссылка на объект не установлена ​​в экземпляр объекта». Источник: "itext.layout" StackTrace: «в iText.Layout.Renderer.TableRenderer.Layout (LayoutContext layoutContext) в iText.Layout.Renderer.RootRenderer.AddChild (IRenderer визуализатора) в iText.Layout.RootElement 1.Add[T2](BlockElement 1 элемент) на iText.Layout.Document.Add [T] (BlockElement`1 элемент) в iTextSharp7_Test.Controllers.PdfController.ReplicateBug (String pdfFile) в C: \ Users \ мне \ Documents \ Visual Studio 2015 \ Проекты \ App_Test \ iTextSharp7_Test \ Контроллеры \ PdfController.cs: линия 443"

В приведенном примере исключение генерируется при добавлении шестой таблицы.

Единственный способ, которым я смог справиться с этой проблемой, заключается в том, что исключение создается путем добавления дополнительных данных в pdf, чем в одной странице, и добавления новой страницы в блок catch try, решение, которое очень уродливый и не очень хороший в долгосрочной перспективе.

Пример:

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

Заранее спасибо

ответ

1

Эта проблема уже исправлена ​​в 7.0.27.0.2-SNAPSHOT, который известен как 7.0.1.1 в .NET версии). Снимок пакета NuGet можно загрузить с Artifactory. Версия для печати 7.0.2 будет доступна на NuGet в ближайшие недели.