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生成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下搜一搜,换一个!!

html转PDF并添加水印相关推荐

  1. java pdf水印排布问题_Java实现pdf文件添加水印,铺满全页。

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/duan1309/article/details/81232300 因项目需要将word文件(.doc ...

  2. Aspose.Java实现word转pdf,添加水印等操作

    Aspose.Java实现word转pdf,添加水印等操作 一. word转pdf 二. 文档插入水印 Aspose是一款商用版控件,支持各类文档操作,这里主要介绍如何在Springboot项目中使用 ...

  3. itex将html转成pdf加水印,itext操作PDF文件添加水印

    功能描述:添加图片和文字水印 /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param destFile 加水 ...

  4. keil如何添加h文件_如何给PDF文件添加水印?分享给PDF批量加水印的方法

    如何给PDF文件添加水印?在处理一些重要的商业文件中,很多人害怕文件内容被抄袭盗用,就会在文件中添加水印,其中包括Word.Excel.PPT.图片.PDF等多种不同的文件.那如果是PDF文件,你知道 ...

  5. iText中给pdf内容添加水印

    /** * 给pdf文件添加水印 * @param InPdfFile 要加水印的原pdf文件路径 * @param outPdfFile 加了水印后要输出的路径 * @param markImage ...

  6. 如何给PDF文件添加水印?PDF免费添加水印教程来了

    有时候,为了不让别人盗用我们PDF文件里面的内容或图片,或者是出于宣传产品的目的,我们经常会需要给自己的PDF文件添加各种类型的水印,那你们知道如何给PDF文件添加水印吗?下面我们就来看看如何给PDF ...

  7. Java实现对PDF文件添加水印

    Java实现对PDF文件添加水印 目录 Java实现对PDF文件添加水印 导入依赖 工具方法 效果 最近项目中遇到对PDF添加水印,实现有多种,采取的是itextpdf 导入依赖 <!-- 对P ...

  8. Java WORD转换PDF 并添加水印 (附赠jar提取链接)

    Java WORD转换PDF 并添加水印 直接上代码 实现功能 docx文档转换为PDF 转换之后排版不混乱 使用工具(Jar包) aspose-words-15.8.0-jdk16.jar(用于PD ...

  9. linux下安装OpenOffice及使用java调用OpenOffice转换word、Excel为pdf并添加水印

    一.linux下安装OpenOffice OpenOffice是Apache的一款开源的软件,我主要是用来转换office文档成pdf文件,并给其添加水印等. (1)下载安装包 进入主题,首先我们需要 ...

  10. Python3,2段代码,给pdf文件添加水印,原来watermark还可以这么玩。

    pdf添加watermark 1. 引言 2.指定水印内容输出到pdf文件 2.1 模块安装 2.2 思路 2.3 代码示例 3.水印内容批量输出到pdf文件 3.1 模块安装 3.2 思路 3.3 ...

最新文章

  1. __declspec(novtable) 的用法
  2. 让您的Xcode键字如飞
  3. 1823政府经济学 (2)
  4. IDEA 启动、编译、clean、安装maven等、报错Process terminated
  5. Android 8.0学习 (36)---Android 8.0 WebView 拍照、简易预览、二维码扫描 各种问题解决
  6. OCR 工具tesseract初体验
  7. java core 作者_java core dump分析实战
  8. JDBC批量插入数据优化,使用addBatch和executeBatch
  9. 记录一次多线程与Map.keySet() 出现的“并发”问题
  10. PHP 数字缩短(最多1倍)与还原
  11. 人工智能AI系列 - 音频搜索之声纹搜索
  12. .net构建轻微博实时热搜新闻站
  13. Android应用程序启动时出现白色背景问题
  14. tan和cot的梗_“sin对cos说 我们今晚是tan呢?还是cot呢?”啥意思
  15. 专访京东孙海波:大牛架构师养成记及电商供应链中区块链技术的应用
  16. 2018-05-04 《设计模式:可复用面向对象软件的基础》- 实例研究
  17. linux ccid驱动下载,ccid驱动支持
  18. HTML中 :after和:before的作用及使用方法(转)
  19. 用DOS命令关闭端口
  20. 香港空间的确很坑,网站可用性只有72.37%

热门文章

  1. 推荐一款2.5v 基准 电压源 芯片
  2. 操作系统期末考试重点知识
  3. 徐州一姑娘写的(女孩看了是自省,男孩看了是激励)
  4. 新中大财务软件-A3中怎样更改IP地址
  5. 联想Thinkpad E430 原装win8改版win7的BIOS设置
  6. Get Server Down when retrieve the channel list in sopcast, how to solve it?
  7. 蓝牙BLE芯片PHY6222之SPI驱动ST7789
  8. bt5重启网卡命令_BackTrack5(BT5)安装教程及BT5支持网卡列表
  9. CSS border-radius:50%和100%的区别
  10. 【信道编码/Channel Coding】纠错编码与差错控制