2016-06-21 11 views
2

Ich versuche, ein einfaches PDF-Dokument zu generieren, das von einer asp.net-Webseite heruntergeladen werden kann. Dieses PDF-Dokument hat einen Absatz mit einem Überschriftentext und der Rest des Inhalts wurde durch eine vorgefüllte DataTable-Instanz gefüllt. Alle Spalten, die ich hier zu drucken versuche, sind Text mit Ausnahme einer Spalte, die ein Bild ist (thumbnail).Generieren von leeren PDF-Dateien beim Herunterladen -ItextSharp

Ich kann den angehängten Code ohne Ausnahmen ausführen, das PDF-Dokument wird generiert und in den Client-Browser heruntergeladen.

Ausgabe:Benutzer können diese heruntergeladene PDF in ihrem Browser anzeigen (nur mit IE und Chrome getestet) und können alle Inhalte in der PDF einschließlich Thumbnails anzeigen. Alle PDF-Seiten sind jedoch leer, wenn sie diese generierte PDF-Datei auf ihrem lokalen Laufwerk speichern und öffnen.

Haben mir schon eine Weile den Kopf gebrochen und jeder Hinweis wäre wirklich hilfreich.

-Code, die auf Ereignisserverseite PDF generieren

private void Download() 
    { 

     var document = new Document(); 

     try 
     { 
      var dataTable = GetDataTable(parameters); //this line create and fill a DataTable with some values 


      Response.ContentType = "application/pdf"; 
      Response.AddHeader("content-disposition","attachment;filename=sample.pdf"); 

      Response.Cache.SetCacheability(HttpCacheability.NoCache); 

      PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream);//get a pdf writer instance 

      document.Open(); 

      //Create table 

      var pdfTable = DocumentManager.CreateTable(dataTable.Columns.Count, new[] { 30f, 130f, 130f, 80f, 60f, 80f, 60f, 80f, 60f, 60f, 80f, 80f, 60f }); 

    //Create a simple heading 
       var heading = new StringBuilder(); 
       heading.AppendLine("Summary"); 


      var contentFont = DocumentManager.GetFont(5); 
      var genHeadingFont = DocumentManager.GetFont(6, true); 

      var image = iTextSharp.text.Image.GetInstance(HttpContext.Current.Server.MapPath("/images/some.png")); 
      image.WidthPercentage = 25; 
      image.Alignment = iTextSharp.text.Image.ALIGN_RIGHT; 
      document.Add(image); 
      document.Add(new Paragraph(heading.ToString(), contentFont)); 
      //Create column heading 
      DocumentManager.CreateColums(pdfTable, dataTable, genHeadingFont); 
      //Create cells and fill with values 
      DocumentManager.CreateCellAndFillValue(pdfTable, dataTable.Select(), contentFont, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }); 
      document.Add(pdfTable); 
      Response.Write(document); 
      document.Close(); 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 

     } 
    } 

referenzierten Methoden (Teil von Documentmanager-Klasse)

public static PdfPTable CreateTable(int columnSpan, float[] columnWidths) 
     { 
      var table = new PdfPTable(columnSpan); 
      table.SetWidths(columnWidths); 
      table.TotalWidth = 1000f; 
      table.WidthPercentage = 100; 

      return table; 
     } 

public static Font GetFont(int size, bool isBold = false) 
     { 
      return FontFactory.GetFont("Calibri", size, isBold ? Font.BOLD : Font.NORMAL); 
     } 
public static void CreateColums(PdfPTable pdfTable, DataTable dataColumns, Font columnsFont, 
             List<string> columnsToExclude = null, BaseColor backGround = null) 
     { 
      columnsToExclude = columnsToExclude ?? new List<string>(); 
      foreach (
       var c in 
        from DataColumn c in dataColumns.Columns where !columnsToExclude.Contains(c.ColumnName) select c) 
      { 
       var cell = new PdfPCell(new Phrase(c.ColumnName, columnsFont)) { BackgroundColor = backGround ?? new BaseColor(164, 183, 210), HorizontalAlignment = Element.ALIGN_MIDDLE }; 
       cell.PaddingBottom = 3f; 
       cell.PaddingTop = 3f; 
       cell.PaddingLeft = 3f; 
       cell.PaddingRight = 3f; 
       pdfTable.AddCell(cell); 
      } 
     } 



     public static void CreateCellAndFillValue(PdfPTable table, DataRow[] dataRows, Font cellFont, 
               int[] columnIndex = null, string[] columnNames = null) 
     { 
      if (columnIndex != null && columnIndex.Length != 0) 
      { 
       CreateCellValueUsingIndex(table, dataRows, cellFont, columnIndex); 
       return; 
      } 
      if (columnNames != null && columnNames.Length != 0) 
      { 
       CreateCellValueUsingColumnName(table, dataRows, cellFont, columnNames); 

      } 
     } 


     public static void CreateCellValueUsingIndex(PdfPTable table, IEnumerable<DataRow> dataRows, Font cellFont, int[] columnIndex) 
     { 
      foreach (var r in dataRows) 
      { 
       foreach (var index in columnIndex) 
       { 
        if (index != 1) //value columns 
        { 
         var cell = new PdfPCell(new Phrase(r[index].ToString(), cellFont)); 
         cell.PaddingBottom = 2f; 
         cell.PaddingTop = 2f; 
         cell.PaddingLeft = 2f; 
         cell.PaddingRight = 2f; 
         cell.HorizontalAlignment = Element.ALIGN_CENTER; 
         table.AddCell(cell); 
        } 
        else //image columns 
        { 
         iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(r[index].ToString()); 
         image.Alignment = iTextSharp.text.Image.ALIGN_CENTER; 
         PdfPCell imgCell = new PdfPCell(); 
         imgCell.AddElement(new Chunk(image, 0, 0)); 
         table.AddCell(imgCell); 

        } 
       } 
      } 
     } 

     public static void CreateCellValueUsingColumnName(PdfPTable table, IEnumerable<DataRow> dataRows, Font cellFont, 
               string[] columnNames) 
     { 

      foreach (var r in dataRows) 
      { 
       foreach (var name in columnNames) 
       { 

        table.AddCell(new Phrase(r[name].ToString(), cellFont)); 
       } 
      } 
     } 

