从原始 HTML/CSS 内容从 ASP.NET 生成 PDF?

Posted

技术标签:

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

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

【问题讨论】:

***.com/questions/564650/convert-html-to-pdf-in-net 的可能重复项 【参考方案1】:

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

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

要问的重要问题是:

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

还有一些其他的,但它们处理 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,请使用 s-s-rS 并以这种方式生成 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 不是免费的。

【讨论】:

以上是关于从原始 HTML/CSS 内容从 ASP.NET 生成 PDF?的主要内容,如果未能解决你的问题,请参考以下文章

从基础的 HTML 到 CSS,乃至进阶的 XMLSQLJSPHP 和 ASP.NET。

使用 C# ASP.NET 获取原始日期和时间

asp.net mvc3 返回原始 html 以查看

ASP.NET

ASP.NET 母版页内容页的 ID 全部更改,破坏了基于原始元素 ID 的 CSS?你在跟我开玩笑吗

ASP.NET 的框架 javascript 不允许我呈现原始 HTML IFRAME