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
文章评论