Generate PDF based on HTML code (iTextSharp, PDFSharp?)
Solution 1
I know this question is old, but here's a clean way to do it...
You can use HtmlRenderer combined with PDFSharp to accomplish this:
Bitmap bitmap = new Bitmap(1200, 1800);
Graphics g = Graphics.FromImage(bitmap);
HtmlRenderer.HtmlContainer c = new HtmlRenderer.HtmlContainer();
c.SetHtml("<html><body style='font-size:20px'>Whatever</body></html>");
c.PerformPaint(g);
PdfDocument doc = new PdfDocument();
PdfPage page = new PdfPage();
XImage img = XImage.FromGdiPlusImage(bitmap);
doc.Pages.Add(page);
XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);
xgr.DrawImage(img, 0, 0);
doc.Save(@"C:\test.pdf");
doc.Close();
Some people report that the final image looks a bit blurry, apparently due to automatic anti-aliasing. Here's a post message on how to fix that: http://forum.pdfsharp.com/viewtopic.php?f=2&t=1811&start=0
Solution 2
No, PDFsharp does not currently include code to parse HTML files.
Solution 3
Old question but none of above worked for me. Then i tried generatepdf
method of HtmlRenderer in combination of pdfsharp. Hope it helps:
You must install a nuget named HtmlRenderer.pdfsharp
.
var doc = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf("Your html in a string",PageSize.A4);
PdfPage page = new PdfPage();
XImage img = XImage.FromGdiPlusImage(bitmap);
doc.Pages.Add(page);
XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);
xgr.DrawImage(img, 0, 0);
doc.Save(Server.MapPath("test.pdf"));
doc.Close();
Solution 4
In a project that I developed last year I used wkhtmltopdf (http://wkhtmltopdf.org/) to generate pdf from html then I read the file and get back it to the user.
It works fine for me and it could be an idea for you...
Solution 5
If you only want a certain HTML string written to the PDF but not the rest, you can use the HtmlContainer
from TheArtOfDev HtmlRenderer. This snippet uses V 1.5.1
using PdfSharp.Pdf;
using PdfSharp;
using PdfSharp.Drawing;
using TheArtOfDev.HtmlRenderer.PdfSharp;
//create a pdf document
using (PdfDocument doc = new PdfDocument())
{
doc.Info.Title = "StackOverflow Demo PDF";
//add a page
PdfPage page = doc.AddPage();
page.Size = PageSize.A4;
//fonts and styles
XFont font = new XFont("Arial", 10, XFontStyle.Regular);
XSolidBrush brush = new XSolidBrush(XColor.FromArgb(0, 0, 0));
using (XGraphics gfx = XGraphics.FromPdfPage(page))
{
//write a normal string
gfx.DrawString("A normal string written to the PDF.", font, brush, new XRect(15, 15, page.Width, page.Height), XStringFormats.TopLeft);
//write the html string to the pdf
using (var container = new HtmlContainer())
{
var pageSize = new XSize(page.Width, page.Height);
container.Location = new XPoint(15, 45);
container.MaxSize = pageSize;
container.PageSize = pageSize;
container.SetHtml("This is a <b>HTML</b> string <u>written</u> to the <font color=\"red\">PDF</font>.<br><br><a href=\"http://www.google.nl\">www.google.nl</a>");
using (var measure = XGraphics.CreateMeasureContext(pageSize, XGraphicsUnit.Point, XPageDirection.Downwards))
{
container.PerformLayout(measure);
}
gfx.IntersectClip(new XRect(0, 0, page.Width, page.Height));
container.PerformPaint(gfx);
}
}
//write the pdf to a byte array to serve as download, attach to an email etc.
byte[] bin;
using (MemoryStream stream = new MemoryStream())
{
doc.Save(stream, false);
bin = stream.ToArray();
}
}
Admin
Updated on July 09, 2022Comments
-
Admin almost 2 years
Does the library PDFSharp can - like iTextSharp - generate PDF files *take into account HTML formatting *? (bold (strong), spacing (br), etc.)
Previously I used iTextSharp and roughly handled in such a way (code below):
string encodingMetaTag = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"; string htmlCode = "text <div> <b> bold </ b> or <u> underlined </ u> <div/>"; var sr = new StringReader (encodingMetaTag + htmlCode); var pdfDoc = new Document (PageSize.A4, 10f, 10f, 10f, 0f); var = new HTMLWorker htmlparser (pdfDoc); PdfWriter.GetInstance (pdfDoc, HttpContext.Current.Response.OutputStream); pdfDoc.Open (); htmlparser.Parse (sr); pdfDoc.Close ();
incorporated into the appropriate HTML form to a PDF document dealt with the class object HTMLWorker.. so what with PDFSharp? Has PDFSharp similar solution?