1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > html转PDF并添加水印

html转PDF并添加水印

时间:2018-12-02 07:22:20

相关推荐

html转PDF并添加水印

html导出pdf文章很多,但就是没有即用html转pdf又可以加水印的方法,研究了一整天,总算搞定了。详细见代码

这版代码,若只是打印一页pdf没有问题,如果想html转出PDF是多页只会在PDF最后一页打上水印,折腾了一早上,又写了另一个解决方法,

详情请看:

/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 /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生成pdfrender.setDocumentFromString(content);//解决图片相对路径的问题//多个图片设置多个路径// render.getSharedContext().setBaseURL("file:src/main/resources/3333.png");render.getSharedContext().setBaseURL("file:src/main/resources/logo.png");render.layout();//创建pdf后不要finishrender.createPDF(new FileOutputStream(dest), false);//添加pageEventcreatePageEvent(render.getWriter());render.finishPDF();}public static void createPageEvent(PdfWriter pdfWriter) {pdfWriter.setPageEvent(new PdfPageEvent() {@Overridepublic void onOpenDocument(PdfWriter pdfWriter, Document document) {System.out.println("onOpenDocument");}@Overridepublic void onStartPage(PdfWriter pdfWriter, Document document) {System.out.println("onStartPage");}@Overridepublic 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 设置水印透明度PdfGState gs = new PdfGState();// 设置填充字体不透明度为0.4fgs.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");}@Overridepublic void onCloseDocument(PdfWriter pdfWriter, Document document) {System.out.println("onCloseDocument");}@Overridepublic void onParagraph(PdfWriter pdfWriter, Document document, float v) {System.out.println("onParagraph");}@Overridepublic void onParagraphEnd(PdfWriter pdfWriter, Document document, float v) {System.out.println("onParagraphEnd");}@Overridepublic void onChapter(PdfWriter pdfWriter, Document document, float v, Paragraph paragraph) {System.out.println("onChapter");}@Overridepublic void onChapterEnd(PdfWriter pdfWriter, Document document, float v) {System.out.println("onChapterEnd");}@Overridepublic void onSection(PdfWriter pdfWriter, Document document, float v, int i, Paragraph paragraph) {System.out.println("onSection");}@Overridepublic void onSectionEnd(PdfWriter pdfWriter, Document document, float v) {System.out.println("onSectionEnd");}@Overridepublic 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下搜一搜,换一个!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。