我想通过将HTML内容传递给函数来生成PDF。我已经为此使用了iTextSharp,但它在遇到表和布局时表现不佳。
有没有更好的办法?
我想通过将HTML内容传递给函数来生成PDF。我已经为此使用了iTextSharp,但它在遇到表和布局时表现不佳。
有没有更好的办法?
当前回答
HTML到PDF的转换大多依赖于IE来完成HTML的解析和渲染。这可以打破用户更新他们的IE。这里有一个不依赖IE的。
代码是这样的:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
像许多其他转换器一样,您可以传递文本、文件名或Url。结果可以保存到文件或流中。
其他回答
HTML到PDF的转换大多依赖于IE来完成HTML的解析和渲染。这可以打破用户更新他们的IE。这里有一个不依赖IE的。
代码是这样的:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
像许多其他转换器一样,您可以传递文本、文件名或Url。结果可以保存到文件或流中。
不是直接将HTML解析为PDF,而是可以创建HTML页面的位图,然后将位图插入到PDF中,例如使用iTextSharp。
这是一个代码如何获得一个URL的位图。我在这里找到了它,如果我找到了源,我会链接它。
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;
}
另一个建议是尝试https://grabz.it的解决方案。
他们提供了一个很好的。net API来捕捉屏幕截图,并以一种简单灵活的方式进行操作。
要在你的应用中使用它,你首先需要获得key + secret并下载。net SDK(它是免费的)。
下面是一个简短的例子。
要使用这个API,你首先需要创建一个GrabzItClient类的实例,将你的应用密钥和应用秘密从你的GrabzIt账户传递给构造函数,如下面的例子所示:
//Create the GrabzItClient class
//Replace "APPLICATION KEY", "APPLICATION SECRET" with the values from your account!
private GrabzItClient grabzIt = GrabzItClient.Create("Sign in to view your Application Key", "Sign in to view your Application Secret");
现在,要将HTML转换为PDF,你需要做的是:
grabzIt.HTMLToPDF("<html><body><h1>Hello World!</h1></body></html>");
你也可以转换为图像:
grabzIt.HTMLToImage("<html><body><h1>Hello World!</h1></body></html>");
接下来需要保存图像。你可以使用两个可用的保存方法之一,如果公共可访问的回调句柄可用,则保存,如果没有SaveTo。详细信息请查看文档。
如果你需要完美的html pdf渲染,你需要使用商业库。
ExpertPdf Html To Pdf Converter非常容易使用,它支持最新的html5/css3。您可以将整个url转换为pdf:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);
或者HTML字符串:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);
您还可以选择直接将生成的pdf文档保存到磁盘上的文件流。
编辑:新建议 使用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应用程序,他们还管理线程安全等…