在.NET中将HTML转换为PDF

我想通过将HTML内容传递给一个函数来生成PDF。 我已经使用了iTextSharp,但是在遇到表格时布局不好,布局变得混乱。

有没有更好的办法?

尝试wkhtmtopdf 。 这是迄今为止我发现的最好的工具。

对于.NET,您可以使用这个小型库轻松调用wkhtmtopdf命令行实用程序。

编辑: 使用PdfSharp的PDF 新build议 HTML渲染器

(尝试wkhtmltopdf并build议避免它)

HtmlRenderer.PdfSharp是一个100%完全的C#托pipe代码易于使用,线程安全,最重要的是免费 ( 新的BSD许可证 )解决scheme。

用法

  1. 下载HtmlRenderer.PdfSharp nuget包。
  2. 使用示例方法。

    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; } 

一个很好的替代品是iTextSharp的免费版本

在版本4.1.6之前,iTextSharp获得了LGPL许可证的许可,版本直到4.16(或者也可能有叉)可作为包使用,并且可以自由使用。 当然,有人可以使用继续5+ 付费版本 。

我试图将wkhtmltopdf解决scheme集成到我的项目中,并遇到一些障碍。

我个人会避免在Hosted Enterprise应用程序上使用基于wkhtmltopdf的解决scheme,原因如下。

  1. 首先wkhtmltopdf是用C ++实现的,而不是C#,你会遇到将它embedded到C#代码中的各种问题,特别是在你的项目的32位和64位版本之间切换时。 不得不尝试几个解决方法,包括有条件的项目build设等等,只是为了避免在不同的机器上“无效的格式exception”。
  2. 如果你pipe理自己的虚拟机,那就好了。 但是如果你的项目运行在一个受限制的环境中,比如( Azure (实际上不可能像周二作者所提到的Azure那样), Elastic Beanstalk等等),configuration这个环境只是为了让wkhtmltopdf工作。
  3. wkhtmltopdf正在你的服务器中创build文件,所以你必须pipe理用户的权限,并授予“写”访问wkhtmltopdf运行的地方。
  4. Wkhtmltopdf作为一个独立的应用程序运行,所以它不是由你的IIS应用程序池pipe理的 。 因此,您必须将其作为另一台计算机上的服务托pipe,否则,您将在生产服务器上遇到巨大的处理高峰和内存消耗。
  5. 它使用临时文件来生成pdf,并且在像AWS EC2这样的磁盘I / O非常慢的情况下,这是一个很大的性能问题。
  6. 最讨厌的“无法加载DLL”wkhtmltox.dll“”错误报告了许多用户。

— PRE编辑章节—

对于任何想在简单的应用程序/环境中从html生成pdf的人,我都会把我的旧post留作build议。

TuesPechkin

https://www.nuget.org/packages/TuesPechkin/

或特别是对于MVC Web应用程序(但我想你可以在任何.NET应用程序中使用它)

Rotativa

https://www.nuget.org/packages/Rotativa/

他们都利用wkhtmtopdf二进制转换为PDF格式的HTML。 它使用webkit引擎来渲染页面,所以它也可以parsingcss样式表

它们提供了与C#的无缝集成。

Rotativa也可以从任何Razor视图直接生成PDF。

另外对于真实世界的Web应用程序,他们也pipe理线程安全等。

大多数HTML到PDF转换器依靠IE来做HTMLparsing和渲染。 当用户更新他们的IE时,这可能会中断。 这是一个不依赖于IE浏览器。

代码是这样的:

 EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName); 

像许多其他转换器一样,您可以传递文本,文件名或Url。 结果可以保存到文件或stream中。

认真地强烈推荐NReco 。 它有免费和付费版本,真的值得。 它在后台使用wkhtmtopdf,但你只需要一个程序集。 太棒了。

使用示例:

通过NuGet安装。

 var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now); var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent); 

免责声明:我不是开发者,只是项目的粉丝:)

