Skip to content
标签
工具
字数
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;
    }
}