Flying HTML生成PDF添加水印

2024-01-13 04:20

本文主要是介绍Flying HTML生成PDF添加水印,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HTML转PDF并添加水印

<!-- 用于生成PDF -->
<dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.20</version>
</dependency>import java.io.File;
import java.io.FileOutputStream;
import java.util.Random;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;public class HtmlToPdfConverter {public static void main(String[] args) throws Exception {String htmlContent = "<html><head><style>body { font-family: 'SimHei', sans-serif; }</style></head><body><h1>我的标题</h1><p>测试pdf</p></body></html>";// 使用Flying Saucer渲染HTML到临时PDF文件File tempFile = File.createTempFile("temp", ".pdf");ITextRenderer renderer = new ITextRenderer();//设置字体File fontFile = new File("F:\\weixin\\emlsr\\src\\main\\resources\\font\\simhei.ttf");BaseFont baseFont = BaseFont.createFont(fontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);renderer.getFontResolver().addFont(fontFile.getAbsolutePath(), baseFont.getEncoding(), BaseFont.NOT_EMBEDDED);//生成数据renderer.setDocumentFromString(htmlContent);renderer.layout();renderer.createPDF(new FileOutputStream(tempFile));// 用iText打开临时PDF文件,并添加水印PdfGState gs = new PdfGState();gs.setFillOpacity(0.5f); // 设置为 50% 的透明度Font font = new Font(baseFont, 30, Font.NORMAL);PdfReader reader = new PdfReader(tempFile.getAbsolutePath());PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("c:\\output.pdf"));//水印图片(001)//Image watermarkImage = Image.getInstance("C:\\1.jpg");//float scale = 0.2f; // 水印图片缩放比例//watermarkImage.scaleAbsolute(watermarkImage.getWidth() * scale, watermarkImage.getHeight() * scale);//水印平铺(002)// 获取一个页面尺寸作为参考来计算水印图片的缩放比例//Image watermarkImage = Image.getInstance("C:\\1.jpg");// 设置水印图片平铺的宽度和高度(例如:将水印图片设为100x100像素)//float tileWidth = 100f;//float tileHeight = 100f;//watermarkImage.scaleAbsolute(tileWidth, tileHeight);//水印随机平铺3个(003)Image watermarkImage = Image.getInstance("C:\\1.jpg");// 设置水印图片平铺的宽度和高度(例如:将水印图片设为100x100像素)float tileWidth = 100f;float tileHeight = 100f;Random random = new Random(); // 创建一个随机数生成器int n = reader.getNumberOfPages();for (int i = 1; i <= n; i++) {PdfContentByte underContent = stamper.getUnderContent(i);underContent.setGState(gs);// 字体添加透明度ColumnText.showTextAligned(underContent, Element.ALIGN_CENTER,new Phrase("水印文字",font),reader.getPageSize(i).getWidth() / 2,reader.getPageSize(i).getHeight() / 2,45); // 角度可调整水印倾斜程度// 获取页面尺寸并计算水印位置(001)//Rectangle pageRect = reader.getPageSizeWithRotation(i);//float x = (pageRect.getWidth() - watermarkImage.getScaledWidth()) / 2;//float y = (pageRect.getHeight() - watermarkImage.getScaledHeight()) / 2;// 添加水印图片//underContent.addImage(watermarkImage, watermarkImage.getWidth(), 0, 0, watermarkImage.getHeight(), x, y);//水印平铺(002)满屏//Rectangle pageRect = reader.getPageSizeWithRotation(i);// 计算并添加水印图片的位置(按照平铺效果)//for (float x = 0; x < pageRect.getWidth(); x += tileWidth) {//    for (float y = 0; y < pageRect.getHeight(); y += tileHeight) {//        underContent.addImage(watermarkImage, tileWidth, 0, 0, tileHeight, x, y);//    }//}//(003)Rectangle pageRect = reader.getPageSizeWithRotation(i);// 计算并添加三个随机位置的水印图片for (int j = 0; j < 3; j++) {// 随机计算X和Y坐标float x = random.nextFloat() * (pageRect.getWidth() - tileWidth);float y = random.nextFloat() * (pageRect.getHeight() - tileHeight);underContent.addImage(watermarkImage, tileWidth, 0, 0, tileHeight, x, y);}}// 关闭stamper.close();reader.close();tempFile.delete();System.out.println("带有水印的PDF文件已生成至: output.pdf");}
}

这篇关于Flying HTML生成PDF添加水印的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600233

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo