2016-11-08 1 views
0

Lorsque j'ajoute plusieurs tables à un fichier pdf iText7 et que le nombre de tables est supérieur à une page, l'exception suivante est levée.itext7 ne crée pas de nouvelle page PDF automatiquement

Exception: "Référence d'objet non définie sur une instance d'un objet". Source: "itext.layout" StackTrace: « à iText.Layout.Renderer.TableRenderer.Layout (LayoutContext layoutContext) à iText.Layout.Renderer.RootRenderer.AddChild (IRenderer renderer) à iText.Layout.RootElement 1.Add[T2](BlockElement 1 élément) à iText.Layout.Document.Add [T] (élément BlockElement`1) à iTextSharp7_Test.Controllers.PdfController.ReplicateBug (String PDFfile) dans C: \ Users \ me \ Documents \ Visual studio 2015 \ Projets \ App_Test \ iTextSharp7_Test \ Contrôleurs \ PdfController.cs: ligne 443"

Dans l'exemple fourni, l'exception est levée lorsque la 6ème table est sur le point d'être ajoutée. La seule façon que j'ai été capable de gérer ce problème est de supposer que l'exception est levée en ajoutant plus de données au pdf que de tenir dans une page et ajouter une nouvelle page dans le bloc try catch, une solution qui est très moche et pas bon à long terme.

Exemple:

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

Merci à l'avance

Répondre

1

Cette question a déjà été corrigé dans 7.0.2 (et 7.0.2-SNAPSHOT, qui est connu comme 7.0.1.1 dans la version .NET). Le package instantané NuGet peut être téléchargé à partir du Artifactory. La version de sortie 7.0.2 sera disponible au NuGet dans les prochaines semaines.