html转PDF并添加水印

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值