从3d软件里面导出很一张cad总图,然后在总图里面分选各个分部,弄出几十张pdf文件。需要打印出来。
本来觉得应该是很简单的事,想想下载一个批量打印工具就搞定了啊,网络上找啊找,要么是病毒,要么是没给钱,有打印限制(一次10张),我晕,这玩意这么简单的事,想想就伤,整天大数据,人工智能的吹着,这TMD的批量打印点文件还这么折腾。
必须弄一个,查资料,先想肯定是c++这东东好弄吧,但这玩意ui是个事,弄成web的吧,感觉又不太好,毕竟是客户端程序,那跨平台的感觉QT应该可以,代码量是少,QT得先把pdf转成图片,然后才能调用打印机,绕。
本人java出生,又仔细看了看java的打印代码,网上的代码就别提有多伤了,弄下来要么依赖windows组件,要么运行不了。
无赖,不能直接copy,那就只能自己撸。
经查,pdfbox带打印功能,https://pdfbox.apache.org/ ,这货也是醉了,官方网页里面没有maven的配置 。
maven 配置地址: http://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox ,我使用的是2.0.11版本。
核心代码很少,很简单:
public class PrintWork {
public static PDDocument document;
public static void print(File file) throws IOException, PrinterException {
PDDocument document = PDDocument.load(file);
print(document);
document.close();
}
private static void print(PDDocument document) throws IOException, PrinterException
{
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(document));
job.print();
}
}
这还是官方文档里面的example。
经过测试没有问题,多个文档打印也没问题,直接循环调用 print 方法即可:
for (int i = 0; i < total; i++) {
if (this.workStatus == false) {
break;
}
try {
item = this.printList.get(i);
if (item.printStatus == PrintItem.PrintStatus.PRINTED_SUCCESS) {
continue;
}
PrintWork.print(item.file);//这里传入文件对象
item.printStatus = PrintItem.PrintStatus.PRINTED_SUCCESS;
this.tableModel.fireTableDataChanged();
} catch (IOException ex) {
Logger.getLogger(MainJFrame.class.getName()).log(Level.SEVERE, null, ex);
item.printStatus = PrintItem.PrintStatus.PRINTED_ERROR;
} catch (PrinterException ex) {
Logger.getLogger(MainJFrame.class.getName()).log(Level.SEVERE, null, ex);
item.printStatus = PrintItem.PrintStatus.PRINTED_ERROR;
}
this.tableModel.fireTableDataChanged();
}
从表现上看,for循环提交的文档,pdfwork会合并成一个文件给打印机,因为打印机队列里面只有一个文件,而且java程序关闭后,打印不会停止。
加点UI:
最后是重点,源码,欢迎大家撸,程序使用maven管理, netbean开发ui,eclipse再修正一下,主要是netbeans里面ui自动生成的代码不让更改。
源码 :https://gitee.com/asdtiang/batch-printing
java运行包:https://gitee.com/asdtiang/batch-printing/repository/archive/master.zip