标签
工具
字数
807 字
阅读时间
5 分钟
打印功能通过java调用系统的默认打印机打印,打印内容为doc模板,doc模板中可设置待替换的标识符,对其进行替换,然后将其转换为pdf进行打印。
添加依赖
java
<!-- pdf操作 -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.8</version>
</dependency>
<!-- 编辑文档,转换为pdf -->
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>15.8.0</version>
</dependency>打印service
java
import cn.edcall.module.device.exception.MicroRuntimeException;
import cn.edcall.module.device.util.Utility;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.Range;
import com.aspose.words.SaveFormat;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.printing.PDFPageable;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.print.*;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 打印服务类
* @author wangxp
* @Date 2020/12/22
*/
public class PrinterService {
private Logger log = LoggerFactory.getLogger(getClass());
public void print(HashMap<String, Object> receiptInfo) {
//获取转化后的pdf文档
File file = wordToPdf(receiptInfo);
if (null == file) {
log.error("转换的pdf文件为null,转换失败");
throw new MicroRuntimeException(PrinterError.printer_doc2pdf_fail);
}
// 读取pdf文件
PDDocument document = null;
try {
document = PDDocument.load(file);
} catch (IOException e) {
log.error("读取转换的pdf文件失败。",e);
throw new MicroRuntimeException(PrinterError.printer_doc2pdf_fail);
}
try {
log.info("开始打印,号码:{}",receiptInfo.get("{{num}}"));
//打印模板只有一页
PDPage page = document.getPage(0);
//通过pdf模板确定打印的宽和高 模板由word文档确定
float width = page.getMediaBox().getWidth();
float height = page.getMediaBox().getHeight();
// 创建打印任务
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(document));
Paper paper = new Paper();
// 设置打印纸张大小
paper.setSize(width,height); // 72个 inch 为1英寸
// 设置打印位置 坐标
paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); // no margins
// custom page format
PageFormat pageFormat = new PageFormat();
pageFormat.setPaper(paper);
// override the page format
Book book = new Book();
// append all pages 设置一些属性 是否缩放 打印张数等
book.append(new PDFPrintable(document, Scaling.ACTUAL_SIZE,false,0.0F,false), pageFormat, 1);
job.setPageable(book);
// 开始打印
job.print();
} catch (PrinterException e) {
log.error("打印失败。error:",e);
throw new MicroRuntimeException(PrinterError.printer_print_fail);
}finally {
try {
if (document != null){
document.close();
}
} catch (IOException e) {
log.error("文档读取pdf流关闭失败");
}
if(file.exists()&&file.isFile()){
boolean delete = file.delete();
if(!delete){
log.error("生成的pdf文档删除失败");
}
}
}
}
/**
* 将word转化为pdf
* @Params:[receiptInfo]
* @Return: java.io.File
**/
private File wordToPdf(HashMap<String, Object> receiptInfo) {
if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
log.error("验证License失败!");
return null;
}
File file = new File(Utility.getUserDir() + Utility.getFileSeparator() + "/jni/printer/template.pdf");
if (file.exists() && file.isFile()) {
file.delete();
}
FileOutputStream os = null;
try {
// 新建一个空白pdf文档
os = new FileOutputStream(file);
Document doc = new Document(Utility.getUserDir() + Utility.getFileSeparator() + "/jni/printer/template.doc");
Range range = doc.getRange();
//替换标识符内容
Iterator entries = receiptInfo.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
//第一个参数为true表示完全匹配。不完全匹配可忽略大小写
//第二个参数为true表示是在段中才进行替换,替换字符前后都需有字符
range.replace(key,value,true,false);
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
range.replace("{{date}}",dateFormat.format(new Date()),true,false);
doc.save(os, SaveFormat.PDF);
} catch (Exception e) {
log.error("word文档修改文档并转换pdf过程中出现异常。error:",e);
return null;
} finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (IOException e) {
log.error("流关闭异常。",e);
}
}
}
return file;
}
/**
* aspose-words 的license
* @Params:[]
* @Return: boolean
**/
private boolean getLicense() {
boolean result = false;
try {
// 凭证
String licenseStr = "<License>\n" + " <Data>\n" + " <Products>\n"
+ " <Product>Aspose.Total for Java</Product>\n"
+ " <Product>Aspose.Words for Java</Product>\n" + " </Products>\n"
+ " <EditionType>Enterprise</EditionType>\n"
+ " <SubscriptionExpiry>20991231</SubscriptionExpiry>\n"
+ " <LicenseExpiry>20991231</LicenseExpiry>\n"
+ " <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>\n" + " </Data>\n"
+ " <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>\n"
+ "</License>";
InputStream license = new ByteArrayInputStream(licenseStr.getBytes("UTF-8"));
License asposeLic = new License();
asposeLic.setLicense(license);
result = true;
} catch (Exception e) {
log.error("error:", e);
}
return result;
}
}