Convierte HTML a PDF en .NET

425

Quiero generar un PDF pasando contenido HTML a una función. He hecho uso de iTextSharp para esto, pero no funciona bien cuando encuentra tablas y el diseño simplemente se vuelve desordenado.

¿Hay una mejor manera?

Amedee Van Gasse
fuente
Puede usar GemBox.Document para esto. También aquí puede encontrar un código de muestra para convertir un archivo HTML en un archivo PDF.
Mario Z
¿Qué versión de iTextSharp usa y podría compartir su html?
Amedee Van Gasse
Todavía no hay respuesta a mi solicitud de información adicional. Agregue también si está utilizando HTMLWorker o XMLWorker.
Amedee Van Gasse
¿Qué pasa con .net core?
Piero Alberto
SEPT 2019: he agregado una nueva respuesta, algunas de las opciones enumeradas son gratuitas, otras pagas y algunas están disponibles como .net core stackoverflow.com/questions/564650/…
Mauricio Gracia Gutiérrez

Respuestas:

198

EDITAR: Nueva sugerencia Renderer HTML para PDF usando PdfSharp

(Después de probar wkhtmltopdf y sugerir evitarlo)

HtmlRenderer.PdfSharp es un código 100% totalmente administrado en C # , fácil de usar, seguro para subprocesos y, lo que es más importante, GRATIS ( 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 alternativa muy buena es una versión gratuita de iTextSharp

Hasta la versión 4.1.6, iTextSharp tenía licencia bajo la licencia LGPL y las versiones hasta 4.16 (o también puede haber tenedores) están disponibles como paquetes y se pueden usar libremente. Por supuesto, alguien puede usar la versión paga de 5+ .

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

Yo personalmente evitaría usar soluciones basadas en wkhtmltopdf en aplicaciones Hosted Enterprise por las siguientes razones.

  1. En primer lugar, wkhtmltopdf se implementa en C ++, no en C #, y experimentará varios problemas al incorporarlo en su código C #, especialmente al cambiar entre las versiones de 32 bits y 64 bits de su proyecto. Tuve que probar varias soluciones alternativas, incluida la construcción de proyectos condicionales, etc., etc. solo para evitar "excepciones de formato no válidas" en diferentes máquinas.
  2. Si administra su propia máquina virtual, está bien. Pero si su proyecto se ejecuta dentro de un entorno restringido como ( Azure (en realidad es imposible dentro de un azul tal como lo menciona el autor de TuesPenchin ), Elastic Beanstalk, etc.) es una pesadilla configurar ese entorno solo para que wkhtmltopdf funcione.
  3. wkhtmltopdf está creando archivos dentro de su servidor, por lo que debe administrar los permisos de los usuarios y otorgar acceso de "escritura" a donde se ejecuta wkhtmltopdf.
  4. Wkhtmltopdf se ejecuta como una aplicación independiente, por lo que su grupo de aplicaciones IIS no lo administra . Por lo tanto, debe alojarlo como un servicio en otra máquina o experimentará 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 una E / S de disco realmente lenta, 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 Editar sección ---

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

Martes

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

o especialmente para aplicaciones web 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 para que también pueda analizar hojas de estilo CSS .

Proporcionan una integración perfecta y fácil de usar con C #.

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

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

