PDF自动打印

​ 最近接到用户提过来的需求,需要一个能够自动打印图纸的功能,经过几天的研究整出来个初版了的,分享出来给大家,希望能有帮助。
需求描述:

​ 生产车间现场每天都有大量的图纸需要打印,一个一个打印太慢了,希望可以有个批量打印的功能。
分析

​ 我们的图纸是存在服务器上,都是pdf版本的,所以批量打印程序可以通过文件名称,然后程序自动将共享文件推送到打印机上打印,这样就可以实现自动化了,并且后续还可以根据情况进行扩展

代码

初版的程序比较简单,使用的是springboot + spring shell 来实现,具体代码如下:

xml 复制代码
<!-- pom.xml 片段 -->
<!-- spring-boot-starter 版本是随意选的 -->
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.7.14</version>
</parent>
<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  <!-- spring-shell 版本需要与 spring-boot-starter 匹配 -->
    <dependency>
      <groupId>org.springframework.shell</groupId>
      <artifactId>spring-shell-starter</artifactId>
      <version>2.1.11</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.26</version>
      <optional>true</optional>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.pdfbox</groupId>
      <artifactId>pdfbox</artifactId>
      <version>2.0.26</version>
    </dependency>
      <dependency>
          <groupId>cn.hutool</groupId>
          <artifactId>hutool-all</artifactId>
          <version>5.8.22</version>
      </dependency>
  </dependencies>

<build>
    <finalName>DrawPrinter</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>2.5.4</version> <!-- 使用适合你的Spring Boot版本 -->
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

shell命令代码

java 复制代码
package xxxx;

import cn.hutool.core.util.StrUtil;
import com.higer.ipd.tools.drawprinter.commons.PdfPrinter;
import com.higer.ipd.tools.drawprinter.entity.DrawInfoEntity;
import com.higer.ipd.tools.drawprinter.service.IDrawInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;

import java.io.File;
import java.util.HashMap;
import java.util.List;

@ShellComponent
public class CommonCommand {
    @Autowired
    private IDrawInfoService drawInfoService;

    @ShellMethod(value = "打印消息",key="000",group = "test")
    public void printMessage(String message) {
        System.out.println(message);
    }
    @ShellMethod(value = "查看本地打印机",key="101",group = "print")
    public void showLocPrinter(){
        PdfPrinter.getLocalPrinter().keySet().forEach(System.out::println);
    }
    @ShellMethod(value="打印图纸",key="103",group = "print")
    public void printPdf(String printerName,String fileName,String pageSize){
        try {
            String result = PdfPrinter.print(new File(fileName), printerName, pageSize);
            if(StrUtil.isBlank(result)){
                System.out.println("打印成功!");
            }else{
                System.out.println(result);
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("打印出错!");
        }
    }
}

上面开发了两个shell命令:"查看本地打印机"和"打印图纸".

打印图纸代码片段如下:

java 复制代码
public static String print(File file, String printerName,String pageSize) throws Exception {
  if(StrUtil.isBlank(printerName) || file == null || !file.exists()){
    return "未指定打印机或待文件不存在,请确认!";
  }
  // 1.根据打印机名称找到对应的打印机服务,
  Map<String, PrintService> printerMap = getLocalPrinter();
  PrintService printService = printerMap.get(printerName);
  if(printService == null){
    return "没有找到指定的打印机!";
  }
  // 2.加载pdf文件,并设置打印配置,打印
  try (PDDocument document = PDDocument.load(file)){
    PrinterJob printJob = PrinterJob.getPrinterJob();
    printJob.setJobName(file.getName());
    printJob.setPrintService(printService);
    PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.SCALE_TO_FIT);
    Book book = new Book();
    PageFormat pageFormat = new PageFormat();
    pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向
    pageFormat.setPaper(getPaper(pageSize));//设置纸张
    book.append(pdfPrintable, pageFormat, document.getNumberOfPages());
    printJob.setPageable(book);
    printJob.setCopies(1);//设置打印份数
    HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet();
    pars.add(Sides.ONE_SIDED); //设置单双页
    printJob.print(pars);
  }
  return "";
}

效果

启动后进入输入命令状态,输入help可以看到帮助信息,效果如下:

输入 help 103 可以看到打印图纸的帮助信息,命令格式为: 103 打印机名称 文件名称 页面大小(A3/A4)


源码下载

相关推荐
一个处女座的程序猿17 小时前
LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略
pdf·markdown·zerox
Dxy123931021617 小时前
python下载pdf
数据库·python·pdf
周亚鑫17 小时前
vue3 pdf base64转成文件流打开
前端·javascript·pdf
一名技术极客18 小时前
Vue2 doc、excel、pdf、ppt、txt、图片以及视频等在线预览
pdf·powerpoint·excel·文件在线预览
S. Dylan1 天前
Edge浏览器打开PDF无法显示电子签章
edge·pdf
一马平川的大草原1 天前
如何基于pdf2image实现pdf批量转换为图片
计算机视觉·pdf·文件拆分
m0_594526301 天前
Python批量合并多个PDF
java·python·pdf
hairenjing11231 天前
将图片添加到 PDF 的 5 种方法
pdf
✿゚卡笨卡1 天前
pdf 添加页眉页脚,获取前五页
java·pdf
blegn1 天前
PDF编辑工具Adobe Acrobat DC 2023安装教程(附安装包)
pdf·办公软件·office