Comment convertir le HTML en PDF en utilisant iTextSharp

Je veux convertir le HTML ci-dessous en PDF en utilisant iTextSharp mais je ne sais pas par où commencer:

 .headline{font-size:200%}  

This is some sample text !!!

Tout d’abord, HTML et PDF ne sont pas liés, bien qu’ils aient été créés à peu près au même moment. HTML est destiné à transmettre des informations de haut niveau telles que des paragraphes et des tableaux. Bien qu’il existe des méthodes pour le contrôler, il incombe au navigateur de dessiner ces concepts de haut niveau. PDF est destiné à véhiculer des documents et les documents doivent “regarder” les mêmes où qu’ils soient rendus.

Dans un document HTML, vous avez peut-être un paragraphe 100% large et, en fonction de la largeur de votre moniteur, il peut prendre 2 lignes ou 10 lignes et lorsque vous l’imprimez, il peut contenir 7 lignes. prendre 20 lignes. Un fichier PDF, cependant, doit être indépendant du périphérique de rendu. Il doit donc toujours être identique, quelle que soit la taille de votre écran.

À cause des exigences ci-dessus, PDF ne supporte pas les choses abstraites comme les “tables” ou les “paragraphes”. PDF prend en charge trois éléments de base: le texte, les lignes / formes et les images. (Il y a d’autres choses comme les annotations et les films, mais j’essaie de garder les choses simples ici.) Dans un PDF, vous ne dites pas “voici un paragraphe, le navigateur fait votre travail!”. Au lieu de cela, vous dites: “dessinez ce texte à cet emplacement exact X, Y en utilisant cette police exacte et ne vous inquiétez pas, j’ai déjà calculé la largeur du texte, donc je sais que tout ira bien sur cette ligne”. Vous ne dites pas non plus “voici un tableau” mais à la place vous dites “dessinez ce texte à cet endroit précis, puis dessinez un rectangle à cet autre endroit exact que j’ai calculé précédemment, donc je sais qu’il apparaîtra autour du texte “.

Deuxièmement, iText et iTextSharp parsingnt le HTML et le CSS. C’est tout. ASP.Net, MVC, Razor, Struts, Spring, etc. sont tous des frameworks HTML, mais iText / iTextSharp les ignore à 100%. Idem avec DataGridViews, Repeaters, Templates, Views, etc. qui sont toutes des abstractions spécifiques à la structure. Il est de votre responsabilité d’obtenir le code HTML de votre choix de cadre, iText ne vous aidera pas. Si vous obtenez une exception en disant que The document has no pages ou que vous pensez que “iText ne parsing pas mon HTML”, il est presque certain que vous ne possédez pas de code HTML , vous ne le pensez que.

Troisièmement, la classe intégrée qui existe depuis des années est HTMLWorker mais celle-ci a été remplacée par XMLWorker ( Java / .Net ). Le travail HTMLWorker est effectué sur HTMLWorker qui ne supporte pas les fichiers CSS et qui ne prend en charge que de manière limitée les propriétés CSS les plus élémentaires. Si vous ne voyez pas l’ atsortingbut HTML ou la propriété CSS et la valeur dans ce fichier, il n’est probablement pas pris en charge par HTMLWorker . XMLWorker peut parfois être plus compliqué mais ces complications le rendent également plus extensible .

Le code C # ci-dessous montre comment parsingr les balises HTML en abstractions iText qui sont automatiquement ajoutées au document sur lequel vous travaillez. C # et Java sont très similaires, il devrait donc être relativement facile de les convertir. L’exemple # 1 utilise le HTMLWorker pour parsingr la chaîne HTML. Puisque seuls les styles en ligne sont supportés, le class="headline" est ignoré mais tout le rest devrait fonctionner. L’exemple # 2 est le même que le premier sauf qu’il utilise XMLWorker place. L’exemple # 3 parsing également l’exemple CSS simple.

 //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 = @"

This is some sample text!!!

