前言
最近项目要实现java导出PDF,要导出的文件都有自己的模板样式。所以我们的思路是:先整出html模板,然后将数据填充进去,生成最终的html 文件流,拿到之后,转为PDF文件导出。
因为考虑的Itext是要收费的,所以我们使用了openhtmltopdf,它是基于LGPL 协议的。可以用在商业项目中。
openhtmltopdf
- Git 地址
- 快速开始
一个例子
我这个例子是 我已经将HTML对象转换为String字符串了,我是将字符串转换为PDF导出的。
- maven依赖
```xml
1.0.8
<dependency><!-- Required for PDF output. --><groupId>com.openhtmltopdf</groupId><artifactId>openhtmltopdf-pdfbox</artifactId><version>${openhtml.version}</version></dependency><dependency><!-- Required for image output only. --><groupId>com.openhtmltopdf</groupId><artifactId>openhtmltopdf-java2d</artifactId><version>${openhtml.version}</version></dependency><dependency><!-- Optional, leave out if you do not need right-to-left or bi-directional text support. --><groupId>com.openhtmltopdf</groupId><artifactId>openhtmltopdf-rtl-support</artifactId><version>${openhtml.version}</version></dependency><dependency><!-- Optional, leave out if you do not need logging via slf4j. --><groupId>com.openhtmltopdf</groupId><artifactId>openhtmltopdf-slf4j</artifactId><version>${openhtml.version}</version></dependency><dependency><!-- Optional, leave out if you do not need SVG support. --><groupId>com.openhtmltopdf</groupId><artifactId>openhtmltopdf-svg-support</artifactId><version>${openhtml.version}</version></dependency>
2. code```javapackage com.example.demo.controller;import org.springframework.core.io.ResourceLoader;import cn.hutool.core.util.ReUtil;import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;@RestControllerpublic class TestPDF {@AutowiredResourceLoader resourceLoader;@GetMapping("/123")public void createPDF() throws IOException {create();}private void create() throws IOException {String html = "";// 因为html中有特殊字符 ,我的做法是将其去除String newHTML = ReUtil.replaceAll(html, " ", "");//导出PDF存放的位置,也可以是一个流FileOutputStream os = new FileOutputStream("E:\\desktop\\11.pdf");PdfRendererBuilder builder = new PdfRendererBuilder();builder.useFastMode();builder.testMode(true);//填充html字符串builder.withHtmlContent(newHTML,"");builder.toStream(os);//设置字体,这个字体需要跟你html 中的字体要一致的builder.useFont(new File("/simsun.ttc"),"SimSun");builder.run();}}
- 测试结果
会在桌面给你生成一个PDF文件,速度还挺快的
- 输出横版PDF
# 需要在你的html文件中设置@page {size: A4 landscape;}
单元格数据自动换行
需要在css中设置
table td{overflow-wrap: break-word;word-wrap:break-word;}
如果你还需要换行后,所有一行的单元格向上对齐,还需要加上下面的属性:
style="vertical-align: top;"
导出PDF支持中文,或者中文繁体
首先需要在引入字体库
private static void addFont(PdfRendererBuilder builder) throws IOException {InputStream streamForSimsun = HTMLUtils.class.getClassLoader().getResourceAsStream("template/simsun.ttc");File targetFileForSimsun = new File("simsun.ttc");FileUtils.copyInputStreamToFile(streamForSimsun, targetFileForSimsun);builder.useFont(targetFileForSimsun, "simsun");streamForSimsun.close();}
在HTML中,设置字体
style="font-family: arial, simsun"
官网给的参考:https://github.com/danfickle/openhtmltopdf/issues/129
