通过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.下载结果