在.NET中将HTML转换为PDF

问题描述 投票:387回答:34

我想通过将HTML内容传递给函数来生成PDF。我已经为此使用了iTextSharp,但是当它遇到表格并且布局变得混乱时它表现不佳。

有没有更好的办法?

c# html pdf itextsharp
34个回答
182
投票

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

对于.NET,您可以使用此small library轻松调用wkhtmtopdf命令行实用程序。


6
投票

如果你真的不需要真正的.Net PDF库,那么有很多free HTML to PDF tools,其中许多可以从命令行运行。

一种解决方案是选择其中一种,然后在C#中编写一个薄包装器。例如,在this tutorial中所做的。


6
投票

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

有关HTML-to-PDF要求的好消息。作为this answer showed,W3C标准css-break-3将解决问题......这是一个候选推荐标准,计划在经过测试后在2017年或2018年变成最终建议书。

正如print-css.rocks所展示的那样,有一些解决方案,有C#插件。


4
投票

ABC PDF.net (HTTP://呜呜呜.Web super高OO.com/ABC PDF-5.htm)

我们使用并推荐。

非常好的组件,它不仅将网页转换为PDF,如图像,但真正转换文本,图像,格式等...

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


4
投票

下面是使用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();
}

3
投票

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

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

编辑:如果您的Html是XHtml,您可以使用PDFizer来完成这项工作。


3
投票

PDF Vision很好。但是,您必须具有完全信任才能使用它。我已经通过电子邮件询问为什么我的HTML没有在服务器上转换,但它在localhost上工作正常。


3
投票

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


2
投票

我一直在寻找这个。我遇到了HTMLDOC http://www.easysw.com/htmldoc/这是一个免费的开源命令行应用程序,它将HTML文件作为参数并从中吐出PDF。这对我来说非常适合我的项目,但这一切都取决于你真正需要什么。

制作它的公司销售已编译的二进制文件,但您可以从源代码下载和编译,并免费使用它。我设法编译了一个非常新的版本(版本1.9),我打算在几天内发布它的二进制安装程序,所以如果你感兴趣我可以在发布后立即提供它的链接。

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


2
投票

如果您需要PDF格式的完美html渲染,则需要使用商业库。

ExpertPdf Html To Pdf Converter非常易于使用,它支持最新的html5 / css3。您可以将整个网址转换为pdf:

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

或者是一个html字符串:

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

您还可以直接将生成的pdf文档保存到磁盘上的文件流中。


2
投票

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

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

使用起来很简单,并且您可以完全控制布局,因为您可以使用剃刀视图和Model和ViewBag容器中的数据。

我在Azure上开发了SaaS版本。它使WebApi或任何.Net应用程序,服务,Azure网站,Azure webjob,无论运行.Net都更容易使用它。

http://www.rotativahq.com/

免费帐户可用。


176
投票

编辑:新建议HTML Renderer for PDF using PdfSharp

(在尝试wkhtmltopdf并建议避免它之后)

HtmlRenderer.PdfSharp是一个100%完全C#托管代码,易于使用,线程安全,最重要的是免费(New BSD License)解决方案。

用法

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

一个非常好的替代是Free VersioniTextSharp

在版本4.1.6之前,iTextSharp根据LGPL许可证获得许可,版本直到4.16(或者也可能有叉子)作为包提供,可以自由使用。当然有人可以使用续5+ paid version

我试图在我的项目中集成wkhtmltopdf解决方案并遇到了一些障碍。

我个人会避免在托管企业应用程序上使用基于wkhtmltopdf的解决方案,原因如下。

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

--- PRE编辑部分---

对于想要在更简单的应用程序/环境中从html生成pdf的任何人,我将旧帖子作为建议。

TuesPechkin

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

或者特别是对于MVC Web应用程序(但我认为您可以在任何.net应用程序中使用它)

Rotativa

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

他们都利用wkhtmtopdf二进制文件将html转换为pdf。它使用webkit引擎来呈现页面,因此它也可以解析css样式表。

它们提供易于使用的与C#的无缝集成。

Rotativa还可以从任何Razor View直接生成PDF。

此外,对于真实的Web应用程序,他们还管理线程安全等...


1
投票

这是pruiz的wkhtmltopdf.dll的a wrapper

和cazxswpoi for Ckhxy的wkhtmltopdf.exe - 还有a wrapper


1
投票

我发现并用于生成javascript和样式渲染视图或html页面的PDF的最佳工具是phantomJS。

使用在示例文件夹的exe的根目录中找到的rasterize.js函数下载.exe文件并放入解决方案。

它甚至允许您在不打开该文件的情况下以任何代码下载文件,并且还允许在应用样式和特殊jquery时下载文件。

