net mvc exportar example convert c# pdf-generation itextsharp xmlworker

c# - mvc - Cómo convertir HTML a PDF usando iTextSharp



html to pdf.net free (3)

Quiero convertir el siguiente HTML a PDF usando iTextSharp, pero no sé por dónde empezar:

<style> .headline{font-size:200%} </style> <p> This <em>is </em> <span class="headline" style="text-decoration: underline;">some</span> <strong>sample<em> text</em></strong> <span style="color: red;">!!!</span> </p>


@Chris Haas ha explicado muy bien cómo usar itextSharp para convertir HTML a PDF , muy útil
mi complemento es:
Al usar HtmlTextWriter puse etiquetas html dentro de la tabla HTML + CSS en línea obtuve mi PDF como quería sin usar XMLWorker .
Editar : agregar código de muestra:
Página ASPX:

<asp:Panel runat="server" ID="PendingOrdersPanel"> <!-- to be shown on PDF--> <table style="border-spacing: 0;border-collapse: collapse;width:100%;display:none;" > <tr><td><img src="abc.com/webimages/logo1.png" style="display: none;" width="230" /></td></tr> <tr style="line-height:10px;height:10px;"><td style="display:none;font-size:9px;color:#10466E;padding:0px;text-align:right;">blablabla.</td></tr> <tr style="line-height:10px;height:10px;"><td style="display:none;font-size:9px;color:#10466E;padding:0px;text-align:right;">blablabla.</td></tr> <tr style="line-height:10px;height:10px;"><td style="display:none;font-size:9px;color:#10466E;padding:0px;text-align:right;">blablabla</td></tr> <tr style="line-height:10px;height:10px;"><td style="display:none;font-size:9px;color:#10466E;padding:0px;text-align:right;">blablabla</td></tr> <tr style="line-height:10px;height:10px;"><td style="display:none;font-size:11px;color:#10466E;padding:0px;text-align:center;"><i>blablabla</i> Pending orders report<br /></td></tr> </table> <asp:GridView runat="server" ID="PendingOrdersGV" RowStyle-Wrap="false" AllowPaging="true" PageSize="10" Width="100%" CssClass="Grid" AlternatingRowStyle-CssClass="alt" AutoGenerateColumns="false" PagerStyle-CssClass="pgr" HeaderStyle-ForeColor="White" PagerStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center" RowStyle-HorizontalAlign="Center" DataKeyNames="Document#" OnPageIndexChanging="PendingOrdersGV_PageIndexChanging" OnRowDataBound="PendingOrdersGV_RowDataBound" OnRowCommand="PendingOrdersGV_RowCommand"> <EmptyDataTemplate><div style="text-align:center;">no records found</div></EmptyDataTemplate> <Columns> <asp:ButtonField CommandName="PendingOrders_Details" DataTextField="Document#" HeaderText="Document #" SortExpression="Document#" ItemStyle-ForeColor="Black" ItemStyle-Font-Underline="true"/> <asp:BoundField DataField="Order#" HeaderText="order #" SortExpression="Order#"/> <asp:BoundField DataField="Order Date" HeaderText="Order Date" SortExpression="Order Date" DataFormatString="{0:d}"></asp:BoundField> <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status"></asp:BoundField> <asp:BoundField DataField="Amount" HeaderText="Amount" SortExpression="Amount" DataFormatString="{0:C2}"></asp:BoundField> </Columns> </asp:GridView> </asp:Panel>

C # code:

