JAVA 调用打印机输出PDF文件

想利用java程序打印一些文件。做以下测试:

一、环境

要调用打印机输出文件,首先本地得有一个能正常使用的打印机。我电脑安装的是虚拟打印机。

二、java代码

一)、打印输出的实体类

import java.io.Serializable;
import java.util.Date;
/**
 * @Author: ykbian
 * @Date: 2018/10/24 9:22
 * @Todo: 打印的员工信息实体类
 */
public class Persion implements Serializable {


    private static final long serialVersionUID = 1L;
    private String userName;        //姓名
    private String gender;          //性别
    private String nation;          // 民族
    private String address;        //住址
    private String IDNumber;        //身份证号码
    private int    age;            //启用日期
    private String qrCodePath;        //头像
    private Date   birthday;

    // 以下是get方法、set方法和两个构造函数,省略
}

二)、工具类及测试


/**
 * @Author: ykbian
 * @Date: 2018/10/24 9:24
 * @Todo: 打印的工具类
 */
public class PrintUtil implements Printable {

//    身份证:长度85.6毫米,宽度54毫米,厚度0.9毫米
    //待打印数据的条数,此变量需定义在数据集合之前
    private static int COUNT = 0;
    //待打印的文字数据
    private static List<Persion> STUDENT_LIST = getStudent();
    //日期格式
    private static SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");


   /**
    *@Author:      ykbian
    *@date_time:   2018/10/24 13:41
    *@Description:  重写Printable 的print()方法
    *@param:      Graphic指明打印的图形环境
    *             PageFormat指明打印页格式(页面大小以点为计量单位,1点为1英寸的1/72,1英寸为25.4毫米。A4纸大致为595×842点)
    *             pageIndex指明页号
   */
    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        Component c = null;
        //转换成Graphics2D
        Graphics2D g2 = (Graphics2D) graphics;
        //设置打印颜色为黑色
        g2.setColor(Color.BLACK);
        //打印起点坐标
        double x = pageFormat.getImageableX();
        double y = pageFormat.getImageableY();
        switch (pageIndex) {
            case 0:
                //设置打印字体(字体名称、样式和点大小)(字体名称可以是物理或者逻辑名称)
                //Java平台所定义的五种字体系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInput
                Font font = new Font("新宋体", Font.PLAIN, 20);
                //设置字体
                g2.setFont(font);
                float[] dash1 = {2.0f};
                //设置打印线的属性。
                //1.线宽 2、3、不知道,4、空白的宽度,5、虚线的宽度,6、偏移量
                g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f));

                //获取需要打印的图片,若是动态生成,直接传入绝对路径即可
                Image src = Toolkit.getDefaultToolkit().getImage(STUDENT_LIST.get(COUNT).getQrCodePath());
                System.out.println(STUDENT_LIST.get(COUNT).getQrCodePath());
                if (src == null) {
                    System.out.println("没有找到图像");
                }
                // 图片的坐标(x,y)宽,高
                g2.drawImage(src,(int)120,(int)150,(int)136,(int)220,c);
                //标题,固定不变
                g2.drawString(STUDENT_LIST.get(COUNT).getTitle(), (float) 250, (float)100);
                //以下为动态的文字内容
                font = new Font("新宋体", Font.ROMAN_BASELINE, 15);
                g2.setFont(font);
                g2.drawString("姓名:" + STUDENT_LIST.get(COUNT).getUserName(), (float) 50, (float) 150);
                g2.drawString("性别:" + STUDENT_LIST.get(COUNT).getGender(), (float) 50, (float) 170);
                g2.drawString("民族:" + STUDENT_LIST.get(COUNT).getNation(), (float) 50, (float) 190);
                g2.drawString("住址:" + STUDENT_LIST.get(COUNT).getAddress(), (float) 50, (float) 210);
                g2.drawString("路径:" + STUDENT_LIST.get(COUNT).getQrCodePath(), (float) 50, (float) 230);
                g2.drawString("身份证号码:" + STUDENT_LIST.get(COUNT).getIDNumber(), (float) 50, (float) 250);
                g2.drawString("出生日期:" + FORMAT.format(STUDENT_LIST.get(COUNT).getBirthday()), (float) 50, (float) 280);
                return PAGE_EXISTS;
            default:
                return NO_SUCH_PAGE;
        }

    }

    /**
     * 封装测试数据
     *
     * @return
     */
    private static List<Persion> getStudent() {
        List<Persion> dtos = new ArrayList<>();
        dtos.add(new Persion("姜子牙", "男", "汉", "岐山县", "622222111111111111", 800, "E:\\test\\jzy.jpg", new Date(), "居民身份证"));
        dtos.add(new Persion("杨戬", "男", "汉", "岐山县", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份证"));
        dtos.add(new Persion("哪吒", "男", "汉", "岐山县", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份证"));
        dtos.add(new Persion("雷震子", "男", "汉", "岐山县", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份证"));
        dtos.add(new Persion("哮天犬", "男", "汉", "岐山县", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份证"));
//
        if (dtos.size() > 0) {
            COUNT = dtos.size() - 1;
            System.out.println("总共需打印" + (COUNT + 1) + "次");
        }
        return dtos;
    }

    public static void main(String[] args) {
        //    通俗理解就是书、文档
        Book book = new Book();
        //    设置成竖打()
        PageFormat pf = new PageFormat();
        pf.setOrientation(PageFormat.PORTRAIT);
        //    通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
        Paper p = new Paper();
        //纸张大小
        p.setSize(1000, 618);
        // 页面可打印的区域大小(左上角定位,参数分别是x轴,y轴,宽度和长度)
        p.setImageableArea(15, 15, 800, 600);
        pf.setPaper(p);
        //    把 PageFormat 和 Printable 添加到书中,组成一个页面
        book.append(new PrintUtil(), pf);
        //获取打印服务对象
        PrinterJob job = PrinterJob.getPrinterJob();
        // 设置打印类
        job.setPageable(book);
        try {
            if (STUDENT_LIST.size() > 0) {
                for (int i = 0; i < STUDENT_LIST.size(); i++) {
                    job.print();
                    --COUNT;
                }
            }
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }
}

三、输出结果

运行程序,输出结果如下:

然而,还是存在一些问题,图片打印失败。不知道为什么… …

四、源码

源码在这里:https://github.com/bian1234/JAVAPrintTest

五、鸣谢

参考文章:

  1. https://blog.csdn.net/qq_38743494/article/details/79132722
  2. https://blog.csdn.net/postersxu/article/details/80705247
  3. https://www.cnblogs.com/gaopeng527/p/4357591.html
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值