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?
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?
Respuestas:
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
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.
--- 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.
https://www.nuget.org/packages/TuesPechkin/
o especialmente para aplicaciones web MVC (pero creo que puede usarlo en cualquier aplicación .net)
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.
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.
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:
Otras herramientas probadas:
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");
background-color
. OpenHtmlToPdf funciona perfectamente de forma gratuita.
Ú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)
GemBox.Document
PDF Metamorfosis .Net
HtmlRenderer.PdfSharp
TitiriteroSharp
EO.pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Spire.PDF gratuito para .NET (versión comunitaria)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
Seleccione PDF
Si ninguna de las opciones anteriores le ayuda, siempre puede buscar los paquetes NuGet https://www.nuget.org/packages?q=html+pdf
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.
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 :)
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.
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.
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 .
Utilicé ExpertPDF Html To Pdf Converter . Hace un trabajo decente. Desafortunadamente, no es gratis.
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.
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 .
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();
}
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.
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.
Cuentas gratuitas disponibles.
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();
}
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.
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.
Encontré la siguiente biblioteca más efectiva para convertir html a pdf.
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/
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
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.
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
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.
Aquí hay una envoltura para wkhtmltopdf.dll por pruiz
Y un contenedor para wkhtmltopdf.exe por Codaxy
, también en nuget .
No tests are run because no tests are loaded or the selected tests are disabled
googlear no ayuda tampoco
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;
}
También puede verificar Spire , que le permite crear HTML to PDF
con 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 #
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 .
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
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
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.
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