Anestis Kivranoglou
fuente
2
Gracias por actualizar tu publicación. Voy a probar PdfSharp. Me salvaste mucho tiempo.
John Henckel
1
PdfSharp es bueno en términos de rendimiento, pero no renderizó flotadores correctamente para mí. Afortunadamente, pude cambiar el marcado para usar buenas tablas antiguas, PdfSharp las maneja bien.
Gebb
3
Probamos con HtmlRenderer. Fue realmente rápido cuando no cargaba ningún CSS. Pero cuando intentamos aplicar CSS (Bootstrap más algunos a medida), el análisis CSS tardó un tiempo (lo que probablemente podríamos mitigar), y la representación fue completamente diferente a la página web.
Excepcional
1
@ user2347528 - mirando la fuente de HtmlRenderer.PdfSharp, no hay forma de arreglar esto, solo toma la altura total de la página y los clips en cada página PDF, lo cual es realmente desafortunado, significa que los PDF de varias páginas con esta biblioteca realmente pueden ' No se haga.
Mr. Bungle
3
BS. Esto crea una imagen del HTML y agrega la imagen al archivo pdf. Este no es un PDF real en absoluto. Además, PDF es un formato de gráficos vectoriales, puede desplazarse casi infinitamente, por supuesto, excepto si el PDF consta de un gráfico de trama, que es lo que produce esta biblioteca.
Stefan Steiger
191

Actualización: ahora recomendaría PupeteerSharp sobre wkhtmltopdf.

Prueba 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.

Marko
fuente
17
soporta .NET ??
Kiquenet
66
Es un ejecutable independiente. Puede iniciarlo como un proceso, pasando una URL del documento HTML como argumento.
Marek
46
@bamccaig Ya lo tengo =) github.com/gmanny/Pechkin Expone todas las funciones utilizables de la biblioteca y también tiene un contenedor para usar en múltiples hilos. Y está en NuGet.
Gman
77
Para usar esto en C # stackoverflow.com/questions/4651373/…
Daniel Little
77
@ AdamMoszczyński: De Wikipedia : La LGPL permite a los desarrolladores y las empresas utilizar e integrar el software LGPL en su propio software (incluso propietario) sin que sea necesario (según los términos de un copyleft fuerte) liberar el código fuente de sus propias partes de software.
Oliver
34

Recientemente realicé un PoC con respecto a la conversión de HTML a PDF y quería compartir mis resultados.

Mi favorito con diferencia es OpenHtmlToPdf

Ventajas de esta herramienta:

  • Muy buena compatibilidad 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
  • Gratis y OpenSource ( licencia Creative Commons Attribution 3.0 )
  • Disponible a través de NuGet

Otras herramientas probadas:

Markus
fuente
+1 para esto, probé HtmlRenderer para PdfSharp pero encontré demasiados problemas con los saltos de página. Puedo vivir con la dependencia de wkHtmlToPdf en este proyecto, por lo que esta solución fue excelente: representa el HTML maravillosamente.
jmdon
Se veía hermosa, pero wow, tomó mucho tiempo. 30 segundos, con un tema de arranque, etc., página bastante simple, pero no obstante.
Nicholas Petersen
Stephanie de IronPDF aquí. Aquí hay un ejemplo de código sobre cómo usar IronPDF para convertir html a PDF en C #. Puede encontrar más en nuestro tutorial html a pdf en nuestro sitio web. using IronPdf; IronPdf.HtmlToPdf Renderer = new IronPdf.HtmlToPdf(); // Render an HTML document or snippet as a string Renderer.RenderHtmlAsPdf("<h1>Hello World</h1>").SaveAs("html-string.pdf");
Stephanie
Usé iText pdfHtml pero no es compatible background-color. OpenHtmlToPdf funciona perfectamente de forma gratuita.
Hp93
Estoy de acuerdo con la superioridad de OpenHtmlToPdf. Además, admite la combinación de .exe y .dll con ILMerge.
saygley
30

Última actualización: marzo de 2020

Esta es la lista de opciones para la conversión de HTML a PDF en .NET que he reunido (algunas gratuitas y otras pagas)

Si ninguna de las opciones anteriores le ayuda, siempre puede buscar los paquetes NuGet https://www.nuget.org/packages?q=html+pdf

Mauricio Gracia Gutierrez
fuente
1
¿Has probado alguna de rendimiento? buscamos mejorar los tiempos de conversión actuales y estamos explorando otras bibliotecas para obtener estos beneficios de rendimiento
desde
No he hecho ninguna comparación de rendimiento, especialmente porque es una lista muy larga, tal vez alguien ya ha hecho una "revisión de rendimiento de bibliotecas .net de generación de PDF" o similar
Mauricio Gracia Gutiérrez
28

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. aquí hay uno que no depende de IE.

