前言
最近项目要实现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
```java
package 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;
@RestController
public class TestPDF {
@Autowired
ResourceLoader 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