1. 首先去http://wkhtmltopdf.org/downloads.html 下载最新版本的安装包
2. 执行安装完成
3. CMD 命令行运行wkhtmltopdf.exe程序生成PDF
C:\Program Files\wkhtmltopdf\bin>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:\wkhtmltopdf\wkhtmltopdf.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项目设定的
![](https://i-blog.csdnimg.cn/blog_migrate/83fa78b8d287227e3f56ca2581942623.png)
2.要加入Pechkin套件的话,不能从NuGet或官网(https://github.com/gmanny/Pechkin)下载使用
因为Pechkin原始作者释出来的套件在Web项目中使用的话会有DLL档案Lock住的问题,如果产过一次PDF档,之后Web项目就再也Build不过
![](https://i-blog.csdnimg.cn/blog_migrate/2db752390bf0033c8bfbb01c928f1259.png)
网络上已有人释出修正后的版本:https://github.com/tuespetre/Pechkin
建议直接下载这个:https://pechkinwebtest.codeplex.com/downloads/get/729855
3.将上述的载点档案PechkinDLLs.zip下载解压后,会有以下几个档
Web项目加入参考「Common.Logging.dll」、「Pechkin.dll」
![](https://i-blog.csdnimg.cn/blog_migrate/abd760e5b0008e73d2cbaa28cf27b6a7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f2d1f14059dc5672c2bdc1092990cb84.png)
然后把剩下的五个.dll复制到Web项目根目录下,不然会无法产PDF檔
![](https://i-blog.csdnimg.cn/blog_migrate/1711a8af651643092f88ffc81e2fdfa2.png)
再对着那五个.dll设定属性>复制到输出目录> 永远复制
![](https://i-blog.csdnimg.cn/blog_migrate/70e55484df20d93839a226c771eeb6ad.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.
![](https://i-blog.csdnimg.cn/blog_migrate/a40ee9b19a5bcd50690b62d7e613be99.png)
要先看加入参考的Common.Logging.dll档案版本(2.1.1.0)
再确保Web.config里的assemblyBinding区段设定也是一样的档案版本即可
![](https://i-blog.csdnimg.cn/blog_migrate/355cf1379a07960ca4d9fa06d6f87695.jpeg)
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.
![](https://i-blog.csdnimg.cn/blog_migrate/e2ce356445731d0f0c3c76df40f63911.jpeg)
这要看网站使用的是哪个应用程序集区,再设定启用32位应用程序
![](https://i-blog.csdnimg.cn/blog_migrate/b65fc91d86ec4f70887bb8b2f40629f8.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/efde6cc39115ada5839123084138952f.jpeg)
※即使部署的机器操作系统是64位,有把应用程序集区「启用32位应用程序」的话,网站也是可以正常执行。
到这边,Pechkin在Web项目上的设定才算全部完成~