JAVA调用打印机,打印PDF文件

1. 导入maven依赖

  <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.6</version>
        </dependency>

2. .yml文件中配置匹配打印机

file:
  printerName: Brother DCP-L2550DW series Printer

3. 编写工具类

import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;

import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Sides;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;

/**
 * 类描述:TODO
 * 打印机工具类
 * @author HBO
 * @date 2022-12-02 13:59
 **/
@Slf4j
public class PrintUtlis {

    public static void PDFprint(File file, String printerName) throws Exception {
        PDDocument document = null;
        try {
            document = PDDocument.load(file);
            PrinterJob printJob = PrinterJob.getPrinterJob();
            printJob.setJobName(file.getName());
            if (printerName != null) {
                // 查找并设置打印机
                //获得本台电脑连接的所有打印机
                PrintService[] printServices = PrinterJob.lookupPrintServices();
                if (printServices == null || printServices.length == 0) {
                  log.info("打印失败,未找到可用打印机,请检查。");
                    return;
                }
                PrintService printService = null;
                //匹配指定打印机
                for (int i = 0; i < printServices.length; i++) {
                    if (printServices[i].getName().contains(printerName)) {
                        System.out.println(printServices[i].getName());
                        printService = printServices[i];
                        break;
                    }
                }
                if (printService != null) {
                    printJob.setPrintService(printService);
                } else {
                    log.info("打印失败,未找到名称为" + printerName + "的打印机,请检查。");
                    return;
                }
            }
            //设置纸张及缩放
            PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);
            //设置多页打印
            Book book = new Book();
            PageFormat pageFormat = new PageFormat();
            //设置打印方向
            pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向
            pageFormat.setPaper(getPaper());//设置纸张
            book.append(pdfPrintable, pageFormat, document.getNumberOfPages());
            printJob.setPageable(book);
            printJob.setCopies(1);//设置打印份数
            //添加打印属性
            HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet();
            pars.add(Sides.DUPLEX); //设置单双页
            printJob.print(pars);
        } finally {
            if (document != null) {
                try {
                    document.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    public static Paper getPaper() {
        Paper paper = new Paper();
        // 默认为A4纸张,对应像素宽和高分别为 595, 842
        int width = 595;
        int height = 842;
        // 设置边距,单位是像素,10mm边距,对应 28px
        int marginLeft = 10;
        int marginRight = 0;
        int marginTop = 10;
        int marginBottom = 0;
        paper.setSize(width, height);
        // 下面一行代码,解决了打印内容为空的问题
        paper.setImageableArea(marginLeft, marginRight, width - (marginLeft + marginRight), height - (marginTop + marginBottom));
        return paper;
    }
}

4.控制类设置调用

  //连接打印机打印文件
        try {
            PrintUtlis.PDFprint(new File(s1), printerName);
        } catch (Exception e) {
            return AjaxResult.error("打印失败");
        }

5.效果图

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答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文件
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值