1. 首先去http://wkhtmltopdf.org/downloads.html 下载最新版本的安装包
2. 执行安装完成
3. CMD 命令行运行wkhtmltopdf.exe程序生成PDF
C:Program Fileswkhtmltopdfin>wkhtmltopdf.exe --orientation Landscape --javascript-delay 5000 c:BPReport.html c:BPReport_L.pdf Loading pages (1/6) Counting pages (2/6) Resolving links (4/6) Loading headers and footers (5/6) Printing pages (6/6) Done
参数:
--orientation Landscape 是横向导出
--javascript-delay 5000 是延时5秒导出,用于页面异步加载数据时可以导出到PDF
代码调用exe
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; /*要引用以下命名空间*/ using System.Diagnostics; using System.IO; 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(); //执行wkhtmltopdf.exe Process p = System.Diagnostics.Process.Start(@"D:wkhtmltopdfwkhtmltopdf.exe", @"http://msdn.microsoft.com/zh-cn D:" + fileNameWithOutExtention + ".pdf"); //若不加这一行,程序就会马上执行下一句而抓不到文件发生意外:System.IO.FileNotFoundException: 找不到文件 ''。 p.WaitForExit(); //把文件读进文件流 FileStream fs = new FileStream(@"D:" + fileNameWithOutExtention + ".pdf", FileMode.Open); byte[] file = new byte[fs.Length]; fs.Read(file, 0, file.Length); fs.Close(); //Response给客户端下载 Response.Clear(); Response.AddHeader("content-disposition", "attachment; filename=" + fileNameWithOutExtention + ".pdf");//强制下载 Response.ContentType = "application/octet-stream"; Response.BinaryWrite(file); } }
如果要在Web项目中导入Pechkin的话,有许多很雷的注意事项,以下是这几天导入项目的经验…
实作
1.首先在ASP.net MVC项目里,项目的建置平台目标维持预设的「Any CPU」即可,虽说WkHtmlToPdf.exe是32位应用程序,但之后布署在IIS上的相关32位设定并不是从Web项目设定的
如果要在Web项目中导入Pechkin的话,有许多很雷的注意事项,以下是这几天导入项目的经验…
实作
1.首先在ASP.net MVC项目里,项目的建置平台目标维持预设的「Any CPU」即可,虽说WkHtmlToPdf.exe是32位应用程序,但之后布署在IIS上的相关32位设定并不是从Web项目设定的
![](http://www.it165.net/uploadfile/2013/0923/20130923021558703.png)
2.要加入Pechkin套件的话,不能从NuGet或官网(https://github.com/gmanny/Pechkin)下载使用
因为Pechkin原始作者释出来的套件在Web项目中使用的话会有DLL档案Lock住的问题,如果产过一次PDF档,之后Web项目就再也Build不过
![](http://www.it165.net/uploadfile/2013/0923/20130923021751812.png)
网络上已有人释出修正后的版本:https://github.com/tuespetre/Pechkin
建议直接下载这个:https://pechkinwebtest.codeplex.com/downloads/get/729855
3.将上述的载点档案PechkinDLLs.zip下载解压后,会有以下几个档
Web项目加入参考「Common.Logging.dll」、「Pechkin.dll」
![](http://www.it165.net/uploadfile/2013/0923/20130923021914287.png)
![](http://www.it165.net/uploadfile/2013/0923/20130923021938939.png)
然后把剩下的五个.dll复制到Web项目根目录下,不然会无法产PDF檔
![](http://www.it165.net/uploadfile/2013/0923/20130923022015464.png)
再对着那五个.dll设定属性>复制到输出目录> 永远复制
![](http://www.it165.net/uploadfile/2013/0923/20130923022046682.png)
4..dll参考都准备完毕,接下来是程序代码实作
注意点1:产生PDF对象的Url,须是Http开头的绝对路径URL,而不是直接用Url.Action()方法
注意点2:因为是另一条执行绪另一个工作阶段发出Request产出PDF,所以Session不共享,如果要把需要登入才可以看得到的页面产出PDF档的话,要另外套不用登入也可以看得到的画面给Pechkin呼叫
HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using Pechkin;
using System.IO;
namespace WkHtmlToPdf
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void button1_Click(object sender, EventArgs e)
{
string url = "http://www.cnblogs.com";
var config = new GlobalConfig();
config //.SetPaperOrientation(true)//设置纸张方向为横向
.SetMargins(new System.Drawing.Printing.Margins(0, 0, 0, 0));
using (IPechkin pechkin = Factory.Create(config))
{
ObjectConfig oc = new ObjectConfig();
oc.SetPrintBackground(true)
.SetLoadImages(true)
.SetScreenMediaType(true)
.SetPageUri(url)
.SetRunJavascript(true) //允许javaScript
.SetRenderDelay(5000);//延时5秒;
byte[] pdf = pechkin.Convert(oc);
File.WriteAllBytes("c:\BPReport-news.pdf", pdf);
}
}
}
}
※注意此套件不支持Gif图片
※如果执行过程中发生Common.Logging错误
Could not load file or assembly 'Common.Logging' or one of its dependencies.
![](http://www.it165.net/uploadfile/2013/0923/20130923022336405.png)
要先看加入参考的Common.Logging.dll档案版本(2.1.1.0)
再确保Web.config里的assemblyBinding区段设定也是一样的档案版本即可
![](http://www.it165.net/uploadfile/2013/0923/20130923022514467.jpg)
6.接下来如果直接将网站布署到IIS上的话,会出现错误
无法加载档案或组件 'Pechkin' 或其相依性的其中之一。 试图加载格式错误的程序。
Could not load file or assembly ‘Pechkin’ or one of its dependencies. An attempt was made to load a program with an incorrect format.
![](http://www.it165.net/uploadfile/2013/0923/20130923022556960.jpg)
这要看网站使用的是哪个应用程序集区,再设定启用32位应用程序
![](http://www.it165.net/uploadfile/2013/0923/20130923022631422.jpg)
![](http://www.it165.net/uploadfile/2013/0923/20130923022657654.jpg)
※即使部署的机器操作系统是64位,有把应用程序集区「启用32位应用程序」的话,网站也是可以正常执行。
到这边,Pechkin在Web项目上的设定才算全部完成~