1、demo
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;
import javax.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaSize;
import javax.print.attribute.standard.MediaSizeName;
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.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class PrintDemo {
    public static void main(String[] argv) throws Exception {
        // File file = new File("C:/Users/admin/Desktop/5446185be875e006f2f7a5a8c80efbd3.jpeg");
        // String printerName = "HP ColorLaserJet M253-M254";//打印机名包含字串
        // JPGPrint(file, printerName);
        String pdfFile = "C:/Users/admin/Desktop/企业-回避申请书_20240415154113A018.pdf";//文件路径
        File file = new File(pdfFile);
        String printerName = "HP ColorLaserJet M253-M254";//打印机名包含字串
        PDFPrint(file, printerName);
    // 传入文件和打印机名称
    public static void JPGPrint(File file, String printerName) throws PrintException {
        if (file == null) {
            System.err.println("缺少打印文件");
        FileInputStream fis = null;
        try {
            // 设置打印格式,如果未确定类型,可选择autosense
            DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
            // 设置打印参数
            PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
            aset.add(new Copies(1)); //份数
            //aset.add(MediaSize.ISO.A4); //纸张
            // aset.add(Finishings.STAPLE);//装订
            aset.add(Sides.DUPLEX);//单双面
            // 定位打印服务
            PrintService printService = null;
            if (printerName != null) {
                //获得本台电脑连接的所有打印机
                PrintService[] printServices = PrinterJob.lookupPrintServices();
                if (printServices == null || printServices.length == 0) {
                    System.out.print("打印失败,未找到可用打印机,请检查。");
                    return;
                //匹配指定打印机
                for (int i = 0; i < printServices.length; i++) {
                    System.out.println(printServices[i].getName());
                    if (printServices[i].getName().contains(printerName)) {
                        printService = printServices[i];
                        break;
                if (printService == null) {
                    System.out.print("打印失败,未找到名称为" + printerName + "的打印机,请检查。");
                    return;
            fis = new FileInputStream(file); // 构造待打印的文件流
            Doc doc = new SimpleDoc(fis, flavor, null);
            DocPrintJob job = printService.createPrintJob(); // 创建打印作业
            job.print(doc, aset);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } finally {
            // 关闭打印的文件流
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
    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) {
                    System.out.print("打印失败,未找到可用打印机,请检查。");
                    return;
                PrintService printService = null;
                //匹配指定打印机
                for (int i = 0; i < printServices.length; i++) {
                    System.out.println("打印机名称" + i + ":" + printServices[i].getName());
                    if (printServices[i].getName().contains(printerName)) {
                        printService = printServices[i];
                        break;
                if (printService != null) {
                    printJob.setPrintService(printService);
                } else {
                    System.out.print("打印失败,未找到名称为" + 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;
         2、utils
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;
import org.springframework.stereotype.Component;
import javax.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.*;
import java.awt.print.*;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
public class PrintUtils {
     * 无驱(通过ip连接打印机)
     * @param pdfPath
     * @param printIp
    public static void printPDF(String pdfPath, String printIp) {
        String ip = printIp; //打印机ip
        int port = 9100; // 打印机端口
        int timeout = 3000; //连接超时时间
        File file = new File(pdfPath);
        Socket socket = new Socket();
        try {
            socket.connect(new InetSocketAddress(ip, port), timeout);
            OutputStream out = socket.getOutputStream();
            FileInputStream fis = new FileInputStream(file);
            System.out.println(file.length());
            //建立数组
            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();
        } catch (Exception e) {
            e.printStackTrace();
     * 有驱(通过打印机驱动实现打印)
     * @param file
    public static void printPDF2(File file) throws Exception {
        PDDocument document = null;
        try {
            document = PDDocument.load(file);
            // 1.创建一个打印任务,用于处理打印任务。使用PrinterJob类来实现。
            PrinterJob printJob = PrinterJob.getPrinterJob();
            printJob.setJobName(file.getName());
            // 2.通过PrinterJob类的getPrintService()方法获取默认的打印机。
            PrintService printService = printJob.getPrintService();
            System.out.println(printService);
            if (printService != null) {
                printJob.setPrintService(printService);
            } else {
                // System.out.print("打印失败,未找到名称为" + printerName + "的打印机,请检查。");
                System.out.print("打印失败,名称为" + printService + "的打印机未被设置成系统默认打印机,请检查。");
                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;
    public static void main(String[] args) throws IOException {
        String docPath = "D:/ass/uploadPath/upload/测试文档.docx";
        String pdfPath = "D:/ass/uploadPath/upload/测试文档.pdf";
        WordToPdf.word2pdf(docPath, pdfPath);
        File file = new File(pdfPath);
        try {
            printPDF2(file);
        } catch (Exception e) {
            throw new RuntimeException(e);
				
前段时间项目中刚好有遇到这个需求,具体是实现将上传到服务端的附件进行不下载在线打印打印时要进行预览。 一开始是想直接使用Java API的打印方法,具体实现时发现在启用后可以调出打印对话框,但打印机没有反应,查看了网上的很多方法,试了下还是不行,就放弃了。看下Java实现的代码: import java.io.FileInputStream; import java.io.FileNotF...
我这里有以前收藏的代码,两个类实现了简易的文本打印机的功能,包括预览。简单跟你说一下。 1、PrinterDemo.java主体类,也是入口类,里面有main方法可以直接在Eclipse中调试运行,他实现了从本地磁盘读取文本类文件打印以及打印预览的功能,其中File动作按钮中的PrintPreviw就是打印预览功能,你可以运行看看。 2、PrintPreview.java打印预览类,...
    function dayin(){          var url='·········································';         $("body").append('');               var dialog=$("#o 若依 com.alibaba.fastjson2.JSONObject cannot be cast to com.zhtech.common.core.domain.model.LoginUser 若依 com.alibaba.fastjson2.JSONObject cannot be cast to com.zhtech.common.core.domain.model.LoginUser CSDN-Ada助手: 恭喜您发布了第14篇博客!看到标题中提到的问题,我想说您遇到的这种情况可能是因为类型转换出现了问题。希望在解决这个问题的过程中您能够积累更多的经验,为以后的创作打下更加坚实的基础。建议您在下一篇博客中分享一些解决这类问题的经验和技巧,让更多人受益。期待您的下一篇作品!继续加油! 若依 com.alibaba.fastjson2.JSONObject cannot be cast to com.zhtech.common.core.domain.model.LoginUser Java 实现Word文档转PDF