El código es algo como esto:

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.

Jason
fuente
35
no es útil porque debes comprar la biblioteca
d1jhoni1b
47
d1jhoni1b, ¿cómo hace que esto no sea útil? Si es una herramienta de pago, se podría decir que es costosa, pero no inútil solo con ese criterio.
Don Rolling
3
Es cierto que EO.Pdf no usa IE. Pero parece generar instancias de 32 bits de un navegador webkit en segundo plano. Verifique su lista de procesos y los verá como instancias de rundll32.exe que apuntan a la dll EO.PDF. Entonces todavía es un poco hacky en mi opinión.
Matt
1
No es compatible con media = "print", lo cual es realmente doloroso.
Marat Faskhiev
15
Licencia de desarrollador individual por $ 650. Eso es costoso
Abhijeet Nagre
25

Recomiendo mucho a 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 un fanático del proyecto :)

Kim Tranjan
fuente
3
Parece de hecho bastante útil. Vale la pena señalar que a partir de hoy (10/05/15), es el contenedor .Net más descargado para wkhtmtopdf (como un paquete Nuget).
ken2k
3
Lo intenté, desafortunadamente no pude hacerlo funcionar en las páginas web de azure.
gabriel14
Esta biblioteca funciona bien cuando la ejecuto localmente en mi máquina, pero en el servidor de alojamiento, veo el siguiente error al azar. El PDF se genera a veces, pero a veces arroja el siguiente error. "Error. Se produjo un error al procesar su solicitud. No se puede generar PDF: (código de salida: 1)"
user2347528
wkhtmtopdf depende de GDI + o x-server si está ejecutando en Mono / Linux. Así que esto no es útil para entornos de servidor ...
nuzzolilo
Es bueno y funciona como se esperaba, pero veo un problema de calidad de bits en mi pdf, ¿podemos mejorar esto?
Bharat
13

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

Stewart
fuente
44
Tenga en cuenta que la última vez que verificamos winnovative era incompatible con IE9 (ya que usaban el motor de renderización IE GDI que se eliminó en IE9). Entonces, si tiene IE9 instalado en la máquina que lo está utilizando, la conversión no funcionaría. Es posible que lo hayan solucionado para cuando lea esto, pero muchos de los componentes comerciales utilizaron el motor de renderizado IE y se desacoplaron con IE9, por lo que vale la pena verificarlo.
fubaar
Winnovative fue el más fácil de configurar y simplemente salió de la caja. Pero: 1. NO FUNCIONA en los sitios web de Azure, solo en CloudApp. 2. es lento, lleva unos buenos 8 segundos generar un PDF simple en una máquina virtual Azure D1
jsgoupil
Confirmar. Es muy lento Lo comparé con wkhtmltopdf.
Marat Faskhiev
Winnovative Library es muy costosa. Unos $ 650 por licencia de desarrollador y $ 1200 por otra licencia.
Abhijeet Nagre
Winnovative HTML to PDF Converter funciona en sitios web de Azure y no depende de IE como se sugirió en un comentario. Consulte el Winnovative HTML to PDF para la solución de Azure en el sitio web: winnovative-software.com/html-to-pdf-converter-azure.aspx . Para mejorar el tiempo de conversión, configure HtmlToPdf.ConversionDelay = 0. El convertidor está usando un retraso predeterminado para manejar páginas HTML que actualizan su contenido después de cargar la página.
EvoPdf
9

Essential PDF se puede utilizar para convertir HTML a PDF : muestra 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 usar diferentes motores de renderizado HTML: Internet Explorer (predeterminado) y WebKit (mejor salida).

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

Nota: Trabajo para Syncfusion.

Davis Jebaraj
fuente
8

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 un envoltorio delgado alrededor de eso en C #. Por ejemplo, como se hizo en este tutorial .