"; 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 ssortingng directly but instead needs a TextReader (which SsortingngReader subclasses) using (var sr = new SsortingngReader(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 ssortingng using (var srHtml = new SsortingngReader(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 ssortingng we need to switch to a different constructor //that takes Streams instead of TextReaders. //Below we convert the ssortingngs 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);

Mise à jour de 2017

Il y a de bonnes nouvelles pour les demandes HTML à PDF. Comme cette réponse l’a montré , le standard css-break-3 du W3C résoudra le problème … Il s’agit d’une recommandation candidate avec un plan pour devenir une recommandation définitive cette année, après les tests.

Comme pas si standard il existe des solutions, avec des plugins pour C #, comme le montre print-css.rocks .

@Chris Haas a très bien expliqué comment utiliser itextSharp pour convertir le HTML en PDF , très utile
mon add est:
En utilisant HtmlTextWriter je mets des balises HTML tableau HTML + CSS en ligne. J’ai obtenu mon fichier PDF comme je le voulais sans utiliser XMLWorker .
Modifier : append un exemple de code:
Page ASPX:

   
blablabla.
blablabla.
blablabla
blablabla
blablabla Pending orders report
no records found

Code C #:

 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 ssortingng attachment = "attachment; filename=report.pdf"; Response.ClearContent(); Response.AddHeader("content-disposition", attachment); Response.ContentType = "application/pdf"; SsortingngWriter stw = new SsortingngWriter(); HtmlTextWriter htextw = new HtmlTextWriter(stw); htextw.AddStyleAtsortingbute("font-size", "8pt"); htextw.AddStyleAtsortingbute("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(); SsortingngReader str = new SsortingngReader(stw.ToSsortingng()); HTMLWorker htmlworker = new HTMLWorker(document); htmlworker.Parse(str); document.Close(); Response.Write(document); } } 

bien sûr, y compris iTextSharp Refrences to cs file

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

J’espère que cela t’aides!
Je vous remercie

À partir de 2018, il y a aussi iText7 (une prochaine itération de l’ancienne bibliothèque iTextSharp) et son package HTML vers PDF disponible: itext7.pdfhtml

L’utilisation est simple:

 HtmlConverter.ConvertToPdf( new FileInfo(@"Path\to\Html\File.html"), new FileInfo(@"Path\to\Pdf\File.pdf") ); 

La méthode a beaucoup plus de surcharges.

Mise à jour: la famille de produits iText * a un double modèle de licence : gratuit pour l’open source, payant pour un usage commercial.

Voici le lien que j’ai utilisé comme guide. J’espère que cela t’aides!

Conversion de HTML en PDF à l’aide d’ITextSharp

 protected void Page_Load(object sender, EventArgs e) { try { ssortingng strHtml = ssortingng.Empty; //HTML File path -http://aspnettutorialonline.blogspot.com/ ssortingng htmlFileName = Server.MapPath("~") + "\\files\\" + "ConvertHTMLToPDF.htm"; //pdf file path. -http://aspnettutorialonline.blogspot.com/ ssortingng 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(ssortingng HtmlStream, ssortingng FileName) { try { object TargetFile = FileName; ssortingng ModifiedFileName = ssortingng.Empty; ssortingng FinalFileName = ssortingng.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.ToSsortingng(), file); iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(TargetFile.ToSsortingng()); ModifiedFileName = TargetFile.ToSsortingng(); ModifiedFileName = ModifiedFileName.Insert(ModifiedFileName.Length - 4, "1"); ssortingng 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.ToSsortingng())) File.Delete(TargetFile.ToSsortingng()); FinalFileName = ModifiedFileName.Remove(ModifiedFileName.Length - 5, 1); File.Copy(ModifiedFileName, FinalFileName); if (File.Exists(ModifiedFileName)) File.Delete(ModifiedFileName); } catch (Exception ex) { throw ex; } } 

Vous pouvez télécharger le fichier exemple. Placez simplement le html vous souhaitez convertir dans le dossier de files et exécutez-le. Il générera automatiquement le fichier pdf et le placera dans le même dossier. Mais dans votre cas, vous pouvez spécifier votre chemin html dans la variable htmlFileName .