ItextSharp Dll Version Info

+0

Hoppla, von diesem Screenshot sehe ich, dass die Copyright-Jahre nicht aktualisiert werden. Wird in 5.5.10 behoben. –

+0

Das ist ein guter Punkt. Danke an mich. – Nair

Antwort

3

Du alles vermischen, so dass es kann ein wenig verwirrend werden. Trennen Sie, was Sie tun möchten, in ihre eigenen Funktionen.

Die einzige Verantwortung dieser Methode ist es, das PDF

private void CreatePdf(Stream output) { 
    var document = new Document(); 

    try { 
     var dataTable = GetDataTable(parameters); //this line create and fill a DataTable with some values 
     //get a pdf writer instance 
     PdfWriter writer = PdfWriter.GetInstance(document, output); 
     //open the document 
     document.Open(); 
     //Create table 
     var pdfTable = DocumentManager.CreateTable(dataTable.Columns.Count, new[] { 30f, 130f, 130f, 80f, 60f, 80f, 60f, 80f, 60f, 60f, 80f, 80f, 60f }); 
     //Create a simple heading 
     var heading = new StringBuilder(); 
     heading.AppendLine("Summary"); 

     var contentFont = DocumentManager.GetFont(5); 
     var genHeadingFont = DocumentManager.GetFont(6, true); 

     var image = iTextSharp.text.Image.GetInstance(HttpContext.Current.Server.MapPath("/images/some.png")); 
     image.WidthPercentage = 25; 
     image.Alignment = iTextSharp.text.Image.ALIGN_RIGHT; 
     document.Add(image); 
     document.Add(new Paragraph(heading.ToString(), contentFont)); 
     //Create column heading 
     DocumentManager.CreateColums(pdfTable, dataTable, genHeadingFont); 
     //Create cells and fill with values 
     DocumentManager.CreateCellAndFillValue(pdfTable, dataTable.Select(), contentFont, new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }); 
     document.Add(pdfTable); 

     // make sure any data in the buffer is written to the output stream 
     writer.Flush(); 
    } finally { 
     document.Close(); 
    } 
} 

Dies wird dann Download erlauben, zu erstellen ein wenig mager

private void Download() { 
    Response.ContentType = "application/pdf;"; 
    Response.AddHeader("content-disposition","attachment;filename=sample.pdf"); 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    // stream to store generated document 
    var output = new MemoryStream(); 
    // generate document 
    CreatePdf(output); 
    // pass the generated data to the response output stream 
    Response.OutputStream.Write(output.GetBuffer(), 0, output.Length); 
} 

Durch die Trennung der Verantwortlichkeiten heraus, werden Sie feststellen, wo Ihr Fehler war in Ihrem ursprünglichen Post. Das Dokument wurde gelöscht und vollständig geschlossen, bevor es in die Antwort gesendet wurde. Dies sollte beim Versuch, das Dokument zu speichern, ermöglichen, dass es über alle Daten verfügt, die zum Speichern des gesamten Dokuments erforderlich sind.

+0

Wird überprüft und Sie wissen lassen. Danke für deine Zeit. – Nair

+0

Erstens mag ich die Trennung der Logik wirklich und stimme absolut damit überein. Ich bekomme jedoch nicht den Teil "utf-8" im Inhaltstyp. PDFs sind Binärdateien (obwohl man sie manchmal im Editor lesen kann), so dass eine Zeichencodierung auf der Transportebene keinen Sinn ergibt. Innerhalb der PDF-Datei gibt es möglicherweise unterschiedliche Regeln, die sich jedoch nicht auf den Transport auswirken sollten. Auch wenn das Sinn macht (was nicht der Fall ist), sollte dieser Teil nach bestem Wissen "charset = utf-8" sein. –

+0

@ChrisHaas, überprüft es und Sie sind absolut richtig. wird entsprechend aktualisiert. Danke für die Erklärung. – Nkosi