Stewart
fuente
El tutorial utiliza un componente de un sitio web que ya no existe.
Tom Winter
7

Utilicé ExpertPDF Html To Pdf Converter . Hace un trabajo decente. Desafortunadamente, no es gratis.

charpdevel0p3r
fuente
¿ExpertPDf tiene una opción para marcar con agua los documentos?
user1799214
@ user1799214 - Sí, ExpertPDF admite marcas de agua. Ver aquí para el código de muestra. Lo he usado con éxito con marcas de agua en uno de mis sitios web.
Theophilus
Funciona bastante bien, pero no responden a las preguntas de soporte.
Michael Freidgeim
7

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.

Pablo
fuente
7

¡Actualización de 2018, y usemos la ecuación estándar HTML + CSS = PDF!

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

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

Peter Krauss
fuente
1
Las soluciones vinculadas por print-css.rocks cuestan $ 2,950.00 para PDFreactor, $ 3800 para Prince y $ 5,000.00 para Antenna House Formatter V7. Y Weasyprint parece ser para Python.
MDave
6

Puede usar la función de impresión a PDF de Google Chrome desde su modo sin cabeza. Encontré que este es el método más simple pero más robusto.

var url = "/programming/564650/convert-html-to-pdf-in-net";
var chromePath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe";
var output = Path.Combine(Environment.CurrentDirectory, "printout.pdf");
using (var p = new Process())
    {
        p.StartInfo.FileName = chromePath;
        p.StartInfo.Arguments = $"--headless --disable-gpu --print-to-pdf={output} {url}";
        p.Start();
        p.WaitForExit();
    }
Leonard AB
fuente
Oye, esto es realmente genial para el servidor propio y vps. Gracias por compartir.
mjb
Para permitir que ASP.NET en IIS ejecute un programa externo con permiso de acceso de escritura, el grupo de aplicaciones> configuración avanzada> identidad> establecido en "LocalSystem"
mjb
4

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.

Christophe Trevisani Chavey
fuente
10
Lo hemos usado durante un par de años y hemos encontrado que es bastante doloroso de usar. Mal soporte, muy quisquilloso como resultado de su envoltorio alrededor del motor de renderizado IE, mala calidad de imagen y compresión, capacidad limitada para personalizar la solicitud realizada para manejar algunos escenarios de uso más avanzados (como el suministro de cookies y encabezados de solicitud). Supongo que su funcionamiento está sujeto a lo que necesita que haga.
moribvndvs
3
+1 para ABCPdf. El comentarista anterior no debe haber hablado con la misma gente de soporte que hice: siempre me respondieron y siempre tuvieron una solución para cualquier problema que tuviéramos. Ahora admiten el uso de Gecko como motor de renderizado en lugar de IE. Puede elegir el que desee en tiempo de ejecución. ABC te permite hacer literalmente todo lo que PDF te permite hacer.
Steve
12
Demasiado caro y poco apoyo. No recomiendo abcPDF en absoluto.
Vivek
Lo he usado también durante los últimos 6 años, y para ser justos, nos ha servido bien.
toepoke.co.uk
¿No es esta respuesta otra repetición de stackoverflow.com/a/2182212/471213 ? Quiero decir, el otro tipo que está afiliado al programa al menos proporcionó algunas líneas de código de ejemplo
usr-local-ΕΨΗΕΛΩΝ
4

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

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

Trivial de usar y tiene control total sobre el diseño, ya que puede usar vistas de afeitar con datos de su modelo y contenedor de ViewBag.

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

http://www.rotativahq.com/

Cuentas gratuitas disponibles.

Giorgio Bozio
fuente
¿Esto depende de Itextsharp y, por lo tanto, debe tener una licencia para que itextsharp lo use?
Micah Armantrout
2
@MicahArmantrout No, no lo hace. Utiliza wkhtmltopdf.exe para crear el archivo PDF. No se necesita licencia.
Giorgio Bozio
@MicahArmantrout, ¿no es iTextSharp también GNU GPL? gnu.org/licenses/agpl.html
Pranav Singh
No recomendamos el uso de versiones anteriores a iText (Sharp) 5 tanto por razones técnicas como legales. stackoverflow.com/questions/8517776/itexsharp-license
Micah Armantrout
4

A continuación se muestra un ejemplo de conversión de html + css a PDF con 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();
}
Sergey Malyutin
fuente
Tenga en cuenta que iTextSharp funciona con XHtml y es bastante sensible a la calidad de su html. Se rompería, donde SelectPdf y HiqPdf no lo harían.
Salvaje
3

Depende de cualquier otro requisito que tenga.

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 de impresión 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 PDFizer para hacer el trabajo.

Runa Grimstad
fuente
3

PDF Vision es bueno. Sin embargo, debe tener plena confianza para usarlo. Ya envié un correo electrónico y pregunté por qué mi HTML no se convertía en el servidor, pero funcionó bien en localhost.

Miguel
fuente
2

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 funcionó bastante bien para mi proyecto paralelo, pero todo depende de lo que realmente necesites.

La compañía que lo hace vende los archivos binarios compilados, pero puede descargarlos y compilarlos desde la fuente y usarlos 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 en unos 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

enriquein
fuente
hola, ¿puedes proporcionar un enlace y también una guía sobre cómo usarlo con c # asp.net gracias
user287745
static.persistedthoughts.com/htmldoc_1.9.1586-setup.exe Tenga en cuenta que este es un programa de línea de comandos. Debe ejecutarlo desde su aplicación para que funcione. Puede encontrar la documentación para sus argumentos y advertencias en el Capítulo 4 en: easysw.com/htmldoc/documentation.php
enriquein
No estoy seguro de cuán útil sería esto hoy en día, pero si te ayuda: dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein
El sitio web ya no está en funcionamiento.
Tom Winter
2

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

ExpertPdf Html To Pdf Converter es muy fácil de usar y es compatible con el último html5 / css3. Puede 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 una secuencia de archivo en el disco.

charpdevel0p3r
fuente
No necesita usar una biblioteca comercial si necesita una representación html perfecta en pdf
obayhan
Estoy empezando a creer esto. He probado 5 de los regalos y todos tienen una cosa que me arruina. Desde atragantarse a una página que está más allá de un simple mundo hola, hasta verse horrible, creo que voy a tener que gastar algo de dinero para un convertidor real. Las muestras de cada uno de los productos comerciales en realidad funcionan de la manera que esperaría que saliera el PDF.
Herb Meehan
@obayhan: me gustaría creerte. Tal vez podría compartir con nosotros un enlace a las herramientas que encuentre tan buenas.
Peter Wone
@PeterWone en la parte superior hay muchas alternativas de código abierto como puedes ver fácilmente. Pedirle a alguien que comparta las mismas cosas es solo robar tiempo. Pero si los probó todos y no está satisfecho, espero que comparta sus comentarios debajo de ellos sobre lo que no le satisface y tal vez entonces ayude a aumentar el conocimiento.
obayhan
@obayhan - ¿Por qué repetir lo que otros ya han hecho? Se dividen en tres categorías: no son realmente libres, dependencias inaceptables como wkhtmltopdf o IE9, y el Representador HTML para PDFSharp. HR para PDF # es el único en C # puro y hace un trabajo horrible de paginación: muestra una página larga y la corta, a menudo recortando líneas de texto. Si puedo encontrar el tiempo para reescribir completamente el renderizador, HR para PDF # ganaría sin dudas: es rápido, gratuito y no tiene dependencias. Pero eso sería un nuevo procesador, me temo.
Peter Wone
2

Esta es una biblioteca gratuita y funciona muy fácilmente: OpenHtmlToPdf

string timeStampForPdfName = DateTime.Now.ToString("yyMMddHHmmssff");

