zoukankan      html  css  js  c++  java
  • Pechkin:html -> pdf 利器

    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 

  • 相关阅读:
    splinter webdriver API 的基本实现
    201253 线程和进程的区别
    Winform中的默认图片
    [收藏】正确使用SqlConnection对象,兼谈数据库连接池
    手机相关的基础名称
    常见排序
    SIP相关内容
    How to set the WIFI configuration
    本地化的设置和读取
    Serialize And Deserialize Binary Tree
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/3286604.html
Copyright © 2011-2022 走看看