Java下将Html转成PDF的方式,详见:https://blog.terrynow.com/2021/09/26/itextpdf-flying-saucer-complex-html-css-to-pdf/
使用的是iTextPDF和flying saucer,以下是简要的操作说明:
pom.xml:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<!-- HTML转PDF需要-->
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13.2</version>
</dependency>
<!-- 解决中文字体乱码问题-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- 支持css样式渲染 -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.21</version>
</dependency>
Java代码
/**
* 使用flying saucer转PDF,支持的css更加丰富一些
* @param pdfFontBasic
* @param htmlStr
*/
public static byte[] html2Pdf(String pdfFontBasic, String htmlStr) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(htmlStr);
// 解决中文支持问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(pdfFontBasic, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(bos);
return bos.toByteArray();
}
因为要给整个PDF背景加颜色,但是默认会带上边框(margin)导致4个边框是没有颜色的。
解决方案:
CSS加上:
<style>
body {
font-family: STSong, "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
"Microsoft YaHei", "微软雅黑", Arial, sans-serif;
font-size: 16px;
background: #ecacc7;
color: #000;
}
* {
margin: 0;
padding: 0;
line-height: 2;
}
@page{
@bottom-left {
content: element(footer);
vertical-align: top;
padding-top: 10px;
}
@top-right {
content: element(header);
vertical-align: bottom;
padding-bottom: 10px;
}
size: A4 portrait;
margin: 0;
}
</style>
当然如果要自定义4个边的margin距离,只要定义4个margin即可,现在设成了0
文章评论