【问题标题】:Generate PDF from ASP.NET from raw HTML/CSS content?从原始 HTML/CSS 内容从 ASP.NET 生成 PDF?
【发布时间】:2010-10-08 21:12:01
【问题描述】:

我正在发送的电子邮件中附有 PDF 格式的发票。我已经 - 在应用程序的其他地方 - 在 .aspx 页面中创建发票。我想使用 Server.Execute 返回输出 HTML 并从中生成 PDF。否则,我必须使用报告工具在 PDF 上“绘制”发票。这有很多原因,其中最重要的原因是我必须为每个微小的更改更新 .aspx 页面和报告。怎么办……

【问题讨论】:

标签: c# asp.net html pdf


【解决方案1】:

无法直接在 .NET 中从 HTML 字符串生成 PDF,但有许多第三方控件可以正常工作。

我在这方面取得了成功:http://www.html-to-pdf.net 还有这个:http://www.htmltopdfasp.net

要问的重要问题是:

  1. 与 3 种主要浏览器(IE、FF 和 Safari/Chrome)相比,它是否正确呈现?
  2. 它能很好地处理 CSS 吗?
  3. 控件是否有自己的渲染引擎?如果是这样,反弹它。你不想相信一个自制的渲染引擎 - 浏览器有一个很难让所有像素完美的问题。
  4. 第三方控件需要哪些依赖项?越少越好。

还有一些其他的,但它们处理 ActiveX 显示等。

