java链接打印机打印文件

获取打印机的名字:

// 获取打印机
public static List<String> findPrints() {
    List<String> list = new ArrayList<>();
    HashPrintRequestAttributeSet requestAttributeSet = new HashPrintRequestAttributeSet();
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
    //查找所有的可用的打印服务
    PrintService[] printService = PrintServiceLookup.lookupPrintServices(flavor, requestAttributeSet);
    if (printService == null || printService.length == 0) {
        log.info("打印获取失败,未找到可用打印机,请检查。");
    }
    if (printService != null) {
        for (PrintService print : printService) {
            list.add(print.getName());
        }
    }
    return list;
}


PFD文件打印

  <!--打印-->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.6</version>
        </dependency>

代码:

需要获得打印机的名称

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;

public class DYController {
    public static void main(String[] args) throws Exception {
        
        String pdfFile = "E:\\a.pdf";//文件路径
        File file = new File(pdfFile);
        String printerName = "HP MFP M436 PCL6";//打印机名包含字串
        PDFprint(file,printerName);
    }

    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(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;
    }

}

excel转换成pdf 

生成excel请看下面的链接:

java导出Excel_Mr_Jin.的博客-CSDN博客_java导出excel方法https://blog.csdn.net/Java_Mr_Jin/article/details/124076055?spm=1001.2014.3001.5501

当然我们的excel要想打印可以转换成pdf的形式,再用上面的进行打印:

关于word转换pdf需要用到jaboc,所以在这需要先下载jaboc.jar包,链接及提取码如下:

链接: 链接: https://pan.baidu.com/s/17nLuDAYC33Yu8KvwS2J2gA 

提取码: qwer 

将jar包解压后

1.将Jacob.jar包复制到程序的jdk的lib文件夹下

2.将dll文件复制到jdk的bin目录下 

 然后在idea中引入jacob.jar包

 


		<dependency>
			<groupId>com.hynnet</groupId>
			<artifactId>jacob</artifactId>
			<version>1.18</version>
		</dependency>

 在java中进行实现excel转换成pdf:

package com.sangeng.controller;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

import java.io.File;

public class DYPdfController {
    //word转化pdf,传入转换前的文件路径(例:"E:\\a.docx")和转换后的文件路径(例:"E:\\a.pdf")

    public static void main(String[] args) {
        String sFilePath = "D:\\java-demo\\zzzzz\\qqq.doc";//文件路径
        String toFilePath = "D:\\java-demo\\zzzzz\\qqq.pdf";
        wordToPDF(sFilePath,toFilePath);
    }

    public static void wordToPDF(String sFilePath,String toFilePath) {

        System.out.println("启动 Word...");
        long start = System.currentTimeMillis();
        ActiveXComponent app = null;
        Dispatch doc = null;
        try {
            app = new ActiveXComponent("Word.Application");
            app.setProperty("Visible", new Variant(false));
            Dispatch docs = app.getProperty("Documents").toDispatch();
            doc = Dispatch.call(docs, "Open", sFilePath).toDispatch();

            System.out.println("打开文档:" + sFilePath);
            System.out.println("转换文档到 PDF:" + toFilePath);

            File tofile = new File(toFilePath);
            if (tofile.exists()) {
                tofile.delete();
            }
            Dispatch.call(doc, "SaveAs", toFilePath,17);//17是pdf格式 // FileName
            long end = System.currentTimeMillis();
            System.out.println("转换完成..用时:" + (end - start) + "ms.");
        } catch (Exception e) {
            System.out.println("========Error:文档转换失败:" + e.getMessage());
        } finally {
            Dispatch.call(doc, "Close", false);
            System.out.println("关闭文档");
            if (app != null)
                app.invoke("Quit", new Variant[]{});
        }
        // 如果没有这句话,winword.exe进程将不会关闭
        ComThread.Release();
    }
}

 当然转换打印完成后。记得删除生成的pdf文件:

                File file=new File(toFilePath);
                if(file.exists()&&file.isFile())
                    file.delete();

直接excel进行打印

缺点:就是不能更改打印参数

package com.sangeng.controller;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class WordController {
    public static void main(String[] args) {

        String filePath = "E:\\a.docx";//文件路径
        String printerName = "HP MFP M436 PCL6";//打印机名包含字串
        printWord(filePath,printerName);

    }

    public static void printWord(String filePath, String printerName){
//        初始化线程
        ComThread.InitSTA();
        ActiveXComponent word = new ActiveXComponent("Word.Application");
        //设置打印机名称
        word.setProperty("ActivePrinter", new Variant(printerName));
        // 这里Visible是控制文档打开后是可见还是不可见,若是静默打印,那么第三个参数就设为false就好了
        Dispatch.put(word, "Visible", new Variant(false));
        // 获取文档属性
        Dispatch document = word.getProperty("Documents").toDispatch();
        // 打开激活文挡
        Dispatch doc=Dispatch.call(document, "Open", filePath).toDispatch();
        //Dispatch doc = Dispatch.invoke(document, "Open", Dispatch.Method,
        //  new Object[] { filePath }, new int[1]).toDispatch();
        try{
            Dispatch.callN(doc, "PrintOut");
            System.out.println("打印成功!");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("打印失败");
        }finally {
            try {
                if (doc != null) {
                    Dispatch.call(doc, "Close", new Variant(0));//word文档关闭
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
            //退出
            word.invoke("Quit", new Variant[0]);
            //释放资源
            ComThread.Release();
            ComThread.quitMainSTA();
        }
    }
}

导入C盘失效 

文件不能直接导入c盘,因为权限问题。所以先创建一个文件夹,再导入即可

 File dir=new File("C:\\nmgbzj");
        File file2=new File(dir.getPath()+"/");
        if(!dir.exists()){
            dir.mkdir();
            file2.createNewFile();
        }else{
            if(file2.exists()){
                file2.delete();
                file2.createNewFile();
            }else{
                file2.createNewFile();
            }

        }

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中连接打印机并启动打印txt文件,需要使用Java打印API。以下是一个简单的示例代码: ```java import java.io.FileInputStream; import javax.print.Doc; import javax.print.DocFlavor; import javax.print.DocPrintJob; import javax.print.PrintException; import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.SimpleDoc; public class PrintUtility { public void printTextFile(String filePath) { try { // 获取默认打印机服务 PrintService service = PrintServiceLookup.lookupDefaultPrintService(); // 创建打印任务 DocPrintJob printJob = service.createPrintJob(); // 设置打印内容 FileInputStream fis = new FileInputStream(filePath); DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; Doc doc = new SimpleDoc(fis, flavor, null); // 启动打印任务 printJob.print(doc, null); fis.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的示例代码中,我们首先获取了默认打印机PrintService对象。然后,我们创建了一个打印任务,将打印内容设置为txt文件的内容,并启动打印任务。 需要注意的是,如果txt文件的编码格式不是默认编码格式(通常是UTF-8或GBK),则需要在创建SimpleDoc对象时指定正确的编码格式,例如: ```java DocFlavor flavor = DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_8; // UTF-8编码 DocFlavor flavor = DocFlavor.INPUT_STREAM.TEXT_PLAIN_GBK; // GBK编码 ``` 另外,如果需要打印其他格式的文件,可以根据文件类型选择不同的DocFlavor,例如: ```java DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF; // PDF文件 DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG; // PNG图片文件 ``` 需要注意的是,不同的打印机可能支持的打印格式不同,因此在选择打印机和打印格式时需要进行测试和验证。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值