原创

html转pdf

<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>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.18</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>

注:
linux如果没有指定字体 可以将windows上面的字体考到linux上面即可
该工具类需要的必须是xhtml的格式
html必需声明:

<!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">
<head>
<meta charset="UTF-8" />
<title>auth</title>
<style>
@page{ size:A4;margin: 0;} 指定生成的pdf纸张大小
</style>
</head>
<body style = "font-family: SimSun;"> 指定的字体最好放在body里面 其他地方就不许有字体了
</body>
</html>
import com.itextpdf.html2pdf.jsoup.Jsoup;
import com.itextpdf.html2pdf.jsoup.nodes.Document;
import com.itextpdf.html2pdf.jsoup.nodes.Element;
import com.itextpdf.html2pdf.jsoup.nodes.Entities;
import com.itextpdf.html2pdf.jsoup.select.Elements;
import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.ByteArrayOutputStream;

/**
* @author: 木杉
* @email: 819236727@qq.com
* @Date: 2019/7/23 9:01
* @describe:
*/
public class Test {
public static void main(String[] args) throws Exception{
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ITextRenderer renderer = new ITextRenderer();

//将前端的html转xhtml
Document doc = Jsoup.parse("html");
doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml).escapeMode(Entities.EscapeMode.xhtml);

//防止前端传入非宋体的字体
Elements elements = doc.select("[style*=font-family]");
for (Element element : elements) {
String[] styles = element.attr("style").split(";");
StringBuffer stringBuffer = new StringBuffer("");
for (String style : styles) {
if ((!style.contains("font-family")) || "font-family: SimSun".equals(style)) {
stringBuffer.append(style).append(";");
}
}
element.removeAttr("style");
element.attr("style", stringBuffer.toString());
}

//移除所有超链接
Elements elementBya = doc.getElementsByTag("a");
if (elementBya != null && elementBya.size()!=0){
elementBya.remove();
}
renderer.setDocumentFromString(doc.toString());

// step 3 解决中文支持
ITextFontResolver fontResolver = renderer.getFontResolver();
if ("linux".equals(getCurrentOperatingSystem())) {
fontResolver.addFont("/usr/share/fonts/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(byteArrayOutputStream);
byteArrayOutputStream.close();

//pdf二进制
byte[] pdf = byteArrayOutputStream.toByteArray();

}

public static String getCurrentOperatingSystem() {
String os = System.getProperty("os.name").toLowerCase();
return os;
}
}


正文到此结束