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 分钟前
网页转PDF字体出错不报错,我先看文件大小
图像处理·人工智能·计算机视觉·pdf
鲲穹AI种草10 小时前
PDF 编辑工具怎么选,多款工具实际使用情况整理
pdf·pdf 编辑工具
阿松爱学习12 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
andrsted12 小时前
练题簿在线免费刷题:Word、PDF 导题与预览补全,把现成资料变成可练习题库
微信小程序·小程序·pdf·word·学习方法·刷题
AI行业应用研究12 小时前
会务信息载体的演进:纸质、PDF 与结构化数据源的分发成本与版本一致性
大数据·人工智能·安全·小程序·架构·pdf
king135987455013 小时前
EmbeddingGemma 2 270M 实测:Mac CPU、PDF/Word、256d 与 FTS5
macos·pdf·word
2501_9307077816 小时前
使用C#代码从 PDF 文档中提取附件
pdf
程序人生88819 小时前
PDF 转 Word 版式错乱、表格丢失?DocConverter Web 格式互转引擎的保真实践
前端·人工智能·opencv·机器学习·pdf·word
ComPDFKit2 天前
用 ComPDF DocSlight 提取 PDF 表格:三种样本实测与 Python 接入
开发语言·python·pdf·pdf表格提取
yiyideda2 天前
保单OCR工程实践:PDF/扫描件/纸质拍照三种输入下的字段结构化方案
计算机视觉·pdf·ocr·车险保单识别·保单ocr识别