Pechkin 是GitHub上的一个开源项目,可方便将html转化成pdf文档,使用也很方便,下面是winform项目中的示例代码:
using System; using System.Diagnostics; using System.Drawing.Printing; using System.IO; using System.Windows.Forms; using Pechkin; using Pechkin.Synchronized; namespace PdfTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnCreatePDF_Click(object sender, EventArgs e) { SynchronizedPechkin sc = new SynchronizedPechkin(new GlobalConfig() .SetMargins(new Margins() { Left = 0, Right = 0, Top = 0, Bottom = 0 }) //设置边距 .SetPaperOrientation(true) //设置纸张方向为横向 .SetPaperSize(ConvertToHundredthsInch(50), ConvertToHundredthsInch(100))); //设置纸张大小50mm * 100mm byte[] buf = sc.Convert(new ObjectConfig(), this.txtHtml.Text); if (buf == null) { MessageBox.Show("Error converting!"); return; } try { string fn = Path.GetTempFileName() + ".pdf"; FileStream fs = new FileStream(fn, FileMode.Create); fs.Write(buf, 0, buf.Length); fs.Close(); Process myProcess = new Process(); myProcess.StartInfo.FileName = fn; myProcess.Start(); } catch { } } private int ConvertToHundredthsInch(int millimeter) { return (int)((millimeter * 10.0) / 2.54); } } }
web项目中也可以使用:
1. 新建一个待打印的页面,比如index.htm,示例内容如下:
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>html打印测试</title> <style type="text/css" media="all"> * { margin:0; padding:0; font-size:12px } table { margin:10px; border:2px solid #000; border-collapse:collapse; margin:5px auto } th, td { border:1px solid #000; border-collapse:collapse; padding:3px 5px } h1 { font-size:24px } @media print { .no-print { display: none; } .page-break { page-break-after: always; } } </style> <script type="text/javascript"> function createPdf() { window.open("CreatePdf.ashx?html=index.htm"); } </script> </head> <body> <div class="no-print" style="text-align:center;margin:5px"> <button onClick="createPdf()">导出pdf</button> </div> <table > <thead> <tr> <th colspan="5"> <h1>XXXX报表</h1> </th> </tr> <tr> <th> 序号 </th> <th> 栏目1 </th> <th> 栏目2 </th> <th> 栏目3 </th> <th> 栏目4 </th> </tr> </thead> <tbody> <tr> <td> 1 </td> <td> 数据1 </td> <td> 数据2 </td> <td> 数据3 </td> <td> 数据4 </td> </tr> <tr class="page-break"> <td> 2 </td> <td> 数据1 </td> <td> 数据2 </td> <td> 数据3 </td> <td> 数据4 </td> </tr> <tr> <td> 3 </td> <td> 数据1 </td> <td> 数据2 </td> <td> 数据3 </td> <td> 数据4 </td> </tr> <tr> <td> 4 </td> <td> 数据1 </td> <td> 数据2 </td> <td> 数据3 </td> <td> 数据4 </td> </tr> <tr> <td> 5 </td> <td> 数据1 </td> <td> 数据2 </td> <td> 数据3 </td> <td> 数据4 </td> </tr> </tbody> <tfoot> <tr> <th> 合计: </th> <th> </th> <th> </th> <th> 300.00 </th> <th> 300.00 </th> </tr> </tfoot> </table> </body> </html>
2、创建一个ashx来生成并输出pdf
using System; using System.Drawing.Printing; using System.IO; using System.Web; using Pechkin; using Pechkin.Synchronized; namespace PdfWebTest { /// <summary> /// Summary description for CreatePdf /// </summary> public class CreatePdf : IHttpHandler { public void ProcessRequest(HttpContext context) { string htmlFile = context.Request["html"]; if (!string.IsNullOrWhiteSpace(htmlFile)) { string filePath = context.Server.MapPath(htmlFile); if (File.Exists(filePath)) { string html = File.ReadAllText(filePath); SynchronizedPechkin sc = new SynchronizedPechkin(new GlobalConfig() .SetMargins(new Margins() { Left = 0, Right = 0, Top = 0, Bottom = 0 }) //设置边距 .SetPaperOrientation(true) //设置纸张方向为横向 .SetPaperSize(ConvertToHundredthsInch(50), ConvertToHundredthsInch(100))); //设置纸张大小50mm * 100mm byte[] buf = sc.Convert(new ObjectConfig(), html); if (buf == null) { context.Response.ContentType = "text/plain"; context.Response.Write("Error converting!"); } try { context.Response.Clear(); //方式1:提示浏览器下载pdf //context.Response.AddHeader("content-disposition", "attachment;filename=" + htmlFile + ".pdf"); //context.Response.ContentType = "application/octet-stream"; //context.Response.BinaryWrite(buf); //方式2:直接在浏览器打开pdf context.Response.ContentType = "application/pdf"; context.Response.OutputStream.Write(buf, 0, buf.Length); context.Response.End(); } catch(Exception e) { context.Response.ContentType = "text/plain"; context.Response.Write(e.Message); } } } } public bool IsReusable { get { return false; } } private int ConvertToHundredthsInch(int millimeter) { return (int)((millimeter * 10.0) / 2.54); } } }
注意事项:部署web项目时,要保证bin目录下有以下相关dll文件
Common.Logging.dll
libeay32.dll
libgcc_s_dw2-1.dll
mingwm10.dll
Pechkin.dll
Pechkin.Synchronized.dll
ssleay32.dll
wkhtmltox0.dll