2010-04-07 15 views
5

Sto cercando di creare un PDF da una pagina HTML. Il CMS che sto usando è EPiServer.Ho bisogno di aiuto con la creazione di PDF da HTML utilizzando itextsharp

Questo è il mio codice finora:

protected void Button1_Click(object sender, EventArgs e) 
    { 
     naaflib.pdfDocument(CurrentPage); 
    } 


    public static void pdfDocument(PageData pd) 
    { 
     //Extract data from Page (pd). 
     string intro = pd["MainIntro"].ToString(); // Attribute 
     string mainBody = pd["MainBody"].ToString(); // Attribute 

     // makae ready HttpContext 
     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.ContentType = "application/pdf"; 

     // Create PDF document 
     Document pdfDocument = new Document(PageSize.A4, 80, 50, 30, 65); 
     //PdfWriter pw = PdfWriter.GetInstance(pdfDocument, HttpContext.Current.Response.OutputStream); 
     PdfWriter.GetInstance(pdfDocument, HttpContext.Current.Response.OutputStream); 

     pdfDocument.Open(); 
     pdfDocument.Add(new Paragraph(pd.PageName)); 
     pdfDocument.Add(new Paragraph(intro)); 
     pdfDocument.Add(new Paragraph(mainBody)); 
     pdfDocument.Close(); 
     HttpContext.Current.Response.End(); 
    } 

Emette il contenuto del nome dell'articolo, intro-text e il corpo principale. Ma non analizza l'HTML che si trova nel testo dell'articolo e non c'è un layout.

Ho provato a dare un'occhiata a http://itextsharp.sourceforge.net/tutorial/index.html senza diventare più saggio.

Eventuali puntatori a giusta direzione è molto apprezzato :)

risposta

5

Per le versioni successive di iTextSharp:

Usando iTextSharp è possibile utilizzare il metodo iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList() per creare un PDF da HTML.

ParseToList() prende una (una classe astratta) TextReader per la sua sorgente HTML, il che significa che è possibile utilizzare un StringReader o StreamReader (entrambi i quali utilizzano TextReader come tipo di base). Ho usato uno StringReader ed ero in grado di generare PDF da semplice mark up. Ho provato a utilizzare l'HTML restituito da una pagina Web e ho ottenuto errori su tutte le pagine tranne quelle semplificate. Anche la semplice pagina web che ho recuperato (http://black.ea.com/) stava visualizzando il contenuto del tag "head" della pagina sul PDF, quindi penso che il metodo HTMLWorker.ParseToList() sia schizzinoso sulla formattazione dell'HTML che analizza.

In ogni caso, se volete provare ecco il codice di prova che ho usato:

// Download content from a very, very simple "Hello World" web page. 
string download = new WebClient().DownloadString("http://black.ea.com/"); 

Document document = new Document(PageSize.A4, 80, 50, 30, 65); 
try { 
    using (FileStream fs = new FileStream("TestOutput.pdf", FileMode.Create)) { 
     PdfWriter.GetInstance(document, fs); 
     using (StringReader stringReader = new StringReader(download)) { 
      ArrayList parsedList = HTMLWorker.ParseToList(stringReader, null); 
      document.Open(); 
      foreach (object item in parsedList) { 
       document.Add((IElement)item); 
      } 
      document.Close(); 
     } 
    } 

} catch (Exception exc) { 
    Console.Error.WriteLine(exc.Message); 
} 

non ho potuto trovare alcuna documentazione su cui HTML costruisce HTMLWorker.ParseToList() supporti; se lo fai per favore postalo qui. Sono sicuro che molte persone sarebbero interessate.

Per le versioni precedenti di iTextSharp: È possibile utilizzare il metodo iTextSharp.text.html.HtmlParser.Parse per creare un PDF basata su HTML.

Ecco un frammento che dimostrano questo:

Document document = new Document(PageSize.A4, 80, 50, 30, 65); 
try { 
    using (FileStream fs = new FileStream("TestOutput.pdf", FileMode.Create)) { 
     PdfWriter.GetInstance(document, fs); 
     HtmlParser.Parse(document, "YourHtmlDocument.html"); 
    } 
} catch(Exception exc) { 
    Console.Error.WriteLine(exc.Message); 
} 

L'unica (importante per me) problema è l'HTML deve essere rigorosamente XHTML.

Buona fortuna!

+0

Grande. Grazie. Can 'YourHtmlDocument.html' può essere l'URL della pagina? – Steven

+0

PS. Non penso che la versione più recente di iTextSharp abbia HtmlParser. Il più vicino ho capito 'iTextSharp.text.html.simpleparser.HTMLWorker' Ma usando quello, richiede un TextReader per l'analisi ..... – Steven

+0

@Steven - Hai ragione! Scusa, ho caricato un vecchio programma di test (con una vecchia versione di iTextSharp) quando ho risposto alla tua domanda. Hai ragione, HTMLWorker è il modo in cui vorresti farlo. Ho modificato la mia risposta sulla base di test (limitati) effettuati con HTMLWorker e iTextSharp 5.0. –

Problemi correlati