java 后端生成PDF (html 转PDF)

maven准备的jar包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<dependency>  
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>

<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.9</version>
</dependency>

<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>

<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.0.3</version>
</dependency>

java类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

/**
* 文件格式转换工具类
*
* @author zjl
*
* 2018-5-10 上午10:52:22
*/
public class HTMLtoPDFUtil {

/**
* 将HTML转成PD格式的文件。html文件的格式比较严格
* @param htmlFile
* @param pdfFile
* @throws Exception
*/
// <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
public static boolean html2pdf(String htmlFile, String pdfFile) throws Exception {
String url = new File(htmlFile).toURI().toURL().toString();

OutputStream os = new FileOutputStream(pdfFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);

//解决中文支持
ITextFontResolver fontResolver = renderer.getFontResolver();
if("linux".equals(System.getProperty("os.name").toLowerCase())){
fontResolver.addFont("/usr/share/fonts/chiness/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}else{
fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}

renderer.layout();
renderer.createPDF(os);
os.close();
return true;
}


public static void main(String[] args) {
String htmlFile = "G:\\pdfDemo\\testpdf.html";
String pdfFile = "G:\\pdfDemo\\test21.pdf";
try {
FileTypeConvertUtil.html2pdf(htmlFile, pdfFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}

1.simsun.ttc 文件找不到问题

windows 自带有这个文件

linux 下载链接 :https://download.csdn.net/download/zangln/3179798

linux安装字体教程:https://www.cnblogs.com/xu-lei/p/5896789.html

如果没生成pdf无法显示中文请在html 加上一个样式:

style = “font-family: SimSun;”

HTML头部必须声明:

1
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

转换PDF后无法换行需要添加一个样式:

1
2
3
4
5
6
7
8
9
10
11
12
table {
border-collapse: collapse;
table-layout: fixed;
word-break:break-all;
font-size: 10px;
width: 100%;
text-align: center;
}
td {
word-break:break-all;
word-wrap : break-word;
}

分页以及纸张大小设置

在body标签内加入

1
<div id="footer" style="">  Page <span id="pagenumber"/> of <span id="pagecount"/> </div>

添加样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@page {
size:210mm 297mm;//纸张大小A4
margin: 0.25in;
-fs-flow-bottom: "footer";
-fs-flow-left: "left";
-fs-flow-right: "right";
border: thin solid black;
padding: 1em;
}
#footer {
font-size: 90%; font-style: italic;
position: absolute; top: 0; left: 0;
-fs-move-to-flow: "footer";
}
#pagenumber:before {
content: counter(page);
}
#pagecount:before {content: counter(pages);
}

参考链接:https://my.oschina.net/960823/blog/1588166



本文标题:java 后端生成PDF (html 转PDF)

本文作者:ZhengJiaLiang

发布时间:2018年05月10日 - 16:05

最后更新:2018年05月11日 - 21:05

原始链接:http://blog.zhengjl.com/2018/05/10/java 后端生成PDF (html 转PDF)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。