2010-04-07 15 views
5

Estoy tratando de extraer un PDF de una página HTML. El CMS que estoy usando es EPiServer.Necesito ayuda para crear PDF a partir de HTML utilizando itextsharp

Este es mi código hasta ahora:

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

Emite el contenido del nombre del artículo, introducción de texto y el cuerpo principal. Pero no analiza HTML que está en el texto del artículo y no hay diseño.

He intentado echar un vistazo a http://itextsharp.sourceforge.net/tutorial/index.html sin volverme más prudente.

Cualquier punteros a la dirección correcta es muy apreciada :)

Respuesta

5

Para las versiones posteriores de iTextSharp:

Usando iTextSharp puede utilizar el método iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList() para crear un PDF de HTML.

ParseToList() toma una (una clase abstracta) TextReader por su código HTML, lo que significa que puede utilizar un StringReader o StreamReader (ya que ambos utilizan TextReader como un tipo base). Usé un StringReader y pude generar archivos PDF a partir de un marcado simple. Traté de usar el HTML devuelto por una página web y obtuve errores en todas las páginas excepto en las simplistas. Incluso la página web simplista que recuperé (http://black.ea.com/) representaba el contenido de la etiqueta 'head' de la página en el PDF, por lo que creo que el método HTMLWorker.ParseToList() es exigente con el formato del HTML que analiza.

De todos modos, si quieres probar aquí está el código de prueba utilicé:

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

no pude encontrar ninguna documentación sobre la que construye HTML HTMLWorker.ParseToList() soportes; si lo hace, publíquelo aquí. Estoy seguro de que mucha gente estaría interesada.

Para versiones anteriores de iTextSharp: Usted puede utilizar el método iTextSharp.text.html.HtmlParser.Parse para crear un PDF basado en HTML.

He aquí un fragmento que demuestra esto:

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

El uno (importante para mí) es el problema de HTML debe ser estrictamente compatible con XHTML.

¡Buena suerte!

+0

Genial. Gracias. ¿Puede 'YourHtmlDocument.html' ser la URL de la página? – Steven

+0

PD. No creo que la versión más reciente de iTextSharp tenga HtmlParser. Lo más cerca que lo entiendo 'iTextSharp.text.html.simpleparser.HTMLWorker' Pero usando eso, requiere un TextReader para el análisis ... – Steven

+0

@Steven - ¡Tienes razón! Lo siento, cargué un viejo programa de prueba (con una versión anterior de iTextSharp) cuando respondí tu pregunta. Sin embargo, tienes razón, HTMLWorker es la forma en que te gustaría hacer. Edité mi respuesta en base a pruebas (limitadas) que hice con HTMLWorker e iTextSharp 5.0. –

Cuestiones relacionadas