以下代码生成PDF文件:

on nuget

1
投票

作为HiQPdf软件的代表,我认为最好的解决方案是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; } 。它包含市场上最先进的HTML5,CSS3,SVG和JavaScript渲染引擎。还有一个HiQPdf HTML to PDF converter for .NET,您可以用它免费制作最多3个PDF页面。从HTML页面生成PDF作为byte []的最小C#代码是:

free version of the HTML to PDF library

您可以在HtmlToPdf htmlToPdfConverter = new HtmlToPdf(); // set PDF page size, orientation and margins htmlToPdfConverter.Document.PageSize = PdfPageSize.A4; htmlToPdfConverter.Document.PageOrientation = PdfPageOrientation.Portrait; htmlToPdfConverter.Document.Margins = new PdfMargins(0); // convert HTML to PDF byte[] pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory(url); 中找到有关ASP.NET和MVC的更详细示例。


1
投票

这是一个免费的库,非常容易使用:OpenHtmlToPdf

HiQPdf HTML to PDF Converter examples repository

0
投票

试试这个PDF Duo .Net转换组件,无需使用额外的dll即可转换string timeStampForPdfName = DateTime.Now.ToString("yyMMddHHmmssff"); string serverPath = System.Web.Hosting.HostingEnvironment.MapPath("~/FolderName"); string pdfSavePath = Path.Combine(@serverPath, "FileName" + timeStampForPdfName + ".FileExtension"); //OpenHtmlToPdf Library used for Performing PDF Conversion var pdf = Pdf.From(HTML_String).Content(); //FOr writing to file from a ByteArray File.WriteAllBytes(pdfSavePath, pdf.ToArray()); // Requires System.Linq 应用程序。

您可以传递HTML字符串或文件,也可以传输流以生成PDF。使用下面的代码(示例C#):

HTML to PDF from ASP.NET

您可以在以下网址找到Info + C#/ VB示例: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"; }


0
投票

0
投票

您可以创建HTML页面的位图,然后使用例如nant将位图插入到PDF中,而不是直接将HTML解析为PDF。

这是一个如何获取URL的位图的代码。我在SO的某个地方找到了它,如果我找到了源码,我会链接它。

iTextSharp

0
投票

使用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; } 转换器,您可以在一行中转换HTML字符串

Winnovative HTML to PDF

基本URL用于解析HTML字符串中相对URL引用的图像。或者,您可以使用HTML中的完整URL或使用src =“data:image / png”嵌入图像作为图像标记。

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


0
投票

如果您希望用户在浏览器中下载渲染页面的pdf,那么解决问题的最简单方法就是

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

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

window.print(); 

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

局限性

您无法在服务器端存储该文件。用户提示打印页面,而不是手动保存页面。页面必须在选项卡中呈现。


0
投票

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

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

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

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


29
投票

大多数HTML到PDF转换器依赖于IE来进行HTML解析和渲染。当用户更新他们的IE时,这可能会中断。 Here是一个不依赖IE的人。

代码是这样的:

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

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


0
投票

如果你正在使用itextsharp dll,不需要添加第三方dll(插件),我认为你使用htmlworker而不是使用xmlworker你可以轻松地将你的html转换为pdf。 有些css不起作用他们是PDFmyURL .NET component documentation Supported CSS

Full Explain with example Reference Click here

27
投票

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

到目前为止,我最喜欢的是OpenHtmlToPdf

该工具的优点:

  • 非常好的HTML兼容性(例如,它是我的示例中唯一一个工具,当一个表跨越多个页面时正确重复表头)
  • 流畅的API
  • 免费和开源(Creative Commons Attribution 3.0 license
  • 可通过NuGet获得

其他测试工具:


20
投票

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

使用示例:

通过NuGet安装。

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

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


13
投票

Winnovative提供支持HTML输入的.Net PDF库。他们提供无限的free trial。根据您希望部署项目的方式,这可能就足够了。


8
投票

Essential PDF可以用于convert HTML to PDFC# sample。链接到此处的示例是基于ASP.NET的,但可以从Windows窗体,WPF,ASP.NET Webforms和ASP.NET MVC使用该库。该库提供了使用不同HTML呈现引擎的选项:Internet Explorer(默认)和WebKit(最佳输出)。

如果您符合资格,可通过community license计划免费提供整套控件(商业应用程序)。社区许可证是完整的产品,没有任何限制或水印。

注意:我为Syncfusion工作。


7
投票

我使用了ExpertPDF Html To Pdf Converter。做得体。不幸的是,这不是免费的。


7
投票

还有一个新的基于Web的文档生成应用程序 - DocRaptor.com。看似易于使用,并且有免费选项。

© www.soinside.com 2019 - 2024. All rights reserved.