当前位置: 首页 > news >正文

苏州信网网站建设技术有限公司廊坊建设部网站

苏州信网网站建设技术有限公司,廊坊建设部网站,软件班级网站建设,wordpress 4.4.3 漏洞文章目录 前言方式一 itextpdf项目依赖引入编写PDF添加水印工具类测试效果展示 方式二 pdfbox依赖引入编写实现类效果展示 扩展1、将inputstream流信息添加水印并导出zip2、部署出现找不到指定字体文件 资料参考 前言 近期为了知识库文件导出,文件数据安全处理&…

文章目录

  • 前言
  • 方式一 itextpdf
    • 项目依赖引入
    • 编写PDF添加水印工具类
    • 测试
    • 效果展示
  • 方式二 pdfbox
    • 依赖引入
    • 编写实现类
    • 效果展示
  • 扩展
    • 1、将inputstream流信息添加水印并导出zip
    • 2、部署出现找不到指定字体文件
  • 资料参考

前言

近期为了知识库文件导出,文件数据安全处理,增加水印处理。

方式一 itextpdf

项目依赖引入

<!-- 文件水印添加 -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>

编写PDF添加水印工具类

/*** pdf文件添加文字水印** @param srcPath  输入的文件路径* @param destPath 输出的文件路径* @param word     水印文字* @throws Exception*/
public static void addPDFWaterMark(String srcPath, String destPath, String word)throws Exception {PdfReader reader = new PdfReader(srcPath);PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destPath));//使用系统字体String prefixFont = null;String os = System.getProperties().getProperty("os.name");if (os.startsWith("win") || os.startsWith("Win")) {// 某些机型可能没有,需要调整prefixFont = "C:\\Windows\\Fonts\\SIMSUN.TTC,1";} else {prefixFont = "/usr/share/fonts/chinese/TrueType/uming.ttf";}//创建字体,第一个参数是字体路径BaseFont base = BaseFont.createFont(prefixFont, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);PdfGState gs = new PdfGState();gs.setFillOpacity(0.1f);//图片水印透明度(数值越大,水印越深)//gs.setStrokeOpacity(0.4f);//设置笔触字体不透明度PdfContentByte content = null;int total = reader.getNumberOfPages();//pdf文件页数for (int i = 0; i < total; i++) {float x = reader.getPageSize(i + 1).getWidth();//页宽度float y = reader.getPageSize(i + 1).getHeight();//页高度content = stamper.getOverContent(i + 1);content.setGState(gs);content.beginText();//开始写入content.setFontAndSize(base, 10);//字体大小(数值越大,字体越大)//每页7行,一行3个for (int j = 0; j < 3; j++) {for (int k = 0; k < 7; k++) {//showTextAligned 方法的参数(文字对齐方式,位置内容,输出水印X轴位置,Y轴位置,旋转角度)content.showTextAligned(Element.ALIGN_CENTER, word, x / 3 * j + 90, y / 7 * k, 25);}}content.endText();//结束写入}//关闭流stamper.close();reader.close();
}

测试

public static void main(String[] args) {// 获取指定路径的pdfFile file = new File("F:\\springboot-stydy\\springboot-pdf-waterMark\\pdf\\22.pdf");try {System.out.println(file.getName());PDFUtil.addPDFWaterMark("F:\\springboot-stydy\\springboot-pdf-waterMark\\pdf\\22.pdf","F:\\springboot-stydy\\springboot-pdf-waterMark\\pdf\\water\\22.pdf" , "香蕉不拿拿(xjbnn)@xiangjiao 2025-04-08");} catch (Exception e) {e.printStackTrace();}
}

效果展示

在这里插入图片描述

方式二 pdfbox

依赖引入

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.4</version>
</dependency>

