Skapa PDF:er i ASP.NET
Förord
Den artikeln beskriver hur du mycket enkelt kan skapa pdf-dokument i din ASP.NET-applikation.Innehåll
»»
»
Varför pdf-utskrifter?
Ibland vill man att användare ska kunna skriva ut eller spara ned data som presenteras i en webbapplikation på ett enkelt och praktiskt sätt. Att låta dem skriva ut eller spara ned själva webbsidan är i allmänhet inte ett optimalt alternativ, speciellt inte om det är en rapport av något slag som ska skrivas ut. Då fungerar en anpassad pdf-utskrift alldeles utmärkt.I exemplet nedan så använder jag mig av open-sourcebiblioteket iTextSharp http://itextsharp.sourceforge.net/.
Nedanstående kod skapar ett pdf-dokument med 2 sidor, en sida med en text och en sida med en tabell. Jag visar först hela koden sedan ett förtydligande av de olika delarna. Jag har inte lagt ned någon strörre ansträngning på layouten utan koncenterar mig på själva skapandet av pdf-dokumentet och hur man skickar det till användaren.
Kod:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System.Globalization;
.....
.......
.......
MemoryStream stream = new MemoryStream();
Document document = new Document(PageSize.A4.Rotate());
PdfWriter.GetInstance(document,stream);
document.Header = new HeaderFooter(new Phrase("Mitt pdf-dokument"),false);
document.Footer = new HeaderFooter(new Phrase("Sida "),true);
document.Open();
//Add a first page
document.Add(new Phrase("Det här är förstasidan i mitt pdf-dokument!!!"));
document.NewPage();
//create table
PdfPTable table = new PdfPTable(2);
table.WidthPercentage = 50;
table.DefaultCell.BorderWidth = 1;
table.DefaultCell.Padding = 2;
float[] headerwidths = {10, 5}; //percent
table.SetWidths(headerwidths);
//fonts for the table
BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font headerfont = new iTextSharp.text.Font(bf, 15, iTextSharp.text.Font.BOLD);
BaseFont bodybf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font bodyfont = new iTextSharp.text.Font(bodybf, 12, iTextSharp.text.Font.NORMAL);
//Add table headers
table.AddCell(new Phrase("Datum",headerfont));
table.AddCell(new Phrase("Dag",headerfont));
//Add table data
DateTime date = DateTime.Now;
for(int i=0; i<7; i++)
{
date = date.AddDays(i);
table.AddCell(new Phrase(date.ToString().Substring(0,10),bodyfont));
table.AddCell(new Phrase(DateTimeFormatInfo.CurrentInfo.GetDayName(date.DayOfWeek).Substring(0,3),bodyfont));
}
document.Add(table);
document.Close();
//Send to browser
Response.ContentType = "Application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=myPDFfile.pdf");
Response.OutputStream.Write(stream.GetBuffer(),0,stream.GetBuffer().Length);
Response.End();
stream.Close();
......
......
.....
Förklaring av koden:
Skapa ett pdf-dokument med liggande utskrift.
MemoryStream stream = new MemoryStream();
Document document = new Document(PageSize.A4.Rotate());
PdfWriter.GetInstance(document,stream);
Lägg till ett sidhuvud och en sidfot samt öppna dokumentet för redigering. I sidhuvudet står texten "Mitt pdf-dokument" och i sidfoten "Sida " + sidnummer.
document.Header = new HeaderFooter(new Phrase("Mitt pdf-dokument"),false);
document.Footer = new HeaderFooter(new Phrase("Sida "),true);
document.Open();
Lägg till texten "Det här är förstasidan i mitt pdf-dokument!!!" och gör en sidbrytning.
document.Add(new Phrase("Det här är förstasidan i mitt pdf-dokument!!!"));
document.NewPage();
Skapa en tabell med 2 kolumner.
PdfPTable table = new PdfPTable(2);
table.WidthPercentage = 50;
table.DefaultCell.BorderWidth = 1;
table.DefaultCell.Padding = 2;
float[] headerwidths = {10, 5}; //percent
table.SetWidths(headerwidths);
Skapa två olika fonter att använda till tabellen.
BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font headerfont = new iTextSharp.text.Font(bf, 15, iTextSharp.text.Font.BOLD);
BaseFont bodybf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font bodyfont = new iTextSharp.text.Font(bodybf, 12, iTextSharp.text.Font.NORMAL);
Skapa en tabellrad med rubriker till kolumnerna och använd den ena av de fonter vi skapade ovan.
table.AddCell(new Phrase("Datum",headerfont));
table.AddCell(new Phrase("Dag",headerfont));
Fyll tabellen med data, i det här exemplet lägger vi till 7 rader med dagens datum + 6 dagar framåt. I första kolumnen står datumet och i andra kolumnen den tillhörande dagen. Vi använder här den andra fonten vi skapade.
DateTime date = DateTime.Now;
for(int i=0; i<7; i++)
{
date = date.AddDays(i);
table.AddCell(new Phrase(date.ToString().Substring(0,10),bodyfont));
table.AddCell(new Phrase(DateTimeFormatInfo.CurrentInfo.GetDayName(date.DayOfWeek).Substring(0,3),bodyfont));
}
Lägg till tabellen till dokumentet och stäng dokumentet för redigering.
document.Add(table);
document.Close();
Döp filen till "myPDFfile.pdf" och skicka det färdiga dokumentet till användaren.
Response.ContentType = "Application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=myPDFfile.pdf");
Response.OutputStream.Write(stream.GetBuffer(),0,stream.GetBuffer().Length);
Response.End();
stream.Close();
Lycka till med dina pdf-utskrifter!!
Mats Järnmalm
itext måste väl installeras på servern? Svårt att hitta info om detta och tacksam för hjälp