JAVA实现调用打印机打印PDF

JAVA实现调用打印机打印PDF,网上搜索了一大把资料,基本上都是重复。。。下面骂人的一大堆。。我这里来解决一下。

需求:前端调用用接口 后端根据模版生成数据联通打印机直接一键打印! 

思路:这里讲一下打印最好使用pdf去打印。不管是word.excel 都是通过转PDF 再打印出来的。所以我这里的思路就是 选择模版生成文件,并且打印。

  我这里选择html模版 也就是freemark模版。

 1、通过vm文件生成html 

 2、通过html再转成 pdf

 3、调用打印机方法打印

可能这有人问为啥不用 word模版。我这里说明一个坑。如果是模版网上解决方案基本上是 xml格式的。xml格式的word转pdf是很困难的。至少我没找到合适的方法去转。

本文的第一步第二部 就不介绍了 在我的  另一篇博客中有讲到。 html转pdf 中有讲解 本文重点介绍 调用打印机的方式!

调用打印机驱动的我目前实验了 网上所有的方法,查了很多资料。大概摸出了两种最有效的方式。

第一种 java调用打印机:在本机安装驱动,利用java代码去调用进行打印。如果你的代码是在服务器上那么就需要在服务器上安装驱动。

代码如下:

 

 /**
      * 通过本机默认打印机打印pdf文件
      * @param filePath 文件路径
      * @throws Exception
      */
	 public static void defaultPrintPDF(String filePath) throws Exception{
		 logger.info("打印工具类入參:filePath==================="+filePath);
		 File file = new File(filePath); // 获取选择的文件
	      // 构建打印请求属性集
	      HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
	      // 设置打印格式,因为未确定类型,所以选择autosense
	      DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;
	      logger.info("打印文件类型为:==================="+flavor);
	      //pras.add(MediaName.ISO_A4_TRANSPARENT);//A4纸张
	      //遍历
//	      PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras); 
//	   
//	      for (PrintService printService2 : printService) {
//	    	  logger.info("本机可使用打印机列表:==================="+printService2);
//			}
	      // 定位默认的打印服务
	      PrintService defaultService = PrintServiceLookup
	              .lookupDefaultPrintService();
	      logger.info("打印工具选择打印机为:==================="+defaultService);
	          try {
	              DocPrintJob job = defaultService.createPrintJob(); // 创建打印作业
	              FileInputStream fis = new FileInputStream(file); // 构造待打印的文件流
	              DocAttributeSet das = new HashDocAttributeSet();
	              Doc doc = new SimpleDoc(fis, flavor, das);
	              job.print(doc, pras);
	          } catch (Exception e) {
	              e.printStackTrace();
	              logger.info("打印异常",e);
	             throw new Exception();
	          }
	      }

本来这种方式是OK的 但是我们的运维人员说 服务器安装打印机的纸张没办法更改,需要重启服务器。重启服务器我们都不愿意。所以改用第二种方式。

第二种:java无驱实现连接打印机打印PDF

代码如下:

 /**
	   * 通过 IP+端口 连接打印机打印文件
	   * @param filePath
	   * @throws Exception
	   */
	  public static void print2(String filePath,String ip) throws Exception{
		  File file = new File(filePath); // 获取选择的文件
		  Socket socket =  new Socket(ip, 9100);
		 
		  OutputStream out = socket.getOutputStream();  
		  FileInputStream fis = new FileInputStream(file);
		  //建立数组
	      byte[] buf = new byte[1024];  
	      int len = 0; 
	      //判断是否读到文件末尾
	      while((len=fis.read(buf)) != -1)
	          {  
	           out.write(buf, 0, len);  
	          }  
	      //告诉服务端,文件已传输完毕  
	      socket.shutdownOutput();
	      socket.close();  
	      fis.close();
	  }

 

打印的过程中:

1、 第一种方式:比如纸张设置。如果装了驱动直接叫运维人员选择纸张大小,当然代码也可以设置 尽量少动手嘛

2、第二种的纸张大小可以在html转pdf的时候设置一下,

43d8835c5e87ddf0aea1f71b2ae830063be.jpg

 

以上就是我要介绍的。如果你有更好的方式可以联系我。

开发中又遇到什么问题可以在下面留言哦 我会回复的。也可以加QQ群:600922504

 

 

 

