最近接到用户提过来的需求,需要一个能够自动打印图纸的功能,经过几天的研究整出来个初版了的,分享出来给大家,希望能有帮助。
需求描述:
生产车间现场每天都有大量的图纸需要打印,一个一个打印太慢了,希望可以有个批量打印的功能。
分析:
我们的图纸是存在服务器上,都是pdf版本的,所以批量打印程序可以通过文件名称,然后程序自动将共享文件推送到打印机上打印,这样就可以实现自动化了,并且后续还可以根据情况进行扩展
代码:
初版的程序比较简单,使用的是springboot + spring shell 来实现,具体代码如下:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.7.14version>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.shellgroupId>
<artifactId>spring-shell-starterartifactId>
<version>2.1.11version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.26version>
<optional>trueoptional>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.apache.pdfboxgroupId>
<artifactId>pdfboxartifactId>
<version>2.0.26version>
dependency>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.8.22version>
dependency>
dependencies>
<build>
<finalName>DrawPrinterfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.5.4version>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
shell命令代码
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命令:“查看本地打印机"和"打印图纸”.
打印图纸代码片段如下:
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)