Winnovative提供支持HTMLinput的.Net PDF库。 他们提供无限的免费试用 。 取决于你希望如何部署你的项目,这可能就足够了。

我最近执行了一个关于HTML到PDF转换的PoC,并想分享我的结果。

我最喜欢的是OpenHtmlToPdf

这个工具的优点:

  • 非常好的HTML兼容性(例如,在我的示例中,它是表跨越多个页面时正确重复表格标题的唯一工具)
  • stream利的API
  • 免费和开源( 知识共享署名3.0许可证 )
  • 通过NuGet提供

其他testing工具:

我使用ExpertPDF Html到PDF格式转换器 。 做一个体面的工作。 不幸的是,这不是免费的。

如果你真的不需要一个真正的.Net PDF库,那么有许多免费的HTML to PDF工具 ,其中许多可以从命令行运行。

一个解决办法是select其中的一个,然后在C#中编写一个薄包装器。 例如,像本教程中所做的那样。

还有一个新的基于networking的文档生成应用程序 – DocRaptor.com 。 似乎易于使用,并有一个免费的select。

ABCpdf.NET(http://www.websupergoo.com/abcpdf-5.htm);

我们使用和推荐。

非常好的组件,它不仅像一个图像转换成PDF格式的网页,但真正转换文本,图像,格式等…

这不是免费的,但很便宜。

这取决于你有任何其他的要求。

一个非常简单但不容易部署的解决scheme是使用WebBrowser控件加载Html,然后使用打印方法打印到本地安装的PDF打印机。 有几个免费的PDF打印机可用,WebBrowser控件是.Net框架的一部分。

编辑:如果你的HTML是XHTML,你可以使用PDFizer做这项工作。

PDF视觉是好的。 但是,您必须拥有完全信任才能使用它。 我已经发邮件,问为什么我的HTML不在服务器上转换,但它在本地主机上运行良好。

基本PDF可用于将HTML转换为PDF: C#示例 。 链接到这里的示例是基于ASP.NET的,但可以从Windows窗体,WPF,ASP.NET Webforms和ASP.NET MVC使用该库。 该库提供了使用不同的HTML渲染引擎的选项:Internet Explorer(默认)和WebKit(最佳输出)。

如果您符合条件,整套控件都可以通过社区许可证程序免费获得(商业应用程序)。 社区许可证是完整的产品,没有限制或水印。

注意:我为Syncfusion工作。

我也一直在寻找这个。 我遇到了HTMLDOC http://www.easysw.com/htmldoc/这是一个免费的开源命令行应用程序,它将HTML文件作为参数,并从中提取出PDF。; 这对我的项目很有帮助,但这一切都取决于你真正需要的东西。

该公司销售编译的二进制文件,但你可以免费下载和编译源代码。 我设法编译了一个相当新的版本(对于版本1.9),我打算在几天内为它发布一个二进制安装程序,所以如果你有兴趣,我可以提供一个链接,只要我发布。

编辑(2/25/2014):似乎文档和网站转移到http://www.msweet.org/projects.php?Z1

你需要使用商业图书馆,如果你需要在PDF格式完美的HTML渲染。

ExpertPdf Html到PDF格式转换器是非常容易使用,它支持最新的HTML5 / css3。 您可以将整个url转换为pdf:

 using ExpertPdf.HtmlToPdf; byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url); 

或者一个htmlstring:

 using ExpertPdf.HtmlToPdf; byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl); 

您也可以select将生成的pdf文档直接保存到磁盘上的文件stream。

下面是使用iTextSharp(iTextSharp + itextsharp.xmlworker)将html + css转换为PDF的示例

 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(); } 

这是由pruiz wkhtmltopdf.dll 的包装

并由Codaxy wkhtmltopdf.exe 包装
– 也在nuget上 。

最好的工具,我已经find并用于生成JavaScript的JavaScript和样式呈现视图或HTML页面是幻影JSON

用例子文件夹的exe根目录中find的rasterize.js函数下载.exe文件并放入解决scheme中。

