Does the library PDFSharp can - like iTextSharp - generate PDF files *take into account HTML formatting *? (bold (strong), spacing
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...
If you need simple parsing in your app and you have control over html input, you can write your own library for this.
I have created one in one of my projects, but unfortunately it cannot be shared yet due to custom features related to specific application.
Basically, you need to follow following logic to implement basic HTML to PDF:
I have given very broad overview of logic here based on my implementation.
You may be having much better idea :)
You can also refer : Writing content of HTML table into PDF doc using iTextSharp in asp.net
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
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();
I know there is a really old question but I realize that there is no one saying actually an accurate method to render an HTML into a PDF. Based on my test I found out that you need the following code to successfully do it.
Bitmap bitmap = new Bitmap(790, 1800);
Graphics g = Graphics.FromImage(bitmap);
XGraphics xg = XGraphics.FromGraphics(g, new XSize(bitmap.Width, bitmap.Height));
TheArtOfDev.HtmlRenderer.PdfSharp.HtmlContainer c = new TheArtOfDev.HtmlRenderer.PdfSharp.HtmlContainer();
c.SetHtml("Your html in a string here");
PdfDocument pdf = new PdfDocument();
PdfPage page = new PdfPage();
XImage img = XImage.FromGdiPlusImage(bitmap);
pdf.Pages.Add(page);
XGraphics xgr = XGraphics.FromPdfPage(pdf.Pages[0]);
c.PerformLayout(xgr);
c.PerformPaint(xgr);
xgr.DrawImage(img, 0, 0);
pdf.Save("test.pdf");
There is another way to do but you might have problems with the size.
PdfDocument pdf = PdfGenerator.GeneratePdf(text, PageSize.A4);
pdf.Save("test.pdf");
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();
}
}