html导出pdf文章很多,但就是没有即用html转pdf又可以加水印的方法,研究了一整天,总算搞定了。详细见代码
这版代码,若只是打印一页pdf没有问题,如果想html转出PDF是多页只会在PDF最后一页打上水印,折腾了一早上,又写了另一个解决方法,
详情请看:
https://download.csdn.net/download/immaqi/13077630
先看效果
HTML内容
template_freemarker_watermark.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
<style>
body{
font-family:SimHei;
}
.color{
color: black;
}
.pos{
position:absolute;
left:200px;
top:5px;
width: 200px;
font-size: 10px;
}
</style>
</head>
<body>
<div class="color">
你好,${name}
</div>
<div>
<img src="logo.png" width="400px"/>
</div>
</body>
</html>
java 代码
Html2dfAndWatermark.java
package com.maqi.demo;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPageEvent;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
/**
* @author maqi
* @date 2020/10/29 17:10
*/
public class Html2dfAndWatermark {
private static final String FONT = "simhei.ttf";
private static final String LOGO_PATH = "file:src/main/resources/logo.png";
private static Configuration freemarkerCfg = null;
static {
freemarkerCfg = new Configuration();
//freemarker的模板目录
try {
freemarkerCfg.setDirectoryForTemplateLoading(new File("src/main/resources/"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException, DocumentException {
Map<String, Object> data = new HashMap();
data.put("name", "程序员");
String content = Html2dfAndWatermark.freeMarkerRender(data, "template_freemarker_watermark.html");
Html2dfAndWatermark.createPdf(content, "result.pdf");
}
/**
* freemarker渲染html
*/
public static String freeMarkerRender(Map<String, Object> data, String htmlTmp) {
Writer out = new StringWriter();
try {
// 获取模板,并设置编码方式
Template template = freemarkerCfg.getTemplate(htmlTmp);
template.setEncoding("UTF-8");
// 合并数据模型与模板
template.process(data, out); //将合并后的数据和模板写入到流中,这里使用的字符流
out.flush();
return out.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return null;
}
public static void createPdf(String content, String dest) throws IOException, DocumentException {
ITextRenderer render = new ITextRenderer();
ITextFontResolver fontResolver = render.getFontResolver();
fontResolver.addFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 解析html生成pdf
render.setDocumentFromString(content);
//解决图片相对路径的问题
//多个图片设置多个路径
// render.getSharedContext().setBaseURL("file:src/main/resources/3333.png");
render.getSharedContext().setBaseURL("file:src/main/resources/logo.png");
render.layout();
//创建pdf后不要finish
render.createPDF(new FileOutputStream(dest), false);
//添加pageEvent
createPageEvent(render.getWriter());
render.finishPDF();
}
public static void createPageEvent(PdfWriter pdfWriter) {
pdfWriter.setPageEvent(new PdfPageEvent() {
@Override
public void onOpenDocument(PdfWriter pdfWriter, Document document) {
System.out.println("onOpenDocument");
}
@Override
public void onStartPage(PdfWriter pdfWriter, Document document) {
System.out.println("onStartPage");
}
@Override
public void onEndPage(PdfWriter pdfWriter, Document document) {
System.out.println(document.getPageSize());
// 检查字体文件存不存在
if (!new File("src/main/resources/" + FONT).exists()) {
throw new RuntimeException("src/main/resources/" + FONT + " 字体文件不存在");
}
//创建字体
BaseFont font = null;
try {
font = BaseFont.createFont("src/main/resources/" + FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 设置水印透明度
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.4f
gs.setFillOpacity(0.4f);
PdfContentByte content = pdfWriter.getDirectContentUnder();
// 开始
content.beginText();
// 设置水印字体参数及大小 (字体参数,字体编码格式,是否将字体信息嵌入到pdf中(一般不需要嵌入),字体大小)
content.setFontAndSize(font, 20);
// 设置透明度
content.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
for (int i = 1; i <= 5; i += 2) {
for (int j = 2; j <= 8; j += 3) {
content.showTextAligned(Element.ALIGN_RIGHT, "I am Watermark", i * 100, j*100, 45);
}
}
// 设置水印颜色(灰色)
content.setColorFill(BaseColor.GRAY);
//结束
content.endText();
// pdfWriter.getDirectContent();
System.out.println("onEndPage");
}
@Override
public void onCloseDocument(PdfWriter pdfWriter, Document document) {
System.out.println("onCloseDocument");
}
@Override
public void onParagraph(PdfWriter pdfWriter, Document document, float v) {
System.out.println("onParagraph");
}
@Override
public void onParagraphEnd(PdfWriter pdfWriter, Document document, float v) {
System.out.println("onParagraphEnd");
}
@Override
public void onChapter(PdfWriter pdfWriter, Document document, float v, Paragraph paragraph) {
System.out.println("onChapter");
}
@Override
public void onChapterEnd(PdfWriter pdfWriter, Document document, float v) {
System.out.println("onChapterEnd");
}
@Override
public void onSection(PdfWriter pdfWriter, Document document, float v, int i, Paragraph paragraph) {
System.out.println("onSection");
}
@Override
public void onSectionEnd(PdfWriter pdfWriter, Document document, float v) {
System.out.println("onSectionEnd");
}
@Override
public void onGenericTag(PdfWriter pdfWriter, Document document, Rectangle rectangle, String s) {
System.out.println("onGenericTag");
}
});
}
}
maven配置
pom配置可能有多余的,不影响使用
<dependency>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<groupId>org.xhtmlrenderer</groupId>
<version>9.1.16</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.19</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.5</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.5</version>
</dependency>
字体要是找不到,就在Windows下搜一搜,换一个!!