编写实现类

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class PdBoxTest {public static void main(String[] args) throws IOException {// 水印文字String waterMark = "香蕉不拿拿@(xjbnn) "+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));// 加载源文件File file = new File("F:\\springboot-stydy\\springboot-pdf-waterMark\\pdf\\22.pdf");// 如果是 inputstream 类的流信息,也可以直接使用 PDDocument.load(inputStream)PDDocument document = PDDocument.load(file);document.setAllSecurityToBeRemoved(true);//使用系统字体String prefixFont = null;String os = System.getProperties().getProperty("os.name");if (os.startsWith("win") || os.startsWith("Win")) {// 仿宋 简体 常规 (其他类型会报错)prefixFont = "C:\\Windows\\Fonts\\simfang.ttf";} else {prefixFont = "/usr/share/fonts/chinese/TrueType/uming.ttf";}PDFont font = PDType0Font.load(document, new FileInputStream(prefixFont), true);// 读取pdf文件,将每一页中都增加水印for (PDPage page : document.getPages()) {PDPageContentStream stream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);PDExtendedGraphicsState r = new PDExtendedGraphicsState();// 设置透明度r.setNonStrokingAlphaConstant(0.1f);r.setAlphaSourceFlag(true);stream.setGraphicsStateParameters(r);//开始写入stream.beginText();stream.setFont(font, 10);stream.newLineAtOffset(0, -15);// 获取PDF页面大小float pageHeight = page.getMediaBox().getHeight();float pageWidth = page.getMediaBox().getWidth();// 根据纸张大小添加水印,30度倾斜for (int h = 10; h < pageHeight; h = h + 150) {for (int w = - 10; w < pageWidth; w = w + 150) {stream.setTextMatrix(Matrix.getRotateInstance(0.3, w, h));stream.showText(waterMark);}}// 结束渲染,关闭流stream.endText();stream.restoreGraphicsState();stream.close();}// 将加工后的文件写入到新的文件中File outFile = new File("F:\\springboot-stydy\\springboot-pdf-waterMark\\pdf\\water\\pdbox.pdf");document.save(outFile);document.close();}
}

效果展示

在这里插入图片描述

扩展

1、将inputstream流信息添加水印并导出zip

使用pdfbox更方便处理。如下工具类:

/*** 添加水印并打包压缩* @param inputStream 文件输入流信息* @param path 文件路径* @param zipOutputStream zip压缩包* @param waterMark 水印* @param rowSpace 行间距,大中小分别对应150/100/50* @param colSpace 列间距,大中小分别对应150/100/50* @throws Exception*/
private void addPDFWaterMarkAndZip(InputStream inputStream,String path, ZipOutputStream zipOutputStream, String waterMark,int rowSpace,int colSpace)throws Exception {PDDocument document = PDDocument.load(inputStream);document.setAllSecurityToBeRemoved(true);//使用系统字体String prefixFont = null;String os = System.getProperties().getProperty("os.name");if (os.startsWith("win") || os.startsWith("Win")) {prefixFont = "C:\\Windows\\Fonts\\simfang.ttf";} else {prefixFont = "/usr/share/fonts/chinese/TrueType/uming.ttf";}PDFont font = PDType0Font.load(document, new FileInputStream(prefixFont), true);for (PDPage page : document.getPages()) {PDPageContentStream stream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);PDExtendedGraphicsState r = new PDExtendedGraphicsState();// 设置透明度r.setNonStrokingAlphaConstant(0.1f);r.setAlphaSourceFlag(true);stream.setGraphicsStateParameters(r);//开始写入stream.beginText();stream.setFont(font, 10);stream.newLineAtOffset(0, -15);// 获取PDF页面大小float pageHeight = page.getMediaBox().getHeight();float pageWidth = page.getMediaBox().getWidth();// 根据纸张大小添加水印,30度倾斜for (int h = 10; h < pageHeight; h = h + rowSpace) {for (int w = - 10; w < pageWidth; w = w + colSpace) {stream.setTextMatrix(Matrix.getRotateInstance(0.3, w, h));stream.showText(waterMark);}}// 结束渲染,关闭流stream.endText();stream.restoreGraphicsState();stream.close();}// 创建临时的文件String snowflakeNextIdStr = IdUtil.getSnowflakeNextIdStr();File tempFile = File.createTempFile(snowflakeNextIdStr, ".pdf");// 加了水印的文件暂存临时文件document.save(tempFile);document.close();// 获取临时文件的数据流InputStream fileInputStream = new FileInputStream(tempFile);// 加入 zipZipEntry ze = new ZipEntry(path);zipOutputStream.putNextEntry(ze);byte[] buffer = new byte[1024];int len;while ((len = fileInputStream.read(buffer)) > 0) {zipOutputStream.write(buffer, 0, len);}fileInputStream.close();// 删除临时文件tempFile.delete();}

然后再调用处使用:

response.setContentType("application/force-download");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());

2、部署出现找不到指定字体文件

可以在项目中的src/main/resource/下放入字体文件。如下
在这里插入图片描述
然后修改字体获取方式,如下:

String ttfPath = Thread.currentThread().getContextClassLoader().getResource("font/simfang.ttf").getPath();PDFont font = PDType0Font.load(document, new FileInputStream(ttfPath));

资料参考

V少年如他-Java实现PDF文件添加水印
Shacoray-Java针对不同文件加水印
PDF格式怎么加水印?

http://www.dtcms.com/a/426160.html

相关文章:

  • 网站建设需要有什么特点留学网站建设开发方案
  • 余姚哪里有做淘宝网站的摄影作品欣赏网站
  • 南昌谁做网站设计最好的app制作公司
  • 360网站建设官网网站上传在空间哪里去了
  • 钟山区生态文明建设局网站苏州公司网站建设服务
  • 摄影网站方案苏州网站建设 凡仕臣网络
  • 口碑好门户网站开发杭州市拱墅区建设局网站
  • 什么网站做app好我想做代理
  • 网站域名如何起女教师遭网课入侵直播录屏曝光视频
  • 婚礼婚庆网站建设需求分析广州专业做网站的科技公司
  • 做个网站多少钱怎么接广告适合做设计公司的名字
  • 影视网站cpa 如何做wordpress 固定导航
  • 枣阳城乡建设局网站南昌市经济技术开发区属于哪个区
  • 企业网站设计的深圳公司seo优化销售话术
  • 网站建设怎么建好中国外包公司
  • 网站开发 博客平面设计素材免费下载
  • 做旅游宣传网站的流程云南建设厅建筑业管理网站
  • 电子商务与网站建设的报告做推广哪家网站好
  • 自己做的商业网站在那里发布如何自建淘宝客网站
  • 开封建设网站网站运营专员做六休一
  • 六安网站制作多少钱网站建设市场价格
  • 做电商有那个网站网站网站做员工犯法吗
  • 廊坊网站制作生物网站 template
  • 河北制作网站模板建站公司喂来苏州网络科技有限公司
  • 东莞营销网站建设服务如何建立互联网公司网站
  • 上海专业的网站建设公司排名绵阳住房和城乡建设厅官方网站
  • 陕西省安康市建设局网站赶集网招聘
  • 网站开发公司怎么接单南阳网站建设培训班
  • 潍坊网站优化公司网站虚拟主机有什么用
  • 北京婚恋网站哪家最好索尼电视网页浏览器