ITextSharp HTML a PDF?

Me gustaría saber si ITextSharp tiene la capacidad de convertir HTML a PDF. Todo lo que convertiré será texto sin formato, pero lamentablemente hay muy poca o ninguna documentación sobre ITextSharp, por lo que no puedo determinar si esa será una solución viable para mí.

Si no puede hacerlo, ¿alguien puede indicarme algunas buenas librerías .net que pueden tomar un documento HTML sencillo y convertirlo a un pdf?

tia.

Me encontré con la misma pregunta hace unas semanas y este es el resultado de lo que encontré. Este método realiza un volcado rápido de HTML a un PDF. Es muy probable que el documento necesite algún ajuste de formato.

private MemoryStream createPDF(string html) { MemoryStream msOutput = new MemoryStream(); TextReader reader = new StringReader(html); // step 1: creation of a document-object Document document = new Document(PageSize.A4, 30, 30, 30, 30); // step 2: // we create a writer that listens to the document // and directs a XML-stream to a file PdfWriter writer = PdfWriter.GetInstance(document, msOutput); // step 3: we create a worker parse the document HTMLWorker worker = new HTMLWorker(document); // step 4: we open document and start the worker on the document document.Open(); worker.StartDocument(); // step 5: parse the html into the document worker.Parse(reader); // step 6: close the document and the worker worker.EndDocument(); worker.Close(); document.Close(); return msOutput; } 

Después de hacer algunas excavaciones encontré una buena manera de lograr lo que necesito con ITextSharp.

Aquí hay un código de muestra si ayuda a alguien más en el futuro:

 protected void Page_Load(object sender, EventArgs e) { Document document = new Document(); try { PdfWriter.GetInstance(document, new FileStream("c:\\my.pdf", FileMode.Create)); document.Open(); WebClient wc = new WebClient(); string htmlText = wc.DownloadString("http://localhost:59500/my.html"); Response.Write(htmlText); List htmlarraylist = HTMLWorker.ParseToList(new StringReader(htmlText), null); for (int k = 0; k < htmlarraylist.Count; k++) { document.Add((IElement)htmlarraylist[k]); } document.Close(); } catch { } } 

Esto es lo que pude hacer trabajando en la versión 5.4.2 (de la instalación nuget) para devolver una respuesta en pdf desde un controlador asp.net mvc. Se podría modificar el uso de FileStream en lugar de MemoryStream para la salida, si eso es lo que se necesita.

Lo publico aquí porque es un ejemplo completo del uso actual de iTextSharp para la conversión html -> pdf (sin tener en cuenta las imágenes, no lo he visto porque mi uso no lo requiere)

Utiliza el XmlWorkerHelper de iTextSharp, por lo que el hmtl entrante debe ser XHTML válido, por lo que es posible que tengas que hacer algunas correcciones dependiendo de tu entrada.

 using iTextSharp.text.pdf; using iTextSharp.tool.xml; using System.IO; using System.Web.Mvc; namespace Sample.Web.Controllers { public class PdfConverterController : Controller { [ValidateInput(false)] [HttpPost] public ActionResult HtmlToPdf(string html) { html = @"    Minimal XHTML 1.0 Document with W3C DTD   " + html + ""; var bytes = System.Text.Encoding.UTF8.GetBytes(html); using (var input = new MemoryStream(bytes)) { var output = new MemoryStream(); // this MemoryStream is closed by FileStreamResult var document = new iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER, 50, 50, 50, 50); var writer = PdfWriter.GetInstance(document, output); writer.CloseStream = false; document.Open(); var xmlWorker = XMLWorkerHelper.GetInstance(); xmlWorker.ParseXHtml(writer, document, input, null); document.Close(); output.Position = 0; return new FileStreamResult(output, "application/pdf"); } } } } 

Quisiera saber la respuesta de mightymada si tuviera la reputación. Acabo de implementar una solución asp.net HTML to PDF usando Pechkin. los resultados son maravillosos

Hay un paquete nuget para Pechkin, pero como menciona el póster anterior en su blog ( http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/ – Espero que no le importe me reposicionó), hay una pérdida de memoria que se ha solucionado en esta twig:

https://github.com/tuespetre/Pechkin

El blog anterior tiene instrucciones específicas sobre cómo incluir este paquete (es un dll de 32 bits y requiere .net4). aquí está mi código El HTML entrante se ensambla a través del paquete HTML Agility (estoy automatizando generaciones de facturas):

 public static byte[] PechkinPdf(string html) { //Transform the HTML into PDF var pechkin = Factory.Create(new GlobalConfig()); var pdf = pechkin.Convert(new ObjectConfig() .SetLoadImages(true).SetZoomFactor(1.5) .SetPrintBackground(true) .SetScreenMediaType(true) .SetCreateExternalLinks(true), html); //Return the PDF file return pdf; } 

nuevamente, gracias mightymada, tu respuesta es fantástica.

Prefiero usar otra biblioteca llamada Pechkin porque es capaz de convertir HTML no trivial (que también tiene clases de CSS). Esto es posible porque esta biblioteca usa el motor de diseño WebKit que también es usado por navegadores como Chrome y Safari.

Detallé en mi blog mi experiencia con Pechkin: http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/

El código anterior ciertamente ayudará a convertir HTML a PDF, pero fallará si el código HTML tiene tags IMG con rutas relativas. La biblioteca iTextSharp no convierte automáticamente las rutas relativas a las absolutas.

Probé el código anterior y agregué el código para encargarme de las tags IMG.

Puede encontrar el código aquí para su referencia: http://www.am22tech.com/html-to-pdf/

Tiene la capacidad de convertir archivos HTML a PDF.

El espacio de nombre requerido para las conversiones es:

 using iTextSharp.text; using iTextSharp.text.pdf; 

y para el archivo de conversión y descarga:

 // Create a byte array that will eventually hold our final PDF Byte[] bytes; // Boilerplate iTextSharp setup here // Create a stream that we can write to, in this case a MemoryStream using (var ms = new MemoryStream()) { // Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF using (var doc = new Document()) { // Create a writer that's bound to our PDF abstraction and our stream using (var writer = PdfWriter.GetInstance(doc, ms)) { // Open the document for writing doc.Open(); string finalHtml = string.Empty; // Read your html by database or file here and store it into finalHtml eg a string // XMLWorker also reads from a TextReader and not directly from a string using (var srHtml = new StringReader(finalHtml)) { // Parse the HTML iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml); } doc.Close(); } } // After all of the PDF "stuff" above is done and closed but **before** we // close the MemoryStream, grab all of the active bytes from the stream bytes = ms.ToArray(); } // Clear the response Response.Clear(); MemoryStream mstream = new MemoryStream(bytes); // Define response content type Response.ContentType = "application/pdf"; // Give the name of file of pdf and add in to header Response.AddHeader("content-disposition", "attachment;filename=invoice.pdf"); Response.Buffer = true; mstream.WriteTo(Response.OutputStream); Response.End(); 

Si está convirtiendo html a pdf en el lado del servidor html, puede usar Rotativa:

 Install-Package Rotativa 

Esto está basado en wkhtmltopdf pero tiene mejor soporte css que iTextSharp y es muy simple de integrar con MVC (que se usa principalmente) ya que simplemente puede devolver la vista como pdf:

 public ActionResult GetPdf() { //... return new ViewAsPdf(model);// and you are done! }