使用poi-tl填充word模板,并转化为pdf输出

后端

依赖

java 复制代码
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.12.0</version>
</dependency>

Word版本

Word版本填充代码

java 复制代码
		// 培训详情
       


        HashMap<String, Object> textMap = new HashMap<>();
        textMap.put("projectNo", projectInitiation.getProjectNo());
        textMap.put("projectName", projectInitiation.getProjectName());
        textMap.put("organization1", organization.getName());
        textMap.put("email", Objects.isNull(user.getEmail()) ? "" : user.getEmail());
        textMap.put("headPhone", Objects.isNull(deviceManage.getHeadPhone()) ? "" : deviceManage.getHeadPhone());
        // 查看培训人员(扫码查看)
        QrConfig config = new QrConfig(300, 300);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(3);
        HashMap<String, String> qrMap = new HashMap<>();
        qrMap.put("type", RandomUtil.randomString(5));
        qrMap.put("data", AESUtils.encodeBase64(String.valueOf(visitationTask.getId())));
        String qr = QrCodeUtil.generateAsBase64(JsonUtils.objectToJsonString(qrMap), config, ImgUtil.IMAGE_TYPE_JPG);
        textMap.put("detailPages", Pictures.ofBase64(qr, PictureType.JPEG).size(100, 100).create());

        // 选中
        textMap.put("redio", "\u2611");

        textMap.put("customerSignature", Objects.isNull(cultivateDetail.getCustomerSignature()) ? "" : Pictures.ofUrl(cultivateDetail.getCustomerSignature(), PictureType.JPEG).size(100, 50).create());
        textMap.put("engineerSignature", Objects.isNull(cultivateDetail.getEngineerSignature()) ? "" : Pictures.ofUrl(cultivateDetail.getEngineerSignature(), PictureType.JPEG).size(100, 50).create());


        // 获取文件流
        try {
            InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/培训服务报告.docx");
            XWPFTemplate template = XWPFTemplate.compile(inputStream).render(textMap);

            Map<String, Object> map = new HashMap<>();
            ByteArrayOutputStream fos = new ByteArrayOutputStream();
            template.write(fos);
            byte[] bytes = fos.toByteArray();
            byte[] convertToPdf = Doc2PdfUtil.doc2Pdf(bytes);
            String bytesRes = StringUtils.bytesToHexString2(convertToPdf);
            map.put("bytes", bytesRes);
            map.put("title", System.currentTimeMillis() + "培训服务报告.docx");
            fos.close();
            template.close();


            return Response.successJson(map);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

pdf版本

依赖

java 复制代码
		<!--aspose 破解 word转pdf-->
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>16.8.0-jdk16</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/aspose-words-16.8.0-jdk16.jar</systemPath>
        </dependency>

license放到resources下面 license.xml

java 复制代码
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

word转pdf工具类

java 复制代码
package com.gangwantech.web.utils;

import com.aspose.words.*;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class Doc2PdfUtil {

    /**
     * 加载授权配置文件
     *
     * @return
     */
    private static boolean getLicense() {
        boolean result = false;
        try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("license.xml")) {
            // License的包路径必须为com.aspose.words.License
            License license = new License();
            license.setLicense(in);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * doc转pdf
     *
     * @return
     */
    public static byte[] doc2Pdf(byte[] bytes) {
        System.out.println("pdf转换中...");
        long old = System.currentTimeMillis();

        try (ByteArrayOutputStream fos = new ByteArrayOutputStream()) {
            // 验证
            if (!getLicense()) {
                throw new RuntimeException("文件转换失败!");
            }
            // 加载字体
            //FontSettings settings = FontSettings.getDefaultInstance();
            //String[] fontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
            //settings.setFontsFolders(fontFamilyNames, true);
            //LoadOptions loadOptions = new LoadOptions();
            //loadOptions.setFontSettings(settings);

             加载字体
            //FontSettings settings = FontSettings.getDefaultInstance();
            //settings.setFontsFolder("C:\\Windows\\Fonts", true);
            //LoadOptions loadOptions = new LoadOptions();
            //loadOptions.setFontSettings(settings);

            ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
            //Document document = new Document(inputStream, loadOptions);
            Document document = new Document(inputStream);

            document.save(fos, SaveFormat.PDF);
            byte[] buffer = fos.toByteArray();
            long now = System.currentTimeMillis();
            System.out.println("pdf转换成功,共耗时:" + ((now - old) / 1000.0) + "秒");
            return buffer;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("文件转换失败!");
        }
    }
}

pdf版本填充代码,并生成pdf下载

java 复制代码
		// 培训详情
        CultivateDetail cultivateDetail = cultivateDetailService.selectOne(new QueryWrapper<CultivateDetail>()
                .eq("work_id", visitationTask.getWorkOrderId())
        );
        
        HashMap<String, Object> textMap = new HashMap<>();
        textMap.put("projectNo", projectInitiation.getProjectNo());
        textMap.put("projectName", projectInitiation.getProjectName());
        // 查看培训人员(扫码查看)
        QrConfig config = new QrConfig(300, 300);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(3);
        HashMap<String, String> qrMap = new HashMap<>();
        qrMap.put("type", RandomUtil.randomString(5) + "train");
        qrMap.put("data", AESUtils.encodeBase64(String.valueOf(visitationTask.getId())));
        String qr = QrCodeUtil.generateAsBase64(JsonUtils.objectToJsonString(qrMap), config, ImgUtil.IMAGE_TYPE_JPG);
        textMap.put("detailPages", Pictures.ofBase64(qr, PictureType.JPEG).size(100, 100).create());

        // 选中
        textMap.put("redio", "\u2611");

        textMap.put("customerSignature", Objects.isNull(cultivateDetail.getCustomerSignature()) ? "" : Pictures.ofUrl(cultivateDetail.getCustomerSignature(), PictureType.JPEG).size(100, 50).create());
        textMap.put("engineerSignature", Objects.isNull(cultivateDetail.getEngineerSignature()) ? "" : Pictures.ofUrl(cultivateDetail.getEngineerSignature(), PictureType.JPEG).size(100, 50).create());


        // 获取文件流
        try {
            InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/培训服务报告.docx");
            XWPFTemplate template = XWPFTemplate.compile(inputStream).render(textMap);

            Map<String, Object> map = new HashMap<>();
            ByteArrayOutputStream fos = new ByteArrayOutputStream();
            template.write(fos);
            byte[] bytes = fos.toByteArray();
            byte[] convertToPdf = Doc2PdfUtil.doc2Pdf(bytes);
            String bytesRes = StringUtils.bytesToHexString2(convertToPdf);
            map.put("bytes", bytesRes);
            map.put("title", System.currentTimeMillis() + "培训服务报告.docx");
            fos.close();
            template.close();


            return Response.successJson(map);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

前端下载方法

word下载

java 复制代码
		if (res.data.code === 0) {
          const data = res.data.data
          const bytes = hexStr2Byte(data.bytes)
          const blob = new Blob([bytes], {
            type: `application/vnd.openxmlformats-officedocument.wordprocessingml.document`
          })
          const objectUrl = URL.createObjectURL(blob)
          const link = document.createElement('a')
          link.href = objectUrl
          link.setAttribute('download', data.title)
          document.body.appendChild(link)
          link.click()
        } else {
          this.$message.error(res.data.msg)
        }

pdf下载

java 复制代码
		  const data = res.data.data
          const bytes = hexStr2Byte(data.bytes)
          const blob = new Blob([bytes], {
            type: `application/pdf`
          })
          const objectUrl = URL.createObjectURL(blob)
          const link = document.createElement('a')
          link.href = objectUrl
          link.setAttribute('download', `${data.title}.pdf`)
          document.body.appendChild(link)
          link.click()
        } else {
          this.$message.error(res.data.msg)
        }
相关推荐
西柚与蓝莓42 分钟前
【开源开放体系总结】
python
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
belldeep4 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
dengqingrui1234 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝4 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King5 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家6 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain6 小时前
算法 | 位运算(哈希思想)
算法
FreakStudio6 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy