经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
远程驱动打印PDF
来源:cnblogs  作者:刘勇1993  时间:2018/10/20 15:37:46  对本文有异议

最近接到一个需求:在需要打印PDF面单的时候,为了提高业务效率,包装员不必手动下载PDF后再手动操作打印,要实现自动驱动打印机来打印PDF。

思路:pdf面单存在服务器上,打印机是连接包装员的电脑的。在每个包装员电脑上安装一个打印接口服务(远程获取PDF保存到本地,然后直接驱动打印机打印,打印完删除本地文件),当业务流程走到需要打印PDF的时候,调用对应的接口(每个包装员对应一个打印接口)打印PDF面单。

首先确定怎么打印PDF:

引用Apache的pdfbox-tools开源项目,驱动打印机打印本地PDF文件(不支持打印远程pdf文件)。

  1. <dependency>
  2. <groupId>org.apache.pdfbox</groupId>
  3. <artifactId>pdfbox-tools</artifactId>
  4. <version>2.0.11</version>
  5. </dependency>  

打印PDF只须调用PrintPDF类的main方法即可^_^

  1.   public static void main(String[] args) {//test
  2. String printerName = "PDFCreator";//打印机名
  3. String pdfFilePath = "D:/pdf/39488.pdf";//pdf路径
  4. try {
  5. PrintPDF.main(new String[] {
  6. "-silentPrint",// 静默打印
  7. // "-password","abcde",//pdf打开密码
  8. "-printerName", printerName,// 指定打印机名
  9. "-orientation", "auto",// 打印方向,auto|landscape|portrait三种可选
  10. pdfFilePath // 打印PDF文档的路径
  11. });
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. }

然后写个打印接口服务,一个简单的Spring-Boot接口项目从远程(erp服务拿到pdf文件,直接驱动打印机打印)下载pdf到打印接口本地,然后直接打印,打印完成,删除本地文件。然后打成jar包,得到pdfPrintSoa-0.0.1-SNAPSHOT.jar

  1. //打印接口服务
  2. @RestController
  3. @EnableAutoConfiguration
  4. @RequestMapping("/")
  5. public class PdfController {
  6. //从远程(erp服务拿到pdf文件,直接驱动打印机打印)下载pdf到打印接口本地,然后直接打印,打印完成,删除本地文件
  7. @RequestMapping("printPdfByUrl")
  8. @ResponseBody
  9. public boolean printPdfByUrl(@RequestBody PdfParam pdf) {
  10. String orderNo = null;
  11. try {
  12. String printerName = pdf.getPrinterName();//打印机名
  13. String url = pdf.getUrl();//pdf远程url
  14. orderNo = pdf.getOrderNo();
  15. System.out.println("printerName:" + printerName + ", orderNo:" + orderNo);
  16. if(null == printerName || url == null || orderNo == null) {
  17. System.out.println("参数不能为空");
  18. return false;
  19. }
  20. //pdf下载到本地临时存放
  21. String pdfFilePath = "C:/pdf/" + orderNo + ".pdf";
  22. downloadNet(url,pdfFilePath);// 下载网络文件
  23. if(!new File(pdfFilePath).exists()){
  24. System.out.println(pdfFilePath + " not exist!");
  25. return false;
  26. }
          
  27. PrintPDF.main(new String[]{
  28. "-silentPrint",//静默打印
  29. // "-password","abcde",//pdf打开密码
  30. "-printerName",printerName ,//指定打印机名
  31. "-orientation","auto",//打印方向,auto|landscape|portrait三种可选
  32. pdfFilePath//打印PDF文档的路径
  33. });
  34. deleteFile(pdfFilePath);//删除打印完的文件
  35. System.out.println("orderNo:" + orderNo + "pdf面单打印成功!");
  36. return true;
  37. }catch(Exception e){
  38. e.printStackTrace();
  39. System.out.println("orderNo:" + orderNo + "pdf面单打印失败!");
  40. }
  41. return false;
  42. }
  43. // 下载网络文件
  44. private static void downloadNet(String sourceFileUrl,String destFilePath){
  45. int bytesum = 0;
  46. int byteread = 0;
  47. InputStream inStream = null;
  48. FileOutputStream fs = null;
  49. try {
  50. URL url = new URL(sourceFileUrl);
  51. URLConnection conn = url.openConnection();
  52. inStream = conn.getInputStream();
  53. fs = new FileOutputStream(destFilePath);
  54. byte[] buffer = new byte[1024*4];
  55. while ((byteread = inStream.read(buffer)) != -1) {
  56. bytesum += byteread;
  57. System.out.println(bytesum);
  58. fs.write(buffer, 0, byteread);
  59. }
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. } finally{
  63. try {
  64. if(inStream != null){
  65. inStream.close();
  66. }
  67. if(fs != null){
  68. fs.close();
  69. }
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }
  75. private static void deleteFile(String filePath) {
  76. File file = new File(filePath);
  77. if (file.exists() && file.isFile()) {
  78. file.delete();
  79. }
  80. }
  81. public static void main(String[] args) {//test
  82. String printerName = "PDFCreator";//打印机名
  83. //pdf路径
  84. String pdfFilePath = "D:/pdf/39488.pdf";
  85. try {
  86. PrintPDF.main(new String[]{
  87. "-silentPrint",//静默打印
  88. // "-password","abcde",//pdf打开密码
  89. "-printerName",printerName ,//指定打印机名
  90. "-orientation","auto",//打印方向,auto|landscape|portrait三种可选
  91. pdfFilePath//打印PDF文档的路径
  92. });
  93. } catch (PrinterException e) {
  94. e.printStackTrace();
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }

 nginx配置,通过alias设置虚拟目录,这样就可以通过URL直接远程访问PDF了(打印接口服务就是这样远程下载PDF的)。

  1. location /static {
  2. alias /home/pdf/;
  3. }

比如nginx配置的域名是www.liu.com,访问http://www.liu.com/static/39488.pdf实际指向的是/home/pdf/394488.pdf

 

最后,写个DOS批处理文件(pdf打印机启动.bat)给包装员用来启动打印接口服务。

PS:先把打印接口项目生成的jar包pdfPrintSoa-0.0.1-SNAPSHOT.jar放进pdf夹子里,pdf夹子放到c盘

  1. @echo off
  2. cd c:\pdf
  3. java -jar pdfPrintSoa-0.0.1-SNAPSHOT.jar

打印接口服务启动后,需要打印PDF时,通过Http调用包装员对应的打印接口服务就可以了,实现远程驱动打印PDF面单。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号