曲折的 web 打印解决方法

最近做一个项目,是关于报告之类的,涉及到报告打印这个功能,真是坑了个爹啊。在网上找了很多方法,web打印有很多控件,如:杰表打印,lodop,等等。因为业务上的报表表格都是一些word文档,其内容也非常之多。基本上表格,复合表格之类的。数据量不定,所以分页也必须考虑上。

首先考虑,杰表打印,因为lodop网上有网页说对css支持不好。杰表打印免费版确实是良心之作啊,收费版我没有用过。通过程序在html输出内容并分好页,每一页放在一个<div id="page1"></div>这里就不粘代码了。确实是挺简单的也很好用,安装好插件后,直调调用。

myDoc = {
    documents: document,
    settings:{topMargin:0,
        leftMargin:0,
        bottomMargin:0,
        rightMargin:0},   // 设置上下左距页边距为10毫米,注意,单位是 1/10毫米
    /*
     要打印的div 对象在本文档中,控件将从本文档中的 id 为 'page1' 的div对象,
     作为首页打印id 为'page2'的作为第二页打印            */
    copyrights: '杰创软件拥有版权  www.jatools.com' // 版权声明,必须
};
var jatoolsPrinter = document.getElementById("jatoolsPrinter");
jatoolsPrinter.printPreview(myDoc); // 打印预览

这样就可以打印了,但是免费版本有个问题,在不同分辨率上字体,大小经常不一样,带来了一个问题:调好了A机子B机子又不行,总是达不到理想的效果。由于收费版贵,也不知道效果如何,所以就没有购买了。将就着用了一段时间。

前不久,在网上找到了一个神器《wxhtmltopdf》,直接将html生成pdf,并且直接javascript脚本运行。分页也不在话下。最主要是页面调好的布局,生成后无变型,字体大小一致。哇草,这太合适我的需求了吧。去官网一看,跨平台,牛啊,妈妈再也不用担心什么window,linux,mac os了,百度一搜安装方法一堆,果断试试。

wkhtmltopdf http://www.baidu.com baidu.pdf

就这么简单,pdf就生成了,而且效果很好。就他了。

下来就是怎么在程度上调用的问题了。这个很简单,java php C#都有方法。直接用啊,我这里用的是java的。

public class HtmlToPdfInterceptor extends Thread {

    private InputStream is;

    public HtmlToPdfInterceptor(InputStream is){
        this.is = is;
    }

    public void run(){
        try{
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
//                System.out.println(line.toString()); //输出内容
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
/**
 * html转pdf
 *
 * @param srcPath  html路径,可以是硬盘上的路径,也可以是网络路径
 * @param destPath pdf保存路径
 * @return 转换成功返回true
 */
public static boolean convert_landscape(String srcPath, String destPath) {
    File file = new File(destPath);
    File parent = file.getParentFile();
    //如果pdf保存路径不存在,则创建路径
    if (!parent.exists()) {
        parent.mkdirs();
    }

    StringBuilder cmd = new StringBuilder();
    cmd.append(toPdfTool);
    cmd.append(" --page-size A4 "); //设置纸张;
    cmd.append(" --orientation Landscape "); //方向;
    cmd.append(" --margin-top 10px --margin-right 10px --margin-bottom 10px --margin-left 10px ");//设置边距
    cmd.append(srcPath);
    cmd.append(" ");
    cmd.append(destPath);

    boolean result = true;
    try {
        Process proc = Runtime.getRuntime().exec(cmd.toString());
        HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());
        HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());
        error.start();
        output.start();
        proc.waitFor();
    } catch (Exception e) {
        result = false;
        e.printStackTrace();
    }

    return result;
}

就这两个方法,把http的连接传入即可。

好了,pdf有了,那就是查看,打印的问题。这里又坑爹的问题,chrome上可以直接浏览pdf并且打印,但万恶的IE就没有那么爽了。但是不是没有办法解决,考虑到使用的用户大多习惯于IE或360之类的,所以IE上的打印还是得解决。

第一次选择了pdf.js,说实话,这些控件都很好,用起来也非常方便,只是有一些问题实在是折腾人了。我使用了pdf.js在IE,chrome浏览都很好,打印就不行了,IE直接不输出内容,chrome打印出来的内容失真了。没有时间去研究到底是什么问题造成的。换吧。

第二次选择了pdfobject.js,先说明一下pdf.js的确实方法,无需安装任何插件就可以浏览。但pdfobject.js就不行了,在IE下需要安装Adobe Acrobat Reader DC,

然后就是pdfoject.js的使用了。

<body >
<script>
    var option = {
        fallbackLink: "<p>has error</p>",
        pdfOpenParams:{
            view: 'FitV',
            zoom:"80",
            pagemode:"none"
        }
    }
    PDFObject.embed("${root!}${pdf_path!}", document.body,option);

</script>

就这一句,embed第一个参数就是pdf的连接,IE下adobe reader 默认不是预览模式,界面很多功能菜单,非常地丑。

001748_olV5_931071.png

在配置的时候记得要把:pagemode:"none"这句加上,具体的参数可参考下面的说明文档。

http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf

 

加上后,效果扛扛的。

001937_1xxJ_931071.png

至此,web打印的问题解决了。

转载于:https://my.oschina.net/u/931071/blog/1059591

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值