它甚至可以让你下载任何代码的文件,而无需打开该文件也可以下载文件时,风格和专门jQuery的应用。

以下代码生成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; } 

我是Rotativa软件包的作者。 它允许直接从剃刀视图创buildPDF文件:

https://www.nuget.org/packages/Rotativa/

由于您可以使用模型和ViewBag容器中的数据使用razor视图,所以使用起来很简单,而且您可以完全控制布局。

我在Azure上开发了一个SaaS版本。 它使得从WebApi或任何.Net应用程序,服务,Azure网站,Azure webjob以及任何运行.Net的应用程序中使用它变得更加容易。

http://www.rotativahq.com/

免费帐户可用。

我发现下面的库更有效地将html转换为pdf。
nuget : https : //www.nuget.org/packages/Select.HtmlToPdf/

试试这个PDF Duo .Net转换组件,用于将ASP.NET应用程序中的HTML转换为PDF,而无需使用额外的dll。

您可以传递HTMLstring或文件或stream来生成PDF。 使用下面的代码(例子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"; } 

Info + C#/ VB示例,您可以在http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

好的,使用这种技术….

  • FlyingSaucer项目
  • IKVM
  • 存根

src可以从这里下载它需要nant

使用Winnovative HTML to PDF Converter,您可以将HTMLstring转换为单行

 byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl); 

基本URL用于parsingHTMLstring中相对URL引用的图像。 或者,您可以在HTML中使用完整的url,或者使用src =“data:image / png”embedded图片作为图片标签。

在回答关于Winnovative转换器的“fubaar”用户评论时,需要进行更正。 转换器不使用IE作为渲染引擎。 它实际上不依赖于任何已安装的软件,并且渲染与WebKit引擎兼容。

如果您希望用户在浏览器中下载呈现页面的PDF,那么最简单的解决scheme是

 window.print(); 

在客户端会提示用户保存当前页面的pdf。 您也可以通过链接样式自定义pdf的外观

 <link rel="stylesheet" type="text/css" href="print.css" media="print"> 

打印时,print.css应用于html。

局限性

您不能将文件存储在服务器端。 用户提示打印页面,而不是手动保存页面。 必须在页面中呈现页面。

PDFmyURL最近发布了一个用于网页/ HTML到PDF转换的.NET组件。 这有一个非常用户友好的界面,例如:

 PDFmyURL pdf = new PDFmyURL("yourlicensekey"); pdf.ConvertURL("http://www.example.com", Application.StartupPath + @"\example.pdf"); 

文档: PDFmyURL .NET组件文档

免责声明:我为拥有PDFmyURL的公司工作

已经如果你正在使用itextsharp DLL,不需要添加第三方的DLL的(插件),我想你使用的是htmlworker,而不是使用xmlworker,你可以很容易地将您的HTML转换为PDF。

一些CSS不能工作,他们是支持的CSS
充分说明与示例参考点击这里

  MemoryStream memStream = new MemoryStream(); TextReader xmlString = new StringReader(outXml); using (Document document = new Document()) { PdfWriter writer = PdfWriter.GetInstance(document, memStream); //document.SetPageSize(iTextSharp.text.PageSize.A4); document.Open(); byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(outXml); MemoryStream ms = new MemoryStream(byteArray); XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, ms, System.Text.Encoding.UTF8); document.Close(); } Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf"); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.BinaryWrite(memStream.ToArray()); Response.End(); Response.Flush(); 

你也可以检查Spire ,它允许你用这段简单的代码创buildHTML to PDF

  string htmlCode = "<p>This is ap 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"); 

详细文章: 如何在HTML中将HTML转换为PDF C#

使用EVO HTML to PDF Library for .NET,您可以获得从HTML到PDF的最准确转换。 所有漂亮的HTML5function,如CSS3,SVG和networking字体在专业级别都得到很好的支持。

下面你可以find一个完整的ASP.NET C#代码示例,它演示了如何从给定的URL或HTMLstring转换网页时设置PDF页面大小和方向。 每行代码都是注释。 PDF在内存缓冲区中生成,并作为响应发送到浏览器,提示下载:

 protected void convertToPdfButton_Click(object sender, EventArgs e) { // Create a HTML to PDF converter object with default settings HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter(); // Set PDF page size which can be a predefined size like A4 or a custom size in points // Leave it not set to have a default A4 PDF page htmlToPdfConverter.PdfDocumentOptions.PdfPageSize = SelectedPdfPageSize(); // Set PDF page orientation to Portrait or Landscape // Leave it not set to have a default Portrait orientation for PDF page htmlToPdfConverter.PdfDocumentOptions.PdfPageOrientation = SelectedPdfPageOrientation(); // The buffer to receive the generated PDF document byte[] outPdfBuffer = null; if (convertUrlRadioButton.Checked) { string url = urlTextBox.Text; // Convert the HTML page given by an URL to a PDF document in a memory buffer outPdfBuffer = htmlToPdfConverter.ConvertUrl(url); } else { string htmlString = htmlStringTextBox.Text; string baseUrl = baseUrlTextBox.Text; // Convert a HTML string with a base URL to a PDF document in a memory buffer outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl); } // Send the PDF as response to browser // Set response content type Response.AddHeader("Content-Type", "application/pdf"); // Instruct the browser to open the PDF file as an attachment or inline Response.AddHeader("Content-Disposition", String.Format("{0}; filename=Getting_Started.pdf; size={1}", openInlineCheckBox.Checked ? "inline" : "attachment", outPdfBuffer.Length.ToString())); // Write the PDF document buffer to HTTP response Response.BinaryWrite(outPdfBuffer); // End the HTTP response and stop the current page processing Response.End(); } 

You can test the converter online and also find code C# code samples for all the converter features in the HTML to PDF live demo on product website.

2017's update, and Let's use standard HTML+CSS=PDF equation!

There are good news for HTML-to-PDF demands. As this answer showed , the W3C standard css-break-3 will solve the problem … It is a Candidate Recommendation with plan to turn into definitive Recommendation this year, after tests.

As not-so-standard there are solutions, with plugins for C#, as showed by print-css.rocks .

Instead of parsing HTML directly to PDF, you can create an Bitmap of your HTML-page and then insert the Bitmap into your PDF, using for example iTextSharp .

Here's a code how to get an Bitmap of an URL. I found it somewhere here on SO, if I find the source I'll link it.

 public System.Drawing.Bitmap HTMLToImage(String strHTML) { System.Drawing.Bitmap myBitmap = null; System.Threading.Thread myThread = new System.Threading.Thread(delegate() { // create a hidden web browser, which will navigate to the page System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser(); // we don't want scrollbars on our image myWebBrowser.ScrollBarsEnabled = false; // don't let any errors shine through myWebBrowser.ScriptErrorsSuppressed = true; // let's load up that page! myWebBrowser.Navigate("about:blank"); // wait until the page is fully loaded while (myWebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) System.Windows.Forms.Application.DoEvents(); myWebBrowser.Document.Body.InnerHtml = strHTML; // set the size of our web browser to be the same size as the page int intScrollPadding = 20; int intDocumentWidth = myWebBrowser.Document.Body.ScrollRectangle.Width + intScrollPadding; int intDocumentHeight = myWebBrowser.Document.Body.ScrollRectangle.Height + intScrollPadding; myWebBrowser.Width = intDocumentWidth; myWebBrowser.Height = intDocumentHeight; // a bitmap that we will draw to myBitmap = new System.Drawing.Bitmap(intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding); // draw the web browser to the bitmap myWebBrowser.DrawToBitmap(myBitmap, new System.Drawing.Rectangle(0, 0, intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding)); }); myThread.SetApartmentState(System.Threading.ApartmentState.STA); myThread.Start(); myThread.Join(); return myBitmap; }