string serverPath = System.Web.Hosting.HostingEnvironment.MapPath("~/FolderName");
string pdfSavePath = Path.Combine(@serverPath, "FileName" + timeStampForPdfName + ".FileExtension");


//OpenHtmlToPdf Library used for Performing PDF Conversion
var pdf = Pdf.From(HTML_String).Content();

//FOr writing to file from a ByteArray
 File.WriteAllBytes(pdfSavePath, pdf.ToArray()); // Requires System.Linq
Abhishek Sengupta
fuente
2

Parece que hasta ahora la mejor solución gratuita de .NET es la biblioteca TuesPechkin , que es un envoltorio alrededor del wkhtmltopdf biblioteca nativa .

Ahora he usado la versión de un solo subproceso para convertir unos pocos miles de cadenas HTML a archivos PDF y parece funcionar muy bien. Se supone que también funciona en entornos de subprocesos múltiples (IIS, por ejemplo), pero no lo he probado.

Además, dado que quería usar la última versión de wkhtmltopdf (0.12.5 en el momento de la escritura), descargué el archivo DLL del sitio web oficial, lo copié en la raíz de mi proyecto, configuré la copia para que salga a verdadero e inicialicé la biblioteca como entonces:

var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));

El código anterior buscará exactamente "wkhtmltox.dll", así que no cambie el nombre del archivo. Usé la versión de 64 bits de la DLL.

Asegúrese de leer las instrucciones para entornos de subprocesos múltiples, ya que tendrá que inicializarlo solo una vez por ciclo de vida de la aplicación, por lo que deberá colocarlo en un singleton o algo.

Shahin Dohan
fuente
1

Aquí hay una envoltura para wkhtmltopdf.dll por pruiz

Y un contenedor para wkhtmltopdf.exe por Codaxy
, también en nuget .

Garfield
fuente
¿Algún documento o tutorial sobre cómo usarlos? solo hay código fuente allí sin ninguna documentación
Burjua
1
Descargue el código y eche un vistazo a las pruebas unitarias. Eso debería darle algunas buenas muestras de uso.
Garfield
En realidad no ayuda, de hecho, puede incluso no llegar las pruebas de la solución pruiz de trabajo, se dice No tests are run because no tests are loaded or the selected tests are disabledgooglear no ayuda tampoco
Burjua
@Burjua, esto está comúnmente relacionado con la versión del corredor de prueba que está utilizando. Sin embargo, intenta abrir un problema en el sitio del proyecto de mi github y trataré de ayudarte.
Pablo Ruiz García
Hola, este contenedor funciona bien, pero no muestra mis gráficos circulares de Google. Entonces, hasta que pueda resolver esto, tendría que encontrar otra solución.
Andre Lombaard
1

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

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 coloque la solución interna.

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

El siguiente código genera un 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;
}
Shan Khan
fuente
¿Puedes compartir tu código fuente completo? Soy nuevo en C #, así que me estoy atascando incluso en las importaciones.
Sibi John
1

También puede verificar Spire , que le permite crear HTML to PDFcon este simple 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 #

Satinder singh
fuente
Spire genera un archivo PDF que es solo una imagen. Algunos de los CSS no son correctos, como ignorar las fuentes en negrita.
Salvaje
Vea la respuesta a mi pregunta sobre la generación de los PDF como una imagen: e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage
Spire es el cuarto que he probado en esta página y creo que es el mejor, gracias.
MDave
1

Como representante del software HiQPdf, creo que la mejor solución es el convertidor HiQPdf HTML a PDF para .NET . Contiene el motor de renderizado HTML5, CSS3, SVG y JavaScript más avanzado del mercado. También hay una versión gratuita de la biblioteca HTML a PDF que puede utilizar para producir de forma gratuita hasta 3 páginas PDF. El código mínimo de C # para producir un PDF como 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 convertidor HTML a PDF de HiQPdf .

