spire.doc.free实现word转换为pdf

通过spire.doc.free将word转换成PDF时存在缺陷:只能获取前3页

一、通过word模板填充生成word文件

使用poi-tl实现word模板配置:poi-tl官网
在这里插入图片描述
2.添加pom依赖

		<!--生成word-->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.10.0</version>
        </dependency>
        <!--工具类-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.23</version>
        </dependency>
        <!--word转换为pdf-->
        <dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.doc.free</artifactId>
            <version>3.9.0</version>
        </dependency>
        <!-- 无法引入时是因为maven的配置文件settings.xml配了阿里云镜像加速,这时我们需暂时将settings.xml中的镜像给剪切掉-->
        <repositories>
	        <repository>
	            <id>com.e-iceblue</id>
	            <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
	        </repository>
    	</repositories>

注意:对于spire.doc.free依赖还是无法下载时,可以去下载对应jar通过手动添加jar至项目中:maven手动添加jar包

二、spire.doc.free实现pdf转换

1.将word文件转换为pdf本地下载

package com.example.mybatismysql8demo.vo;

import com.deepoove.poi.data.PictureRenderData;
import com.example.mybatismysql8demo.domain.Goods;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@Data
public class BasicInfo implements Serializable {

    private String invoiceName;

    private String contactNo;

    private String supplierName;

    private String signAddress;

    private String signTime;

    private BigDecimal taxPrice;

    private String upperTaxPrice;

    private String remark;

    private String invoiceAddress;

    private String settlement;

    private String receiptDetailAddress;

    private String receiptUserNameAndMobile;

    private String registerAddress;

    private String taxpayerIdentificationNumber;

    private String legalName;

    private String mobile;

    private String bankOfDeposit;

    private String accountNumber;

    private String requestUserName;

    private String requestUserMobile;

    private String requestUserBankOfDeposit;

    private String requestUserAccountNumber;

    private List<Goods> goods;

    private PictureRenderData urlPicture;
}
package com.example.mybatismysql8demo.domain;

import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

@Data
public class Goods {

    private Integer no;

    private String goodsName;

    private String specValue;

    private String unit;

    private BigDecimal taxPrice;

    private String deliveryTime;

    public Goods(Integer no, String goodsName, String specValue, String unit, BigDecimal taxPrice, String deliveryTime) {
        this.no = no;
        this.goodsName = goodsName;
        this.specValue = specValue;
        this.unit = unit;
        this.taxPrice = taxPrice;
        this.deliveryTime = deliveryTime;
    }
}
package com.example.mybatismysql8demo.controller;

import cn.hutool.core.convert.Convert;
import com.aspose.words.License;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.example.mybatismysql8demo.domain.Goods;
import com.example.mybatismysql8demo.vo.BasicInfo;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import lombok.SneakyThrows;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

public class PDFCreateUtil {

    @SneakyThrows
    public void createWord() {
        //基本信息
        BasicInfo basicInfo = new BasicInfo();
        basicInfo.setInvoiceName("张三");
        basicInfo.setContactNo("合同编码");
        basicInfo.setSupplierName("xx有限公司");
        basicInfo.setSignAddress("xx市");
        basicInfo.setSignTime(new SimpleDateFormat("yyyy-MM-dd mm:hh:ss").format(new Date()));
        basicInfo.setTaxPrice(new BigDecimal(3000));
        basicInfo.setUpperTaxPrice(Convert.digitToChinese(basicInfo.getTaxPrice()));
        basicInfo.setRemark("备注");
        basicInfo.setInvoiceAddress("河南");
        basicInfo.setSettlement("款到发货");
        basicInfo.setReceiptDetailAddress("河南郑州");
        basicInfo.setReceiptUserNameAndMobile("张三(15111111111)");
        basicInfo.setRegisterAddress("浙江杭州");
        basicInfo.setTaxpayerIdentificationNumber("25326666666666");
        basicInfo.setLegalName("李四");
        basicInfo.setMobile("17666666767");
        basicInfo.setBankOfDeposit("XX银行");
        basicInfo.setAccountNumber("2737478374875878");
        basicInfo.setRequestUserName("旺旺");
        basicInfo.setRequestUserMobile("17111111111");
        basicInfo.setRequestUserBankOfDeposit("XX银行");
        basicInfo.setRequestUserAccountNumber("83475848548789657");
        //插入图片
        basicInfo.setUrlPicture(Pictures.ofUrl("https://image.baidu.com/search/detail/1283.png").size(100, 100).create());
        //获取物品信息列表
        List<Goods> goodsList = new ArrayList<>();
        for (int i=1; i <= 6; i++){
            goodsList.add(new Goods(i,"商品" + i,"红色" + i,"个" + i, new BigDecimal(100).add(new BigDecimal(i)), new SimpleDateFormat("yyyy-MM-dd mm:hh:ss").format(new Date())));
        }
        basicInfo.setGoods(goodsList);
        // 插件列表,可以去官网查看,有列循环,还有行循环,这里是行循环实例
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        //这里可以指定一个config类,用来指定一些规则,也可以改变模板中{{}}的这种格式
        Configure config = Configure.builder().bind("goods", policy).build();
        //多个list
        //Configure config = Configure.builder().bind("goods", policy).bind("labors", policy).build();
        //文件夹
        String directory= "";
        try {
            //模板路径(切换为服务器地址:/home/www/file)
            String wordTemplate = "E:\\文档\\合同模板.docx";
            //模板填充
            XWPFTemplate template = XWPFTemplate.compile(wordTemplate, config).render(basicInfo);
            //文件夹
            directory = "E:\\新建文件夹\\下载\\" + System.currentTimeMillis();
            //判断文件夹是否存在
            File filePath = new File(directory);
            if (!filePath.exists()) {
                filePath.mkdir();
            }
            //下载路径
            String downloadPath = directory + "\\word.docx";
            template.writeToFile(downloadPath);
            Document document = new Document();
            document.loadFromFile(downloadPath);
            //保存结果文档:本地下载
            document.saveToFile("D:/test.pdf", FileFormat.PDF);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            //删除临时文件夹
            if (StringUtils.isNotEmpty(directory)){
                FileUtil.del(new File(directory));
            }
        }
    }
}

2.将word文件转换为pdf浏览器下载

package com.example.mybatismysql8demo.controller;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.FileUtil;
import com.aspose.words.License;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.example.mybatismysql8demo.domain.Goods;
import com.example.mybatismysql8demo.vo.BasicInfo;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;

@RestController
public class PDFCreateController {

    @SneakyThrows
    @PostMapping("/createWord")
    public void createWord(HttpServletResponse response) {
        //基本信息
        BasicInfo basicInfo = new BasicInfo();
        basicInfo.setInvoiceName("张三");
        basicInfo.setContactNo("合同编码");
        basicInfo.setSupplierName("xx有限公司");
        basicInfo.setSignAddress("xx市");
        basicInfo.setSignTime(new SimpleDateFormat("yyyy-MM-dd mm:hh:ss").format(new Date()));
        basicInfo.setTaxPrice(new BigDecimal(3000));
        basicInfo.setUpperTaxPrice(Convert.digitToChinese(basicInfo.getTaxPrice()));
        basicInfo.setRemark("备注");
        basicInfo.setInvoiceAddress("河南");
        basicInfo.setSettlement("款到发货");
        basicInfo.setReceiptDetailAddress("河南郑州");
        basicInfo.setReceiptUserNameAndMobile("张三(15111111111)");
        basicInfo.setRegisterAddress("浙江杭州");
        basicInfo.setTaxpayerIdentificationNumber("25326666666666");
        basicInfo.setLegalName("李四");
        basicInfo.setMobile("17666666767");
        basicInfo.setBankOfDeposit("XX银行");
        basicInfo.setAccountNumber("2737478374875878");
        basicInfo.setRequestUserName("旺旺");
        basicInfo.setRequestUserMobile("17111111111");
        basicInfo.setRequestUserBankOfDeposit("XX银行");
        basicInfo.setRequestUserAccountNumber("83475848548789657");
        //插入图片
        basicInfo.setUrlPicture(Pictures.ofUrl("https://image.baidu.com/search/detail/sdh.png").size(100, 100).create());
        //获取物品信息列表
        List<Goods> goodsList = new ArrayList<>();
        for (int i=1; i <= 6; i++){
            goodsList.add(new Goods(i,"商品" + i,"红色" + i,"个" + i, new BigDecimal(100).add(new BigDecimal(i)), new SimpleDateFormat("yyyy-MM-dd mm:hh:ss").format(new Date())));
        }
        basicInfo.setGoods(goodsList);
        // 插件列表,可以去官网查看,有列循环,还有行循环,这里是行循环实例
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        //这里可以指定一个config类,用来指定一些规则,也可以改变模板中{{}}的这种格式
        Configure config = Configure.builder().bind("goods", policy).build();
        //多个list
        //Configure config = Configure.builder().bind("goods", policy).bind("labors", policy).build();
        //文件夹
        String directory= "";
        try {
            //模板路径(切换为服务器地址:/home/www/file)
            String wordTemplate = "E:\\文档\\技术\\项目技术文档\\笔记\\文件\\采购合同模板.docx";
            //模板填充
            XWPFTemplate template = XWPFTemplate.compile(wordTemplate, config).render(basicInfo);
            //文件夹
            directory = "E:\\新建文件夹\\下载\\" + System.currentTimeMillis();
            //判断文件夹是否存在
            File filePath = new File(directory);
            if (!filePath.exists()) {
                filePath.mkdir();
            }
            //下载路径
            String downloadPath = directory + "\\word.docx";
            template.writeToFile(downloadPath);
            Document document = new Document();
            document.loadFromFile(downloadPath);
            //浏览器端下载
            response.setContentType("application/pdf");
            String fileNames = "合同文件.pdf";
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileNames, "UTF-8"))));
            document.saveToFile(response.getOutputStream(), FileFormat.PDF);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            if (StringUtils.isNotEmpty(directory)){
                FileUtil.del(new File(directory));
            }
        }
    }
}

3.下载结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值