Java本地电脑链接打印机打印文件,直接即CV可用boot篇

最近再写一个快递项目,类似菜鸟驿站,刚好组员需要文件打印的代码

为了方便大家使用 以下代码可以直接 ctrl+C,ctrl+V 连接打印机即可使用

话不多说见代码

pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

 打印测试方法

package com.example.printdemo.test;

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;

import static jdk.nashorn.internal.objects.Global.print;

/**
 * @author shaox
 * @date 2023/6/26
 * @apiNote
 */
public class PtintTest {
    public static void main(String[] args) throws Exception {


        String pdfFile = "D:\\test.pdf";//需要打印的文件路径 



        File file = new File(pdfFile);


        String printerName = "导出为WPS PDF";//打印机名包含字串 这个可以用来测试


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

}

以上代码cv可以直接使用

 也可以先启动一下查看本地打印列表 啊哈

也可以在阿里云上直接下载图片加一个方法即可 贴下面了

 public static File download(String urlString) {
        InputStream is = null;
        FileOutputStream os = null;
        try {
            // 构造URL
            URL url = new URL(urlString);
            // 打开连接
            URLConnection con = url.openConnection();
            // 输入流
            is = con.getInputStream();
            // 1K的数据缓冲
            byte[] bs = new byte[1024];
            // 读取到的数据长度
            int len;
            // 输出的文件流
            String filename = System.getProperty("os.name").toLowerCase().contains("win") ? System.getProperty("user.home") + "\\Desktop\\temp.pdf" : "/home/project/temp.pdf";
            File file = new File(filename);
            os = new FileOutputStream(file, true);
            // 开始读取
            while ((len = is.read(bs)) != -1) {
                os.write(bs, 0, len);
            }

            return file;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 完毕,关闭所有链接
            try {
                if (null != os) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (null != is) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //从微信下载图片时如果没有id对应的图片则下载一个空图片,不会存在返回为null的情况
        return null;
    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要给本地视频文件添加字幕,可以使用JavaCV和OpenCV库来实现。以下是一个基本的示例,演示如何使用JavaCV和OpenCV来读取视频文件并在每一帧上添加文本。 首先,需要添加JavaCV和OpenCV库的依赖项。这可以通过在您的项目中添加以下Maven依赖项来完成: ``` <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>opencv</artifactId> <version>4.5.1-1.5.3</version> </dependency> ``` 接下来,可以使用以下代码来打开视频文件并读取每一帧: ``` FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("path/to/video.mp4"); grabber.start(); Frame frame; while ((frame = grabber.grabFrame()) != null) { // 处理每一帧 } grabber.stop(); grabber.release(); ``` 在处理每一帧时,可以使用JavaCV的CanvasFrame类将帧显示在屏幕上。然后可以使用OpenCV的putText方法在图像上添加文本。以下是一个完整的示例: ``` FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("path/to/video.mp4"); grabber.start(); CanvasFrame canvas = new CanvasFrame("Video"); Frame frame; while ((frame = grabber.grabFrame()) != null) { if (canvas.isVisible()) { // 在CanvasFrame上显示帧 canvas.showImage(frame); // 将帧转换为OpenCV Mat格式 Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage image = converter.getBufferedImage(frame); Mat mat = new Mat(image.getHeight(), image.getWidth(), CV_8UC3); byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); mat.data().put(data); // 在图像上添加文本 Imgproc.putText(mat, "Hello, world!", new Point(50, 50), FONT_HERSHEY_SIMPLEX, 1.0, new Scalar(255, 255, 255), 2); // 将Mat转换回JavaCV Frame格式并显示 Frame newFrame = converter.convert(mat); canvas.showImage(newFrame); } } canvas.dispose(); grabber.stop(); grabber.release(); ``` 这个示例将在每一帧上添加“Hello, world!”的文本。您可以根据需要更改文本的位置,字体,大小和颜色。另外,要将字幕保存到视频文件中,您可以使用JavaCV的FFmpegFrameRecorder类来创建一个新的视频文件并将每一帧写入其中,就像读取视频文件一样。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值