使用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)
        }
相关推荐
小鹿( ﹡ˆoˆ﹡ )2 分钟前
Matplotlib 绘图艺术:从新手到高手的全面指南
python·matplotlib
小鹿( ﹡ˆoˆ﹡ )5 分钟前
深入探索 Seaborn:高级绘图的艺术与实践
python·信息可视化
hummhumm5 分钟前
Oracle 第29章:Oracle数据库未来展望
java·开发语言·数据库·python·sql·oracle·database
聪明的墨菲特i14 分钟前
Django前后端分离基本流程
后端·python·django·web3
工业3D_大熊20 分钟前
【虚拟仿真】CEETRON SDK在船舶流体与结构仿真中的应用解读
java·python·科技·信息可视化·c#·制造·虚拟现实
SEEONTIME29 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
Bearnaise29 分钟前
PointMamba: A Simple State Space Model for Point Cloud Analysis——点云论文阅读(10)
论文阅读·笔记·python·深度学习·机器学习·计算机视觉·3d
shymoy34 分钟前
Radix Sorts
数据结构·算法·排序算法
风影小子43 分钟前
注册登录学生管理系统小项目
算法
黑龙江亿林等保1 小时前
深入探索哈尔滨二级等保下的负载均衡SLB及其核心算法
运维·算法·负载均衡