with mvc htmlworker from example convert c# html pdf itextsharp
here

c# - mvc - itextsharp htmlworker



Convertir HTML a PDF en.NET (30)

Quiero generar un PDF pasando contenidos HTML a una función. He utilizado iTextSharp para esto, pero no funciona bien cuando se encuentra con las tablas y el diseño se complica.

¿Hay alguna manera mejor?


La actualización de 2018 y ¡Usemos la ecuación estándar de HTML + CSS = PDF!

Hay buenas noticias para las demandas de HTML a PDF. Como mostró esta respuesta , el estándar W3C css-break-3 resolverá el problema ... Es una recomendación del candidato con un plan para convertirse en una recomendación definitiva en 2017 o 2018, después de las pruebas.

Como no tan estándar, hay soluciones, con complementos para C #, como se muestra en print-css.rocks .


A continuación se muestra un ejemplo de conversión de html + css a PDF mediante iTextSharp (iTextSharp + itextsharp.xmlworker)

using iTextSharp.text; using iTextSharp.text.pdf; using iTextSharp.tool.xml; byte[] pdf; // result will be here var cssText = File.ReadAllText(MapPath("~/css/test.css")); var html = File.ReadAllText(MapPath("~/css/test.html")); using (var memoryStream = new MemoryStream()) { var document = new Document(PageSize.A4, 50, 50, 60, 60); var writer = PdfWriter.GetInstance(document, memoryStream); document.Open(); using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText))) { using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html))) { XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlMemoryStream, cssMemoryStream); } } document.Close(); pdf = memoryStream.ToArray(); }


ABCpdf.NET (http://www.websupergoo.com/abcpdf-5.htm)

Usamos y recomendamos.

Muy buen componente, no solo convierte una página web a PDF como una imagen, sino que realmente convierte texto, imagen, formato, etc.

No es gratis pero es barato.



Como representante del software HiQPdf, creo que la mejor solución es HiQPdf HTML to PDF converter para .NET . Contiene el motor de renderización de HTML5, CSS3, SVG y JavaScript más avanzado del mercado. También hay una versión gratuita de la biblioteca de HTML a PDF que puede utilizar para producir gratuitamente hasta 3 páginas PDF. El código de C # mínimo para producir un PDF como un byte [] desde una página HTML es:

HtmlToPdf htmlToPdfConverter = new HtmlToPdf(); // set PDF page size, orientation and margins htmlToPdfConverter.Document.PageSize = PdfPageSize.A4; htmlToPdfConverter.Document.PageOrientation = PdfPageOrientation.Portrait; htmlToPdfConverter.Document.Margins = new PdfMargins(0); // convert HTML to PDF byte[] pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory(url);

Puede encontrar ejemplos más detallados para ASP.NET y MVC en el repositorio de ejemplos de HiQPdf HTML a PDF Converter .


Con Winnovative converter puedes convertir una cadena HTML en una sola línea

byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl);

La URL base se utiliza para resolver las imágenes a las que hacen referencia las URL relativas en una cadena HTML. Alternativamente, puede utilizar URL completas en HTML o incrustar imágenes usando src = "data: image / png" para la etiqueta de imagen.

En respuesta al comentario de ''fubaar'' del usuario sobre Winnovative Converter, es necesaria una corrección. El convertidor no usa IE como motor de renderizado. En realidad, no depende de ningún software instalado y la representación es compatible con el motor WebKit.


Debe utilizar una biblioteca comercial si necesita una representación html perfecta en pdf.

http://www.html-to-pdf.net/ es muy fácil de usar y es compatible con la última versión de html5 / css3. Puedes convertir una url completa a pdf:

using ExpertPdf.HtmlToPdf; byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);

o una cadena html:

using ExpertPdf.HtmlToPdf; byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);

También tiene la alternativa de guardar directamente el documento pdf generado en un flujo de archivos en el disco.


Depende de cualquier otro requisito que tengas.

Una solución realmente simple pero no fácil de implementar es usar un control WebBrowser para cargar el HTML y luego usar el método de impresión para imprimir en una impresora PDF instalada localmente. Hay varias impresoras PDF gratuitas disponibles y el control WebBrowser es parte del marco .Net.

EDITAR: Si su HTML es XHtml, puede usar el PDFizer para hacer el trabajo.



Hace poco realicé un PoC sobre la conversión de HTML a PDF y quise compartir mis resultados.

Mi favorito con diferencia es OpenHtmlToPdf

Ventajas de esta herramienta:

  • Muy buena compatibilidad con HTML (por ejemplo, fue la única herramienta en mi ejemplo que repitió correctamente los encabezados de tabla cuando una tabla abarcaba varias páginas)
  • API fluida
  • Libre y OpenSource ( licencia Creative Commons Attribution 3.0 )
  • Disponible a través de NuGet

Otras herramientas probadas:


La mayoría del convertidor de HTML a PDF se basa en IE para realizar el análisis y la representación de HTML. Esto puede romperse cuando el usuario actualiza su IE. Here hay uno que no se basa en IE.

El código es algo así:

EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);

Al igual que muchos otros convertidores, puede pasar texto, nombre de archivo o URL. El resultado se puede guardar en un archivo o una secuencia.


La mejor herramienta que he encontrado y utilizado para generar PDF de javascript y estilos de vistas renderizadas o páginas html es phantomJS .

Descargue el archivo .exe con la función rasterize.js que se encuentra en la raíz del exe de la carpeta de ejemplo y colóquela dentro de la solución.

Incluso le permite descargar el archivo en cualquier código sin abrir ese archivo y también permite descargar el archivo cuando se aplican los estilos y especialmente jQuery.

El siguiente código genera el archivo PDF:

public ActionResult DownloadHighChartHtml() { string serverPath = Server.MapPath("~/phantomjs/"); string filename = DateTime.Now.ToString("ddMMyyyy_hhmmss") + ".pdf"; string Url = "http://wwwabc.com"; new Thread(new ParameterizedThreadStart(x => { ExecuteCommand(string.Format("cd {0} & E: & phantomjs rasterize.js {1} {2} /"A4/"", serverPath, Url, filename)); //E: is the drive for server.mappath })).Start(); var filePath = Path.Combine(Server.MapPath("~/phantomjs/"), filename); var stream = new MemoryStream(); byte[] bytes = DoWhile(filePath); Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment;filename=Image.pdf"); Response.OutputStream.Write(bytes, 0, bytes.Length); Response.End(); return RedirectToAction("HighChart"); } private void ExecuteCommand(string Command) { try { ProcessStartInfo ProcessInfo; Process Process; ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command); ProcessInfo.CreateNoWindow = true; ProcessInfo.UseShellExecute = false; Process = Process.Start(ProcessInfo); } catch { } } private byte[] DoWhile(string filePath) { byte[] bytes = new byte[0]; bool fail = true; while (fail) { try { using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { bytes = new byte[file.Length]; file.Read(bytes, 0, (int)file.Length); } fail = false; } catch { Thread.Sleep(1000); } } System.IO.File.Delete(filePath); return bytes; }



Pruebe wkhtmtopdf . Es la mejor herramienta que he encontrado hasta ahora.

Para .NET, puede usar esta pequeña biblioteca para invocar fácilmente la utilidad de línea de comandos wkhtmtopdf.


Pruebe este componente de conversión de PDF Duo .Net para convertir HTML a PDF desde la aplicación ASP.NET sin usar archivos DLL adicionales.

Puede pasar la cadena o archivo HTML, o transmitir para generar el PDF. Use el siguiente código (Ejemplo C #):

string file_html = @"K:/hdoc.html"; string file_pdf = @"K:/new.pdf"; try { DuoDimension.HtmlToPdf conv = new DuoDimension.HtmlToPdf(); conv.OpenHTML(file_html); conv.SavePDF(file_pdf); textBox4.Text = "C# Example: Converting succeeded"; }

Los ejemplos de Info + C # / VB se pueden encontrar en: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx


Recientemente, PDFmyURL lanzó un componente .NET para la conversión de páginas web / HTML a PDF. Esto tiene una interfaz muy fácil de usar, por ejemplo:

PDFmyURL pdf = new PDFmyURL("yourlicensekey"); pdf.ConvertURL("http://www.example.com", Application.StartupPath + @"/example.pdf");

Documentación: Documentación del componente PDFmyURL .NET.

Descargo de responsabilidad: trabajo para la empresa propietaria de PDFmyURL


Recomiendo encarecidamente NReco , en serio. Tiene la versión gratuita y de pago, y realmente vale la pena. Utiliza wkhtmtopdf en segundo plano, pero solo necesita un ensamblaje. Fantástico.

Ejemplo de uso:

Instalar a través de NuGet .

var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now); var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);

Descargo de responsabilidad: no soy el desarrollador, solo soy un fan del proyecto :)


Si desea que el usuario descargue el pdf de la página representada en el navegador, la solución más sencilla al problema es

window.print();

en el lado del cliente le pedirá al usuario que guarde el pdf de la página actual. También puedes personalizar la apariencia del pdf al vincular el estilo.

<link rel="stylesheet" type="text/css" href="print.css" media="print">

print.css se aplica al html mientras se imprime.

Limitación

No puede almacenar el archivo en el lado del servidor. Mensaje del usuario para imprimir la página de lo que tenía que guardar la página manualmente. La página debe ser renderizada en una pestaña.


Si realmente no necesita una verdadera biblioteca .Net PDF, existen numerosas herramientas gratuitas de HTML a PDF , muchas de las cuales pueden ejecutarse desde una línea de comandos.

Una solución sería elegir uno de esos y luego escribir una envoltura delgada alrededor de eso en C #. Por ejemplo, como se hace en este tutorial .


Soy el autor del paquete Rotativa. Permite crear archivos PDF directamente desde las vistas de afeitar:

https://www.nuget.org/packages/Rotativa/

Es trivial de usar y usted tiene control total sobre el diseño, ya que puede usar vistas de maquinilla de afeitar con datos de su contenedor de Modelo y ViewBag.

Desarrollé una versión de SaaS en Azure. Hace que sea aún más fácil de usar desde WebApi o cualquier aplicación .Net, servicio, sitio web de Azure, trabajo web de Azure, lo que sea que funcione con .Net.

http://www.rotativahq.com/

Cuentas gratuitas disponibles.


También estaba buscando esto hace un tiempo. Me encontré con HTMLDOC http://www.easysw.com/htmldoc/ que es una aplicación de línea de comandos de código abierto que toma un archivo HTML como argumento y escupe un PDF. Me ha funcionado bastante bien para mi proyecto paralelo, pero todo depende de lo que realmente necesites.

La compañía que lo fabrica vende los binarios compilados, pero puede descargarlos y compilarlos desde la fuente y utilizarlos de forma gratuita. Logré compilar una revisión bastante reciente (para la versión 1.9) y tengo la intención de lanzar un instalador binario para ella en unos pocos días, por lo que si está interesado, puedo proporcionarle un enlace tan pronto como lo publique.

Editar (25/02/2014): Parece que los documentos y el sitio se trasladaron a http://www.msweet.org/projects.php?Z1


También hay una nueva aplicación de generación de documentos basada en la web: DocRaptor.com . Parece fácil de usar, y hay una opción gratuita.


También puede verificar Spire , le permite crear HTML to PDF con este simple fragmento de código

string htmlCode = "<p>This is a p tag</p>"; //use single thread to generate the pdf from above html code Thread thread = new Thread(() => { pdf.LoadFromHTML(htmlCode, false, setting, htmlLayoutFormat); }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(); // Save the file to PDF and preview it. pdf.SaveToFile("output.pdf"); System.Diagnostics.Process.Start("output.pdf");

Artículo detallado: Cómo convertir HTML a PDF en asp.net C #



Ya sea que esté utilizando dll de itextsharp, no es necesario agregar dll de terceros (complemento), creo que está usando htmlworker en lugar de usar xmlworker, puede convertir fácilmente su html a pdf.

Algunos css no funcionan son compatibles con CSS
Explicación completa con ejemplo de referencia Haga clic aquí


MemoryStream memStream = new MemoryStream(); TextReader xmlString = new StringReader(outXml); using (Document document = new Document()) { PdfWriter writer = PdfWriter.GetInstance(document, memStream); //document.SetPageSize(iTextSharp.text.PageSize.A4); document.Open(); byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(outXml); MemoryStream ms = new MemoryStream(byteArray); XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, ms, System.Text.Encoding.UTF8); document.Close(); } Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf"); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.BinaryWrite(memStream.ToArray()); Response.End(); Response.Flush();


PDF La visión es buena. Sin embargo, debes tener Full Trust para usarlo. Ya envié un correo electrónico y pregunté por qué mi HTML no se estaba convirtiendo en el servidor, pero funcionó bien en localhost.


Essential PDF se puede utilizar para convertir HTML a PDF: ejemplo de C # . El ejemplo vinculado aquí está basado en ASP.NET, pero la biblioteca se puede usar desde Windows Forms, WPF, ASP.NET Webforms y ASP.NET MVC. La biblioteca ofrece la opción de utilizar diferentes motores de representación HTML: Internet Explorer (predeterminado) y WebKit (mejor resultado).

Todo el conjunto de controles está disponible de forma gratuita (también aplicaciones comerciales) a través del programa de licencias de la comunidad si califica. La licencia comunitaria es el producto completo sin limitaciones ni marcas de agua.

Nota: trabajo para Syncfusion.


Winnovative ofrece una biblioteca de .Net PDF que admite entrada de HTML. Ofrecen una prueba gratuita ilimitada. Dependiendo de cómo desee implementar su proyecto, esto podría ser suficiente.


EDITAR: Nuevo procesador de sugerencias HTML para PDF usando PdfSharp

(Después de probar wkhtmltopdf y sugerir evitarlo)

HtmlRenderer.PdfSharp es un código 100% totalmente administrado por C # , fácil de usar, seguro para subprocesos y lo más importante es una solución GRATUITA ( nueva licencia BSD ) .

Uso

  1. Descargue el paquete nuget HtmlRenderer.PdfSharp.
  2. Utilice el método de ejemplo.

    public static Byte[] PdfSharpConvert(String html) { Byte[] res = null; using (MemoryStream ms = new MemoryStream()) { var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4); pdf.Save(ms); res = ms.ToArray(); } return res; }

Una muy buena alternativa es una versión gratuita de iTextSharp

Hasta la versión 4.1.6, iTextSharp fue licenciada bajo la licencia LGPL y las versiones hasta 4.16 (o puede que también haya horquillas) están disponibles como paquetes y se pueden usar libremente. Por supuesto, alguien puede usar la iTextSharp 5+ iTextSharp .

Intenté integrar las soluciones wkhtmltopdf en mi proyecto y tuve un montón de obstáculos.

Personalmente evitaría usar soluciones basadas en wkhtmltopdf en aplicaciones de Hosted Enterprise por los siguientes motivos.

  1. En primer lugar, wkhtmltopdf es C ++ implementado, no C #, y experimentará varios problemas al incrustarlo en su código C #, especialmente al cambiar entre las compilaciones de 32 bits y 64 bits de su proyecto. Tuvo que probar varias soluciones, incluida la creación de proyectos condicionales, etc., solo para evitar "excepciones de formato no válido" en diferentes máquinas.
  2. Si administras tu propia máquina virtual está bien. Pero si su proyecto se ejecuta en un entorno restringido como ( Azure (en realidad es imposible sin el azul como lo menciona el autor de TuesdayPenchin), Elastic Beanstalk, etc.) es una pesadilla configurar ese entorno solo para que funcione wkhtmltopdf.
  3. wkhtmltopdf está creando archivos dentro de su servidor, por lo que debe administrar los permisos de los usuarios y otorgar acceso de "escritura" al lugar donde se ejecuta wkhtmltopdf.
  4. Wkhtmltopdf se ejecuta como una aplicación independiente, por lo que no es administrado por su grupo de aplicaciones IIS . Por lo tanto, debe alojarlo como un servicio en otra máquina o experimentará enormes picos de procesamiento y consumo de memoria dentro de su servidor de producción.
  5. Utiliza archivos temporales para generar el pdf, y en casos como AWS EC2, que tiene un disco realmente lento, es un gran problema de rendimiento.
  6. El error más odiado "No se puede cargar la DLL ''wkhtmltox.dll'' ''reportado por muchos usuarios.

--- PRE sección de edición ---

Para cualquier persona que quiera generar pdf desde html en aplicaciones / entornos más simples, les dejo mi antigua publicación como sugerencia.

TuesPechkin

https://www.nuget.org/packages/TuesPechkin/

o especialmente para aplicaciones web de MVC (pero creo que puede usarlo en cualquier aplicación .net)

Rotativa

https://www.nuget.org/packages/Rotativa/

Ambos utilizan el binario wkhtmtopdf para convertir html a pdf. Que utiliza el motor de webkit para representar las páginas, por lo que también puede analizar hojas de estilo CSS .

Proporcionan una integración sin problemas fácil de usar con C #.

Rotativa también puede generar archivos PDF directamente desde cualquier Razor View.

Además, para las aplicaciones web del mundo real, también administran la seguridad de subprocesos, etc.


En lugar de analizar HTML directamente a PDF, puede crear un mapa de bits de su página HTML y luego insertar el mapa de bits en su PDF, utilizando por ejemplo iTextSharp .

Aquí hay un código de cómo obtener un mapa de bits de una URL. Lo encontré en algún lugar aquí en SO, si encuentro la fuente, lo vincularé.

public System.Drawing.Bitmap HTMLToImage(String strHTML) { System.Drawing.Bitmap myBitmap = null; System.Threading.Thread myThread = new System.Threading.Thread(delegate() { // create a hidden web browser, which will navigate to the page System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser(); // we don''t want scrollbars on our image myWebBrowser.ScrollBarsEnabled = false; // don''t let any errors shine through myWebBrowser.ScriptErrorsSuppressed = true; // let''s load up that page! myWebBrowser.Navigate("about:blank"); // wait until the page is fully loaded while (myWebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) System.Windows.Forms.Application.DoEvents(); myWebBrowser.Document.Body.InnerHtml = strHTML; // set the size of our web browser to be the same size as the page int intScrollPadding = 20; int intDocumentWidth = myWebBrowser.Document.Body.ScrollRectangle.Width + intScrollPadding; int intDocumentHeight = myWebBrowser.Document.Body.ScrollRectangle.Height + intScrollPadding; myWebBrowser.Width = intDocumentWidth; myWebBrowser.Height = intDocumentHeight; // a bitmap that we will draw to myBitmap = new System.Drawing.Bitmap(intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding); // draw the web browser to the bitmap myWebBrowser.DrawToBitmap(myBitmap, new System.Drawing.Rectangle(0, 0, intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding)); }); myThread.SetApartmentState(System.Threading.ApartmentState.STA); myThread.Start(); myThread.Join(); return myBitmap; }