我想通过将HTML内容传递给函数来生成PDF。我已经为此使用了iTextSharp,但它在遇到表和布局时表现不佳。

有没有更好的办法?


当前回答

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

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

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

使用

下载HtmlRenderer。PdfSharp nuget包。 使用实例方法。 public static Byte[] PdfSharpConvert(String html) { 字节[]res = null; 使用(内存流ms =新的内存流()) { var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator。GeneratePdf (html、PdfSharp.PageSize.A4); pdf.Save(女士); res = ms.ToArray(); } 返回res; }

一个非常好的替代是iTextSharp的免费版本

在版本4.1.6之前,iTextSharp是在LGPL许可下授权的,而4.16之前的版本(或者也可能有分叉)是作为包提供的,可以自由使用。当然有人可以使用5+付费版本。

我尝试在我的项目中集成wkhtmltopdf解决方案,遇到了一堆障碍。

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

First of all wkhtmltopdf is C++ implemented not C#, and you will experience various problems embedding it within your C# code, especially while switching between 32bit and 64bit builds of your project. Had to try several workarounds including conditional project building etc. etc. just to avoid "invalid format exceptions" on different machines. If you manage your own virtual machine its ok. But if your project is running within a constrained environment like (Azure (Actually is impossible withing azure as mentioned by the TuesPenchin author) , Elastic Beanstalk etc) it's a nightmare to configure that environment only for wkhtmltopdf to work. wkhtmltopdf is creating files within your server so you have to manage user permissions and grant "write" access to where wkhtmltopdf is running. Wkhtmltopdf is running as a standalone application, so its not managed by your IIS application pool. So you have to either host it as a service on another machine or you will experience processing spikes and memory consumption within your production server. It uses temp files to generate the pdf, and in cases Like AWS EC2 which has really slow disk i/o it is a big performance problem. The most hated "Unable to load DLL 'wkhtmltox.dll'" error reported by many users.

——PRE编辑部分——

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

TuesPechkin

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

或专为MVC Web应用程序 (但我认为你可以在任何。net应用程序中使用它)

旋转

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

他们都利用了 Wkhtmtopdf二进制转换HTML到pdf。它使用webkit引擎来呈现页面,因此它也可以解析css样式表。

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

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

此外,对于现实世界的web应用程序,他们还管理线程安全等…

其他回答

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

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

文档:PDFmyURL .NET组件文档

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

在c#中转换HTML到PDF使用ABCpdf。

ABCpdf可以使用Gecko或Trident呈现引擎,因此您的HTML表看起来与FireFox和Internet Explorer中的相同。

在www.abcpdfeditor.com上有一个ABCpdf的在线演示。您可以使用它来检查您的表将如何首先呈现,而不需要下载和安装软件。

为了渲染整个网页,你需要AddImageUrl或AddImageHtml函数。但如果你想做的只是添加HTML样式的文本,那么你可以尝试AddHtml函数,如下所示:

Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();

ABCpdf是一个商业软件,但是标准版通常可以在特别优惠下免费获得。

与Winnovative HTML到PDF转换器,您可以转换HTML字符串在单行

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

基URL用于解析HTML字符串中相对URL引用的图像。另外,你也可以在HTML中使用完整的url,或者使用src="data:image/png"作为图像标签嵌入图像。

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

HTML到PDF的转换大多依赖于IE来完成HTML的解析和渲染。这可以打破用户更新他们的IE。这里有一个不依赖IE的。

代码是这样的:

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

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

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

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