最近作一个项目,是关于报告之类的,涉及到报告打印这个功能,真是坑了个爹啊。在网上找了不少方法,web打印有不少控件,如:杰表打印,lodop,等等。由于业务上的报表表格都是一些word文档,其内容也很是之多。基本上表格,复合表格之类的。数据量不定,因此分页也必须考虑上。javascript
首先考虑,杰表打印,由于lodop网上有网页说对css支持很差。杰表打印免费版确实是良心之做啊,收费版我没有用过。经过程序在html输出内容并分好页,每一页放在一个<div id="page1"></div>这里就不粘代码了。确实是挺简单的也很好用,安装好插件后,直调调用。php
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机子又不行,老是达不到理想的效果。因为收费版贵,也不知道效果如何,因此就没有购买了。将就着用了一段时间。css
前不久,在网上找到了一个神器《wxhtmltopdf》,直接将html生成pdf,而且直接javascript脚本运行。分页也不在话下。最主要是页面调好的布局,生成后无变型,字体大小一致。哇草,这太合适个人需求了吧。去官网一看,跨平台,牛啊,妈妈不再用担忧什么window,linux,mac os了,百度一搜安装方法一堆,果断试试。html
wkhtmltopdf http://www.baidu.com baidu.pdfjava
就这么简单,pdf就生成了,并且效果很好。就他了。linux
下来就是怎么在程度上调用的问题了。这个很简单,java php C#都有方法。直接用啊,我这里用的是java的。web
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的链接传入便可。chrome
好了,pdf有了,那就是查看,打印的问题。这里又坑爹的问题,chrome上能够直接浏览pdf而且打印,但万恶的IE就没有那么爽了。可是不是没有办法解决,考虑到使用的用户大多习惯于IE或360之类的,因此IE上的打印仍是得解决。网络
第一次选择了pdf.js,说实话,这些控件都很好,用起来也很是方便,只是有一些问题实在是折腾人了。我使用了pdf.js在IE,chrome浏览都很好,打印就不行了,IE直接不输出内容,chrome打印出来的内容失真了。没有时间去研究究竟是什么问题形成的。换吧。app
第二次选择了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 默认不是预览模式,界面不少功能菜单,很是地丑。
在配置的时候记得要把:pagemode:"none"这句加上,具体的参数可参考下面的说明文档。
http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf
加上后,效果扛扛的。
至此,web打印的问题解决了。