protected void PendingOrdersPDF_Click(object sender, EventArgs e) { if (PendingOrdersGV.Rows.Count > 0) { //to allow paging=false & change style. PendingOrdersGV.HeaderStyle.ForeColor = System.Drawing.Color.Black; PendingOrdersGV.BorderColor = Color.Gray; PendingOrdersGV.Font.Name = "Tahoma"; PendingOrdersGV.DataSource = clsBP.get_PendingOrders(lbl_BP_Id.Text); PendingOrdersGV.AllowPaging = false; PendingOrdersGV.Columns[0].Visible = false; //export won''t work if there''s a link in the gridview PendingOrdersGV.DataBind(); //to PDF code --Sam string attachment = "attachment; filename=report.pdf"; Response.ClearContent(); Response.AddHeader("content-disposition", attachment); Response.ContentType = "application/pdf"; StringWriter stw = new StringWriter(); HtmlTextWriter htextw = new HtmlTextWriter(stw); htextw.AddStyleAttribute("font-size", "8pt"); htextw.AddStyleAttribute("color", "Grey"); PendingOrdersPanel.RenderControl(htextw); //Name of the Panel Document document = new Document(); document = new Document(PageSize.A4, 5, 5, 15, 5); FontFactory.GetFont("Tahoma", 50, iTextSharp.text.BaseColor.BLUE); PdfWriter.GetInstance(document, Response.OutputStream); document.Open(); StringReader str = new StringReader(stw.ToString()); HTMLWorker htmlworker = new HTMLWorker(document); htmlworker.Parse(str); document.Close(); Response.Write(document); } }

por supuesto, incluye iTextSharp Refrences to cs file

using iTextSharp.text; using iTextSharp.text.pdf; using iTextSharp.text.html.simpleparser; using iTextSharp.tool.xml;

¡Espero que esto ayude!
Gracias


Aquí está el enlace que utilicé como guía. ¡Espero que esto ayude!

Conversión de HTML a PDF usando ITextSharp

protected void Page_Load(object sender, EventArgs e) { try { string strHtml = string.Empty; //HTML File path -http://aspnettutorialonline.blogspot.com/ string htmlFileName = Server.MapPath("~") + "//files//" + "ConvertHTMLToPDF.htm"; //pdf file path. -http://aspnettutorialonline.blogspot.com/ string pdfFileName = Request.PhysicalApplicationPath + "//files//" + "ConvertHTMLToPDF.pdf"; //reading html code from html file FileStream fsHTMLDocument = new FileStream(htmlFileName, FileMode.Open, FileAccess.Read); StreamReader srHTMLDocument = new StreamReader(fsHTMLDocument); strHtml = srHTMLDocument.ReadToEnd(); srHTMLDocument.Close(); strHtml = strHtml.Replace("/r/n", ""); strHtml = strHtml.Replace("/0", ""); CreatePDFFromHTMLFile(strHtml, pdfFileName); Response.Write("pdf creation successfully with password -http://aspnettutorialonline.blogspot.com/"); } catch (Exception ex) { Response.Write(ex.Message); } } public void CreatePDFFromHTMLFile(string HtmlStream, string FileName) { try { object TargetFile = FileName; string ModifiedFileName = string.Empty; string FinalFileName = string.Empty; /* To add a Password to PDF -http://aspnettutorialonline.blogspot.com/ */ TestPDF.HtmlToPdfBuilder builder = new TestPDF.HtmlToPdfBuilder(iTextSharp.text.PageSize.A4); TestPDF.HtmlPdfPage first = builder.AddPage(); first.AppendHtml(HtmlStream); byte[] file = builder.RenderPdf(); File.WriteAllBytes(TargetFile.ToString(), file); iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(TargetFile.ToString()); ModifiedFileName = TargetFile.ToString(); ModifiedFileName = ModifiedFileName.Insert(ModifiedFileName.Length - 4, "1"); string password = "password"; iTextSharp.text.pdf.PdfEncryptor.Encrypt(reader, new FileStream(ModifiedFileName, FileMode.Append), iTextSharp.text.pdf.PdfWriter.STRENGTH128BITS, password, "", iTextSharp.text.pdf.PdfWriter.AllowPrinting); //http://aspnettutorialonline.blogspot.com/ reader.Close(); if (File.Exists(TargetFile.ToString())) File.Delete(TargetFile.ToString()); FinalFileName = ModifiedFileName.Remove(ModifiedFileName.Length - 5, 1); File.Copy(ModifiedFileName, FinalFileName); if (File.Exists(ModifiedFileName)) File.Delete(ModifiedFileName); } catch (Exception ex) { throw ex; } }

Puede descargar el archivo de muestra. Simplemente coloque el html que desea convertir en la carpeta de files y ejecútelo. Generará automáticamente el archivo pdf y lo colocará en la misma carpeta. Pero en su caso, puede especificar su ruta html en la variable htmlFileName .


En primer lugar, HTML y PDF no están relacionados, aunque se crearon en la misma época. HTML está destinado a transmitir información de mayor nivel, como párrafos y tablas. Aunque existen métodos para controlarlo, depende en última instancia del navegador dibujar estos conceptos de nivel superior. El PDF está destinado a transmitir documentos y los documentos deben "verse" igual donde sea que se presten.

En un documento HTML, puede tener un párrafo que sea 100% ancho y, dependiendo del ancho de su monitor, podría tomar 2 líneas o 10 líneas y cuando lo imprima podrían ser 7 líneas y cuando lo mira en su teléfono podría toma 20 líneas Sin embargo, un archivo PDF debe ser independiente del dispositivo de renderizado, por lo que independientemente del tamaño de su pantalla, siempre debe mostrarse exactamente igual.

Debido a los puntos anteriores, PDF no admite elementos abstractos como "tablas" o "párrafos". Hay tres cosas básicas que admite PDF: texto, líneas / formas e imágenes. (Hay otras cosas como anotaciones y películas, pero estoy tratando de mantenerlo simple aquí.) En un PDF, no dice "aquí hay un párrafo, ¡el navegador hace lo suyo!". En cambio, dices: "dibuja este texto en esta ubicación X, Y exacta usando esta fuente exacta y no te preocupes, he calculado previamente el ancho del texto, así que sé que encajará en esta línea". Tampoco dices "aquí hay una tabla", sino que dices "dibuja este texto en esta ubicación exacta y luego dibujas un rectángulo en esta otra ubicación exacta que he calculado previamente para que sepa que aparecerá alrededor del texto ".

En segundo lugar, iText e iTextSharp analizan HTML y CSS. Eso es. ASP.Net, MVC, Razor, Struts, Spring, etc., son todos frameworks HTML pero iText / iTextSharp es 100% inconsciente de ellos. Lo mismo ocurre con DataGridViews, Repeaters, Templates, Views, etc. que son todas abstracciones específicas del framework. Es su responsabilidad obtener el HTML de su elección de marco, iText no lo ayudará. Si recibes una excepción que diga que The document has no pages o si piensas que "iText no está analizando mi HTML", es casi definitivo que no tienes HTML , solo piensas que sí.

En tercer lugar, la clase incorporada que ha existido durante años es HTMLWorker sin embargo, esta ha sido reemplazada por XMLWorker ( Java / .Net ). Se está realizando un trabajo cero en HTMLWorker que no es compatible con archivos CSS y solo tiene soporte limitado para las propiedades de CSS más básicas y realmente se rompe en ciertas etiquetas . Si no ve el atributo HTML o la propiedad y el valor de CSS en este archivo , probablemente no sea compatible con HTMLWorker . XMLWorker puede ser más complicado a veces, pero esas complicaciones también lo hacen more extensible .

A continuación se muestra el código C # que muestra cómo analizar etiquetas HTML en abstracciones iText que se agregan automáticamente al documento en el que está trabajando. C # y Java son muy similares, por lo que debería ser relativamente fácil convertir esto. El ejemplo n. ° 1 usa el HTMLWorker para analizar la cadena HTML. Como solo se admiten estilos en línea, class="headline" se ignora, pero todo lo demás debería funcionar. El ejemplo n. ° 2 es el mismo que el primero, excepto que utiliza XMLWorker en XMLWorker lugar. El ejemplo n. ° 3 también analiza el ejemplo simple de CSS.

//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(); //Our sample HTML and CSS var example_html = @"<p>This <em>is </em><span class=""headline"" style=""text-decoration: underline;"">some</span> <strong>sample <em> text</em></strong><span style=""color: red;"">!!!</span></p>"; var example_css = @".headline{font-size:200%}"; /************************************************** * Example #1 * * * * Use the built-in HTMLWorker to parse the HTML. * * Only inline CSS is supported. * * ************************************************/ //Create a new HTMLWorker bound to our document using (var htmlWorker = new iTextSharp.text.html.simpleparser.HTMLWorker(doc)) { //HTMLWorker doesn''t read a string directly but instead needs a TextReader (which StringReader subclasses) using (var sr = new StringReader(example_html)) { //Parse the HTML htmlWorker.Parse(sr); } } /************************************************** * Example #2 * * * * Use the XMLWorker to parse the HTML. * * Only inline CSS and absolutely linked * * CSS is supported * * ************************************************/ //XMLWorker also reads from a TextReader and not directly from a string using (var srHtml = new StringReader(example_html)) { //Parse the HTML iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml); } /************************************************** * Example #3 * * * * Use the XMLWorker to parse HTML and CSS * * ************************************************/ //In order to read CSS as a string we need to switch to a different constructor //that takes Streams instead of TextReaders. //Below we convert the strings into UTF8 byte array and wrap those in MemoryStreams using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_css))) { using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_html))) { //Parse the HTML iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss); } } 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(); } //Now we just need to do something with those bytes. //Here I''m writing them to disk but if you were in ASP.Net you might Response.BinaryWrite() them. //You could also write the bytes to a database in a varbinary() column (but please don''t) or you //could pass them to another function for further PDF processing. var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf"); System.IO.File.WriteAllBytes(testFile, bytes);

Actualización de 2017

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 Candidata con el plan de convertirse en Recomendación definitiva este año, después de las pruebas.

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