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)


源码下载

相关推荐
南风微微吹13 小时前
2026年最新国考《行测》《申论》历年真题及答案PDF电子版(2000-2025年)
pdf·国考
q***017721 小时前
SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
spring boot·后端·pdf
嗯、.1 天前
使用Itext9生成PDF水印,兼容不同生成引擎的坐标系(如: Skia、OpenPDF)
java·pdf·itextpdf·openpdf·坐标变换矩阵
拓端研究室1 天前
专题:2025AI产业全景洞察报告:企业应用、技术突破与市场机遇|附920+份报告PDF、数据、可视化模板汇总下载
大数据·人工智能·pdf
南风微微吹1 天前
2026年新大纲普通话考试真题题库50套PDF电子版
pdf·普通话
JHC0000001 天前
Python PDF 相关操作
开发语言·python·pdf
CodeCraft Studio2 天前
ABViewer 16全新发布:3D可视化、PDF转DWG、G-code生成全面升级
pdf
诸神缄默不语3 天前
如何用Python处理文件:Word导出PDF & 如何用Python从Word中提取数据:以处理简历为例
python·pdf·word
i***66503 天前
SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
spring boot·后端·pdf
777VG3 天前
Vue3+vue3-pdf-app@1.0.3实现加载 .pdf文件
前端·javascript·vue.js·pdf