• 关于html转pdf


    本篇作为一个备忘,记录一下html转pdf中遇到的问题。

    没有具体做这个东西的时候不知道,网络上能将html转换成pdf的资源并不太多,使用上有很多都存在一些问题。能完美将一个站点中的页面(这里说一个站点中的页面是指非特意制作只包含简单html元素的网页)转换成pdf的很多都是收费的项目。

    这里不讨论itextsharp,因为我们指明了源是html页面,itextsharp对html的支持比较鸡肋,他的灵活体现在手动绘制pdf上。

    我们的系统中原本使用了Pechkin这款开源产品,这款产品使用简单,而且转换出来的pdf与原页面看不出来差别。但Pechkin依赖于很多32位dll,这样应用程序必须运行在32位进程中。

    为了使程序运行在64位进程中,尝试了很多,最后发现这个项目:https://github.com/vilppu/OpenHtmlToPdf

    OpenHtmlToPdf与Pechkin的内部原理一样,都是封装了wkHtmlToPdf来实现的转换。

    wkHtmlToPdf内部包含了一个浏览器引擎:Webkit,所以它能对html页面的还原比较真实,官方上看wkHtmlToPdf还曾发布过使用其他浏览器引擎的分支项目,有兴趣的话也可以去尝试一下。

    OpenHtmlToPdf内部包含了32位和64位wkHtmlToPdf两个应用程序,使用命令的方式去调用不同的exe,以此来实现在两种进程中兼容。

    其还提供了丰富的调用参数可供使用:http://wkhtmltopdf.org/libwkhtmltox/pagesettings.html

    当然,因为wkhtmltopdf本身就是比较老的项目了,这里面有些参数我尝试后并没有得到什么效果。

    使用示例:

    using (WebClient wc = new WebClient())
    {
                    wc.Encoding = Encoding.UTF8;
                    string html = wc.DownloadString(url);
    
                    var document = Pdf.From(html)
                        .OfSize(OpenHtmlToPdf.PaperSize.LetterRotated)
                        .WithGlobalSetting("margin.top", "0.4cm");
                    if (IntPtr.Size == 4)
                    {
                        document = document.WithObjectSetting("load.zoomFactor", "1.5");
                    }
                    var result = document.Content();
    
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=PDF" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf");
                    HttpContext.Current.Response.ContentType = "application/octet-stream";
                    HttpContext.Current.Response.BinaryWrite(result);
                    HttpContext.Current.Response.End();
    }

    这个东西使用中也遇到一些问题。

    看代码可以发现在32位进程的时候,我对文档做了特殊处理,使用load.zoomFactor做了放大。

    因为使用中发现其在32位中生成的pdf比64位中生成的pdf小了一些,我并没能找到和直接解决这个诡异的问题,最后找了这个放大的参数(这个应该是对浏览器引擎操作的参数),使其在两种环境中生成的pdf尺寸基本一致。。

    当然,其实我们一般用不到一个web程序支持两种cpu进程,这只是为了在开发调试阶段使不同的开发者环境呈现的内容一致。

  • 相关阅读:
    C++的虚函数与多态
    Qt界面的个性设置QSS
    Qt添加背景图片应该注意的问题
    c/c++的函数参数与返回值
    堆和栈
    linux下挂载u盘
    Qt的主窗口弹出消息框
    智能家居实训系统的项目有感!
    Qt 快捷键
    FB
  • 原文地址:https://www.cnblogs.com/hhq365/p/5612073.html
Copyright © 2020-2023  润新知