【发布时间】:2010-10-08 21:12:01
【问题描述】:
我正在发送的电子邮件中附有 PDF 格式的发票。我已经 - 在应用程序的其他地方 - 在 .aspx 页面中创建发票。我想使用 Server.Execute 返回输出 HTML 并从中生成 PDF。否则,我必须使用报告工具在 PDF 上“绘制”发票。这有很多原因,其中最重要的原因是我必须为每个微小的更改更新 .aspx 页面和报告。怎么办……
【问题讨论】:
我正在发送的电子邮件中附有 PDF 格式的发票。我已经 - 在应用程序的其他地方 - 在 .aspx 页面中创建发票。我想使用 Server.Execute 返回输出 HTML 并从中生成 PDF。否则,我必须使用报告工具在 PDF 上“绘制”发票。这有很多原因,其中最重要的原因是我必须为每个微小的更改更新 .aspx 页面和报告。怎么办……
【问题讨论】:
无法直接在 .NET 中从 HTML 字符串生成 PDF,但有许多第三方控件可以正常工作。
我在这方面取得了成功:http://www.html-to-pdf.net 还有这个:http://www.htmltopdfasp.net
要问的重要问题是:
还有一些其他的,但它们处理 ActiveX 显示等。
【讨论】:
为此,我们使用了一款名为 ABCPDF 的产品,效果非常好。
【讨论】:
这听起来像是Prince 的工作。它可以采用 HTML 和 CSS 并生成 PDF,然后您可以将其呈现给您的用户。它比大多数 Web 浏览器更好地支持 CSS3(工作人员包括 CSS 的发明者 Håkon Wium Lie)。
查看samples,尤其是维基百科页面,了解它可以生成的精美输出。作者还有一个有趣的Google Tech Talk。
编辑:有一个.NET wrapper 可用。
【讨论】:
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
【讨论】:
最初的问题是关于将包含发票的另一个 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();
【讨论】:
只要你能确保使用正确的 XHTML,你也可以使用像Alt-Soft's Xml2PDF 这样的产品,通过 XSLT/XSL-FO 将 XML (XHTML) 转换为 PDF。
要掌握它需要一点学习曲线,但一旦你“掌握”它,它就会非常有效!
马克
【讨论】:
由于您正在生成答案,因此您可以使用 Report.NET 之类的工具: http://sourceforge.net/projects/report/
我不同意您不能直接从输出转换为 PDF 的答案,因为您可以“重新调用”页面并将 HTML 作为流获取并进行转换。但是,我不确定您要使用什么工具来执行此操作。换句话说,这是可能的,但我不确定它是否值得。 PDF 创建库,如 Report.NET,即使它们强制重用某些逻辑并且没有自动转换,也更容易。
我还没有尝试过这个组件,但我从那些尝试过的人那里听说过它的好消息。该模型更像 HTML,但我不确定您是否可以简单地将渲染的 ASPX 发送给它以创建 PDF: http://www.websupergoo.com/abcpdf-8.htm
【讨论】:
如果你尝试通过 GOOGLE 找到一些 html 到 pdf 的软件,你会得到一堆这样的东西。 大约有 10 位领导者,但其中大多数在后台模式下使用 IE dll。 他们中只有几个使用自己的解析引擎。 如果您希望以编程方式创建 PDF,请在您的 ASP.NET 项目中尝试PDF Duo .NET 组件。 它是用于生成很酷的 PDF 调用、报告的轻量级组件,例如
【讨论】:
我会走另一条路。假设您使用的是 SQL Server,请使用 SSRS 并以这种方式生成 PDF。
【讨论】:
使用 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);
【讨论】:
您可以使用 PDFSharp 或 iTextSharp 将 html 转换为 pdf。 PDFSharp 不是免费的。
【讨论】: