原文 [C#] 网页Html转PDF档(一行程式码解决)
网页转PDF档做法很多( Convert HTML to PDF in .NET )
这边纪录一下老外最多人加分的那篇做法,使用wkhtmtopdf (采GPL授权)可以省很多程式码
首先到官网http://code.google.com/p/wkhtmltopdf/downloads/list
找installer.exe下载,这边Demo我是下载wkhtmltopdf-0.9.9-installer.exe
下载完后执行安装它
![[C#] 网页Html转PDF档(一行程式码解决)-LMLPHP [C#] 网页Html转PDF档(一行程式码解决)-LMLPHP](https://dbsqp.com/x.php?x=eEVyM0hHZWdRMVdqMUMtaERDN0dCRXRCM0RLckIxOWhGRjJqR0hkWktFNnlDOWFoWUk2dUdFYXBpMktHRERiMVhISlBBRmVod0FvYklBN3dQMnBMQUlldHcyWWJJQXFjUEhvWEItNmhpMllmQ0FzeG9ISzNNNGUxaj1vcUk5YVZrNko2RTZ1cDRGNS1EOWN0NkZwTC1BLXQ1RjNyNS1zbDkyNXY4NHVWND1ZPUJBOHNQRW9ibjZ1MXdGNVA3QTk0RzI0YUY9OUppPXBxR0FzbGpIb2pxOHFady1Yci1BOTlzRm9iWD05MXc3WWJNQXNsakg2emEzdE1FRUxuNkZkSkM%3D)
![[C#] 网页Html转PDF档(一行程式码解决)-LMLPHP [C#] 网页Html转PDF档(一行程式码解决)-LMLPHP](https://dbsqp.com/x.php?x=U1NNSi1qPVQ5UHFDYWl1RjBiYll6U2cwWmdwSm1RZVgyVFpBM1ZMOS1oT1R5WDdTNm9kQTZkSE5SRXdub2dIbDVpZHowVE9RZU9KdD1kY2o4UTlxbG9PUmhQNHQ2T2RQeGtIMW1aYlhURTc4ek9hVmNrZVk4Uz1tRmZMODhXSDVUSXZicFhhWmFnTmkzTE1jb1RLZDFkZmdtZkxLZWVjSnVQWkJ1R2hJYWMzZG1iZGk9V2I0eEtZNVhZOXIwWE5Sb1hMeE9aWDVSTlBMcWFZVmZpOXYwTGFFU0k0NUVhZXduZjl1OGxObGhkcDktTD1ZZmtaUj1TT0MxU3VFclRMdDI%3D)
选择要安装的路径
![[C#] 网页Html转PDF档(一行程式码解决)-LMLPHP [C#] 网页Html转PDF档(一行程式码解决)-LMLPHP]()
安装完成
![[C#] 网页Html转PDF档(一行程式码解决)-LMLPHP [C#] 网页Html转PDF档(一行程式码解决)-LMLPHP]()
(如果要解除安装的话,就到刚刚安装的资料夹下找uninstall.exe执行即可)
接着看它的原始使用方式
在安装路径下有个wkhtmltopdf.exe档
到命令提示字元(开始→执行→cmd)
输入
![[C#] 网页Html转PDF档(一行程式码解决)-LMLPHP [C#] 网页Html转PDF档(一行程式码解决)-LMLPHP]()
这边就抓中国MSDN论坛网页转PDF为例
按下Enter转换完成
![[C#] 网页Html转PDF档(一行程式码解决)-LMLPHP [C#] 网页Html转PDF档(一行程式码解决)-LMLPHP]()
打开刚刚转换完成的PDF档
![[C#] 网页Html转PDF档(一行程式码解决)-LMLPHP [C#] 网页Html转PDF档(一行程式码解决)-LMLPHP]()
该文字的地方就是文字,该图片的地方就是图片,该超连结的地方就是超连结
既然知道底层使用方式,那就可以使用
System.Diagnostics.Process.Start 方法(String, String)
第一个参数传执行档路径,第二个传参数(URL和PDF档的存放路径)
如下:
protected void Button1_Click( object sender, EventArgs e) |
此小工具不会像WinForm的WebBrowser控制项一样会共用IE浏览器的Cookie
而且要抓的网页来源不一定要URL,也可以像这样直接抓本机上的Html档转PDF
protected void Button1_Click( object sender, EventArgs e) |
System.Diagnostics.Process.Start( @"D:\wkhtmltopdf\wkhtmltopdf.exe" , @"D:\index.html D:\myFileName.pdf" ); |
只是抓本机的Html转成PDF后,图片会不见这点要注意
相关讨论:
如何得知System.Diagnostics.Process.Start 完毕后的讯息?
网页资料转PDF档
国外讨论:
Calling wkhtmltopdf to generate PDF from HTML
另外GridView汇出PDF的话,请参考:
ASP.NET 轻松转GridView 资料转档到PDF - 使用iTextSharp
请注意使用iTextSharp预设不支援中文字和背景色
中文字的解决方案:GridView透过iTextSharp输出PDF中文问题
2011.11.29 好人做到底
把ASP.net C#的Code补完
using System.Collections.Generic; |
using System.Web.UI.WebControls; |
using System.Diagnostics; |
public partial class _Default : System.Web.UI.Page |
//Button的Click事件(把Url的网页内容转成PDF) |
protected void btn_execute_Click( object sender, EventArgs e) |
//因为Web 是多执行绪环境,避免甲产生的文件被乙下载去,所以档名都用唯一 |
string fileNameWithOutExtention = Guid.NewGuid().ToString(); |
Process p = System.Diagnostics.Process.Start( @"D:\wkhtmltopdf\wkhtmltopdf.exe" , @" http://msdn.microsoft.com/zh-cn D:\" + fileNameWithOutExtention + ".pdf") ; |
//若不加这一行,程式就会马上执行下一句而抓不到档案发生例外:System.IO.FileNotFoundException: 找不到档案''。 |
FileStream fs = new FileStream( @"D:\" + fileNameWithOutExtention + ".pdf", FileMode.Open); |
byte [] file = new byte [fs.Length]; |
fs.Read(file, 0, file.Length); |
Response.AddHeader( "content-disposition" , "attachment; filename=" +fileNameWithOutExtention+ ".pdf" ); //强制下载 |
Response.ContentType = "application/octet-stream" ; |
Response.BinaryWrite(file); |
2013.9.20 追记:
今天才发现此程式已经被包装成.dll,可以在.net程式码叫用:参考HTML转PDF -使用Pechkin套件 by黑暗执行绪
然后根据之前同事经验,直接使用wkhtmltopdf.exe产PDF,可能在64位元作业系统上产不出来。
在ASP.net MVC中使用的话,请见:[ASP.net MVC]在Web专案上使用Pechkin套件将网页转成PDF档