转载于:https://my.oschina.net/960823/blog/2994220

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Java打印库和PDF渲染库来实现Java调用打印机打印PDF的功能。以下是步骤: 1. 使用PDF渲染库将PDF文件渲染为图像。 2. 使用Java打印库将渲染后的图像打印打印机上。 以下是一个示例代码: ```java import java.awt.print.*; import java.io.*; import javax.print.*; import javax.print.attribute.*; import javax.print.attribute.standard.*; public class PrintPDF { public static void main(String[] args) throws Exception { String filename = "example.pdf"; // Step 1: use PDF renderer to render PDF to image PDFRenderer renderer = new PDFRenderer(new File(filename)); BufferedImage image = renderer.renderImage(0); // Step 2: print image to printer PrinterJob job = PrinterJob.getPrinterJob(); PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); if (services.length > 0) { PrintService printService = services[0]; job.setPrintService(printService); job.setPrintable(new ImagePrintable(job, image)); job.print(); } } } class ImagePrintable implements Printable { private final double x, y, width; private final BufferedImage image; public ImagePrintable(PrinterJob job, BufferedImage image) { PageFormat pf = job.defaultPage(); this.x = pf.getImageableX(); this.y = pf.getImageableY(); this.width = pf.getImageableWidth(); this.image = image; } public int print(Graphics g, PageFormat pf, int pageIndex) { if (pageIndex != 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) g; g2d.translate(x, y); double scaleX = width / image.getWidth(); g2d.scale(scaleX, scaleX); g2d.drawImage(image, 0, 0, null); return PAGE_EXISTS; } } ``` 这个示例代码包含了以下步骤: 1. 使用PDF渲染库将指定的PDF文件渲染为图像。 2. 使用Java打印库获取可用打印机列表并选择第一个打印机。 3. 将图像打印打印机上。 注意:在运行这个示例代码的时候,需要将PDF渲染库和PDF文件的路径替换为实际的路径。 ### 回答2: 在Java中,调用打印机打印PDF文件可以通过使用第三方库或者Java内置的类库来实现。 一种常用的方法是使用第三方库,例如Apache PDFBox。以下是使用Apache PDFBox库进行PDF打印的示例代码: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.printing.PDFPageable; import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.Copies; public class PDFPrinter { public static void printPDF(String filePath) { try { PDDocument document = PDDocument.load(new File(filePath)); PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet(); attributeSet.add(new Copies(1)); // 设定打印份数 PrinterJob job = PrinterJob.getPrinterJob(); job.setPageable(new PDFPageable(document)); job.setPrintService(printService); job.print(attributeSet); document.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String filePath = "path/to/pdf/file.pdf"; printPDF(filePath); } } ``` 上述代码首先使用PDFBox库加载PDF文件,并获取默认的打印服务。然后,创建打印任务,并设置打印参数,例如打印份数。最后,将PDF文件作为可打印的页面,将打印服务绑定到打印任务上,并执行打印操作。 除了使用第三方库外,还可以使用Java内置的类库实现PDF打印。具体方法是使用Java的Desktop类,通过系统默认应用程序打开PDF文件并进行打印。以下是使用Desktop类进行PDF打印的示例代码: ```java import java.awt.Desktop; import java.io.File; public class PDFPrinter { public static void printPDF(String filePath) { try { Desktop desktop = Desktop.getDesktop(); desktop.print(new File(filePath)); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String filePath = "path/to/pdf/file.pdf"; printPDF(filePath); } } ``` 上述代码中,我们首先获取系统默认的桌面,然后使用桌面的print方法来打印PDF文件。请确保系统已配置默认的PDF应用程序,否则打印功能可能无法正常工作。 无论是使用第三方库还是Java内置类库,以上两种方法都能实现Java调用打印机打印PDF文件的功能。 ### 回答3: Java调用打印机打印PDF可以通过使用Java Print API来完成。Java Print API提供了一种在Java程序中与打印机进行交互的方式。 首先,我们需要确保计算机已经安装了合适的PDF打印机驱动程序。例如,Adobe Acrobat Reader通常会安装一个虚拟打印机驱动程序。 然后,我们可以使用Java的PrintServiceLookup类来获取可用的打印机列表,并选择需要的打印机。 接下来,我们可以使用PDFBox等Java库来加载和处理PDF文件。PDFBox是一个开源库,可以用于处理PDF文件,包括读取、创建和打印PDF文件。 在加载了PDF文件后,我们可以使用PrinterJob类来创建打印作业。PrinterJob类提供了各种方法来设置打印作业的属性,例如打印机、纸张类型、页面方向和打印份数等。 一旦设置完打印作业的属性,我们可以调用PrinterJob的print方法来进行实际的打印操作。这将会将PDF文件发送给选择的打印机进行打印。 如果需要更复杂的打印操作,例如打印页面范围或设置打印监听器,我们可以进一步使用PrintRequestAttributeSet和PrintService等类来实现。 总之,通过Java Print API和适当的打印机驱动程序,我们可以方便地使用Java调用打印机打印PDF文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值