HiQPdf
fuente
1
Produce resultados decentes, pero al igual que SelectPdf, puede tener un gran éxito en su tiempo de compilación y desplegar el tamaño del paquete. Casi duplicaba el tiempo de construcción de Visual Studio. También tuve dificultades para llenar mi página (el html era demasiado pequeño en el medio) en ese sentido, SelectPdf hizo un mejor trabajo.
Salvaje
1
El llenado de páginas con contenido HTML depende de la propiedad HtmlToPdf.BrowserWidth. Tiene 1200 píxeles por defecto, pero puede configurarlo en 800 píxeles y el HTML debería llenar muy bien toda la página PDF. Puede encontrar una demostración en vivo y un código de muestra para esto en hiqpdf.com/demo/HtmlFittingAndScalingOptions.aspx
HiQPdf
1
Tampoco es compatible con .NET Core.
Taylor Buchanan
1

Es muy probable que la mayoría de los proyectos incluyan un motor C / C ++ en lugar de implementar una solución C # desde cero. Prueba el Proyecto Gotenberg .

Para probarlo

docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6

Ejemplo de rizo

curl --request POST \
    --url http://localhost:3000/convert/url \
    --header 'Content-Type: multipart/form-data' \
    --form remoteURL=https://brave.com \
    --form marginTop=0 \
    --form marginBottom=0 \
    --form marginLeft=0 \
    --form marginRight=0 \
    -o result.pdf

C # sample.cs

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
using static System.Console;

namespace HelloWorld
{
    class Program
    {
        public static async Task Main(string[] args)
        {
            try
            {
                var client = new HttpClient();            
                var formContent = new MultipartFormDataContent
                    {
                        {new StringContent("https://duckduckgo.com/"), "remoteURL"},
                        {new StringContent("0"), "marginTop" }
                    };
                var result = await client.PostAsync(new Uri("http://localhost:3000/convert/url"), formContent);
                await File.WriteAllBytesAsync("duckduck.com.pdf", await result.Content.ReadAsByteArrayAsync());
            }
            catch (Exception ex)
            {
                WriteLine(ex);
            }
        }
    }
}

Compilar

csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe
Alex Nolasco
fuente
0

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

Puede pasar la cadena o archivo HTML, o transmitir para generar el PDF. Use el código a continuación (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";   
}   

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

Constantina
fuente
1
BitDefender informa: "¡Malware detectado! El acceso a esta página ha sido bloqueado". No tengo opinión sobre si este informe es genuino o un falso positivo.
GeoffM
0

Para convertir HTML a PDF en C #, use ABCpdf .

ABCpdf puede hacer uso de los motores de renderizado Gecko o Trident, por lo que su tabla HTML tendrá el mismo aspecto que aparece en Firefox e Internet Explorer.

Hay una demostración en línea de ABCpdf en www.abcpdfeditor.com. Puede usar esto para ver cómo se procesarán sus tablas primero, sin necesidad de descargar e instalar software.

Para representar páginas web completas, necesitará las funciones AddImageUrl o AddImageHtml. Pero si todo lo que quiere hacer es simplemente agregar texto con estilo HTML, entonces puede probar la función AddHtml, como se muestra a continuación:

Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();

ABCpdf es un título de software comercial, sin embargo, la edición estándar a menudo se puede obtener de forma gratuita bajo una oferta especial.

AffineMesh
fuente
9191
Realmente deberías escribir en todas tus respuestas que trabajas para websupergoo. Del faq: However, you must disclose your affiliation with the product in your answers. Also, if a huge percentage of your posts include a mention of your product, you're clearly here for the wrong reasons. Todas sus respuestas han sido sobre ABCpdf
jgauffin
12
¡Ay! Sugerí ABCpdf porque es un componente con el que estoy familiarizado. Si un gran porcentaje de mis publicaciones se relacionan con archivos PDF, es solo porque me abstengo de contribuir a temas fuera de mis áreas de interés. Disculpas
AffineMesh
En defensa de los carteles, el sitio web hace que el producto sea bastante bueno.
Tom Winter