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));
}
}
}
Hoppla, von diesem Screenshot sehe ich, dass die Copyright-Jahre nicht aktualisiert werden. Wird in 5.5.10 behoben. –
Das ist ein guter Punkt. Danke an mich. – Nair