【讨论】:

    【解决方案2】:

    为此,我们使用了一款名为 ABCPDF 的产品,效果非常好。

    http://www.websupergoo.com/abcpdf-1.htm

    【讨论】:

      【解决方案3】:

      这听起来像是Prince 的工作。它可以采用 HTML 和 CSS 并生成 PDF,然后您可以将其呈现给您的用户。它比大多数 Web 浏览器更好地支持 CSS3(工作人员包括 CSS 的发明者 Håkon Wium Lie)。

      查看samples,尤其是维基百科页面,了解它可以生成的精美输出。作者还有一个有趣的Google Tech Talk

      编辑:有一个.NET wrapper 可用。

      【讨论】:

      • 这个产品看起来不错,但它并不能很好地与 .NET 应用程序一起打包。看起来他们有一个至少可以包装的 .dll。
      • 我不能说我已经尝试过 - 我已经将它与 MindTouch Deki 一起使用,它直接调用 .exe。我能说的是输出很漂亮 - 它更像是 LaTeX 而不是 Internet Explorer 中的 CutePDF :)
      • 没有挖掘他们在每个文档的第一页上粘贴的徽标
      • Prince 的付费版本没有徽标。
      • 3800 美元的服务器许可证!
      【解决方案4】:

      wkhtmltopdf 是一个免费且酷炫的 exe,用于从 html 生成 pdf。它是用 C++ 编写的。但是nReco htmltopdf 是这个很棒的工具的包装 dotnet 库。我使用这个 dotnet 库实现了它,它非常好,它自己做所有事情,你只需要提供 html 作为数据源。

      /// <summary>
      /// Converts html into PDF using nReco dll and wkhtmltopdf.exe.
      /// </summary>       
      private byte[] ConvertHtmlToPDF()
      {
        HtmlToPdfConverter nRecohtmltoPdfObj = new HtmlToPdfConverter();
        nRecohtmltoPdfObj.Orientation = PageOrientation.Portrait;
        nRecohtmltoPdfObj.PageFooterHtml = CreatePDFFooter();
        nRecohtmltoPdfObj.CustomWkHtmlArgs = "--margin-top 35 --header-spacing 0 --margin-left 0 --margin-right 0";           
        return nRecohtmltoPdfObj.GeneratePdf(CreatePDFScript() + ShowHtml() + "</body></html>");
      }
      

      上述函数摘自下面的链接帖子,详细解释了它。 HTML to PDF in ASP.Net

      【讨论】:

      • NReco.LT (for .NET Core) 是一个付费包,需要商业许可
      【解决方案5】:

      最初的问题是关于将包含发票的另一个 aspx 页面转换为 PDF 文档。发票可能正在使用一些会话数据,用户建议使用 Server.Execute() 获取发票页面 HTML 代码,然后将该代码转换为 PDF。直接转换发票页面 URL 是不可能的,因为在转换过程中会创建一个新会话并且会话数据会丢失。

      这实际上是一种在转换期间保存会话数据的好技术,该技术应用于 EvoPdf 库的Convert a HTML Page to PDF in Same Session ASP.NET Demo。获取发票页面呈现的 HTML 字符串并将该字符串转换为 PDF 的完整 C# 代码是:

      // Execute the invoice page and get the HTML string rendered by this page
      TextWriter outTextWriter = new StringWriter();
      Server.Execute("Invoice.aspx", outTextWriter);
      
      string htmlStringToConvert = outTextWriter.ToString();
      
      // Create a HTML to PDF converter object with default settings
      HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
      
      // Use the current page URL as base URL
      string baseUrl = HttpContext.Current.Request.Url.AbsoluteUri;
      
      // Convert the page HTML string to a PDF document in a memory buffer
      byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlStringToConvert, 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("attachment; filename=Convert_Page_in_Same_Session.pdf; size={0}", 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();
      

      【讨论】:

        【解决方案6】:

        只要你能确保使用正确的 XHTML,你也可以使用像Alt-Soft's Xml2PDF 这样的产品,通过 XSLT/XSL-FO 将 XML (XHTML) 转换为 PDF。

        要掌握它需要一点学习曲线,但一旦你“掌握”它,它就会非常有效!

        马克

        【讨论】:

        • 标准许可证:1,495 美元
        • @Junto:是的 - 所以 - 创建软件需要花钱 - 所以这个工具不只是免费 - 但是有一个IS免费的 Xml2Pdf工作站版也是
        • @marc-s 当然要花钱,但透露这是付费产品并且需要标准许可证才能从 HTML 内容生成 PDF 也没有什么坏处。
        【解决方案7】:

        由于您正在生成答案,因此您可以使用 Report.NET 之类的工具: http://sourceforge.net/projects/report/

        我不同意您不能直接从输出转换为 PDF 的答案,因为您可以“重新调用”页面并将 HTML 作为流获取并进行转换。但是,我不确定您要使用什么工具来执行此操作。换句话说,这是可能的,但我不确定它是否值得。 PDF 创建库,如 Report.NET,即使它们强制重用某些逻辑并且没有自动转换,也更容易。

        我还没有尝试过这个组件,但我从那些尝试过的人那里听说过它的好消息。该模型更像 HTML,但我不确定您是否可以简单地将渲染的 ASPX 发送给它以创建 PDF: http://www.websupergoo.com/abcpdf-8.htm

        【讨论】:

          【解决方案8】:

          如果你尝试通过 GOOGLE 找到一些 html 到 pdf 的软件,你会得到一堆这样的东西。 大约有 10 位领导者,但其中大多数在后台模式下使用 IE dll。 他们中只有几个使用自己的解析引擎。 如果您希望以编程方式创建 PDF,请在您的 ASP.NET 项目中尝试PDF Duo .NET 组件。 它是用于生成很酷的 PDF 调用、报告的轻量级组件,例如

          【讨论】:

          • 网站许可:1170 美元
          【解决方案9】:

          我会走另一条路。假设您使用的是 SQL Server,请使用 SSRS 并以这种方式生成 PDF。

          【讨论】:

            【解决方案10】:

            使用 Server.Execute() 获取发票页面的 HTML 并使用 winnovative html to pdf api for .net 将该代码转换为 PDF 的一种可能的最小解决方案是:

            TextWriter outTextWriter = new StringWriter();
            Server.Execute("Invoice.aspx", outTextWriter);
            
            HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
            
            byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(outTextWriter.ToString(),
                        httpContext.Current.Request.Url.AbsoluteUri);
            

            【讨论】:

              【解决方案11】:

              您可以使用 PDFSharp 或 iTextSharp 将 html 转换为 pdf。 PDFSharp 不是免费的。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-10-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-05-30
                • 2017-08-04
                • 1970-01-01
                相关资源
                最近更新 更多