首页 文章

在.NET中将HTML转换为PDF

提问于
浏览
367

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

有没有更好的办法?

30 回答

  • 0

    好的,使用这种技术....

    src可以从here下载它需要nant

  • 1

    尝试使用此 PDF Duo .Net 转换组件来转换HTML to PDF from ASP.NET应用程序,而无需使用其他dll .

    您可以传递HTML字符串或文件,也可以传输流以生成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";   
    }
    

    您可以在以下位置找到C#/ VB示例:http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

  • 5

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

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

    文件:PDFmyURL .NET component documentation

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

  • 3

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

    我最喜欢的是OpenHtmlToPdf

    此工具的优点:

    • 非常好的HTML兼容性(例如,它是我的示例中唯一一个在表跨越多个页面时正确重复表头的工具)

    • Fluent API

    • Free和OpenSource(Creative Commons Attribution 3.0 license

    • 可通过NuGet获取

    其他测试工具:

  • 0

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

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

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

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

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

    http://www.rotativahq.com/

    免费帐户可用 .

  • 29

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

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

    注意:我为Syncfusion工作 .

  • 0

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

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

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

  • 3

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

    使用示例:

    通过NuGet安装 .

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

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

  • 2

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

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

  • 174

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

  • 3

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

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

    它甚至允许您在不打开该文件的情况下以任何代码下载文件,并且还允许在应用样式和特殊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;
    }
    
  • 13

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

  • 6

    EDIT: New Suggestion HTML Renderer for PDF using PdfSharp

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

    HtmlRenderer.PdfSharp是 100% fully C# managed codeeasy 使用,线程安全,最重要的是 FREENew BSD License)解决方案 .

    用法

    • 下载 HtmlRenderer.PdfSharp nuget包 .

    • 使用示例方法 .

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

    A very Good Alternate Free VersioniTextSharp

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

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

    由于以下原因,我个人会避免在Hosted Enterprise应用程序上使用 wkhtmltopdf - based 解决方案 .

    • 首先,wkhtmltopdf是C实现而不是C#,您将遇到在C#代码中嵌入它的各种问题,尤其是在项目的32位和64位版本之间切换时 . 不得不尝试几种解决方法,包括条件项目建设等,以避免在不同的机器上"invalid format exceptions" .

    • 如果您管理自己的虚拟机,那就可以了 . 但是如果你的项目是在一个受限制的环境中运行的(例如,TuesPenchin作者提到的,实际上不可能使用azure),那么,只有wkhtmltopdf能够工作才能配置该环境,这是一场噩梦 .

    • wkhtmltopdf正在服务器中创建文件,因此您必须管理用户权限并授予对运行wkhtmltopdf的位置的"write"访问权限 .

    • Wkhtmltopdf作为独立应用程序运行,因此它的 not managed by your IIS application pool . 因此,您必须将其作为服务托管在另一台计算机上,否则您将在 生产环境 服务器上遇到巨大的处理峰值和内存消耗 .

    • 它使用临时文件来生成pdf,在像 AWS EC2 这样的情况下,磁盘i / o非常慢,这是一个很大的性能问题 .

    • 许多用户报告的最讨厌的"Unable to load DLL 'wkhtmltox.dll'"错误 .

    --- PRE Edit Section ---

    For anyone who want to generate pdf from html in simpler applications / environments I leave my old post as suggestion.

    TuesPechkin

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

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

    Rotativa

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

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

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

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

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

  • 4

    使用Winnovative HTML to PDF转换器,您可以在一行中转换HTML字符串

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

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

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

  • 20

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

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

  • 1

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

  • 0

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

    我们使用并推荐 .

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

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

  • 4

    这取决于您的任何其他要求 .

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

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

  • 0

    2018的更新,让我们使用标准的HTML CSS = PDF等式!

    HTML-to-PDF要求有好消息 . 作为this answer showedthe W3C standard css-break-3 will solve the problem ......这是一份候选建议书,计划在经过测试后于2017年或2018年转为最终建议书 .

    由于没有那么标准,所以有解决方案,带有C#插件,如print-css.rocks所示 .

  • 0

    这是由pruiz为wkhtmltopdf.dll的a wrapper

    a wrapper for Ckhxy的wkhtmltopdf.exe

  • 7

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

  • 2

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

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

    Detailed article : How to convert HTML to PDF in asp.net C#

  • 7

    作为HiQPdf软件的代表,我相信最好的解决方案是HiQPdf HTML to PDF converter for .NET . 它包含市场上最先进的HTML5,CSS3,SVG和JavaScript渲染引擎 . 还有一个free version of the HTML to PDF library,您可以使用它来免费制作最多3个PDF页面 . 从HTML页面生成PDF作为byte []的最小C#代码是:

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

    您可以在HiQPdf HTML to PDF Converter examples repository中找到有关ASP.NET和MVC的更详细示例 .

  • 0

    如果你需要使用商业图书馆需要在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文档保存到磁盘上的文件流中 .

  • -1

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

    window.print();
    

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

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

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

    Limitation

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

  • 6

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

  • 20

    如果你正在使用itextsharp dll,不需要添加第三方dll(插件),我认为你使用的是htmlworker而不是使用xmlworker你可以轻松地将你的html转换为pdf .

    有些css不起作用他们是Supported CSS
    Full Explain with example Reference Click here

    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();
    
  • 153

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

    代码是这样的:

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

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

  • 2

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

    这是一个如何获取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;
    }
    

相关问题