pdf文件加水印 itextpdf

  1. pom文件添加依赖
        <!-- 目前有7版本的,5版本的已停止维护 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency><!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.1</version></dependency>
  1. pdfUtil
package com.cybx.extendedinsurance.system.util;import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.http.HttpUtil;
import com.easybao.exception.ValidException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.*;
import org.apache.commons.lang.StringUtils;
import reactor.util.function.Tuple5;
import reactor.util.function.Tuples;import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.function.Consumer;
import java.util.function.Supplier;/*** @Author * @Date 2022/8/23* @DESC pdf相关操作*/
public class PdfUtil {/*** pdf文件增加水印** @param url http地址或者文件路径*/public static void addTextWaterMark(String url, OutputStream targetOutPut, String waterMarkWorld, Supplier<BaseFont> baseFontSupplier,Consumer<Tuple5<PdfReader, PdfStamper, PdfGState, BaseFont, String>> contextStyleConsumer) {try {//获取文件输入流BufferedInputStream inputStream = getSource(url);//读取文件PdfReader reader = new PdfReader(inputStream);PdfStamper stamper = new PdfStamper(reader, targetOutPut);BaseFont baseFont = baseFontSupplier.get();PdfGState gs = new PdfGState();contextStyleConsumer.accept(Tuples.of(reader, stamper, gs, baseFont, waterMarkWorld));stamper.close();} catch (IOException e) {e.printStackTrace();throw new ValidException("读取pdf文件异常,异常原因 " + e.getMessage());} catch (DocumentException d) {d.printStackTrace();throw new ValidException("绑定输出和阅读器出错, 错误原因 " + d.getMessage());} finally {}}/*** 将传入的http或者文件路径转为输出流** @param url* @return*/public static BufferedInputStream getSource(String url) {if (StringUtils.isEmpty(url)) {throw new ValidException("url地址不能为空");}if (HttpUtil.isHttp(url) || HttpUtil.isHttps(url)) {byte[] fileBytes = HttpUtil.downloadBytes(url);return new BufferedInputStream(IoUtil.toStream(fileBytes));} else if (FileUtil.isFile(url)) {return FileUtil.getInputStream(url);}throw new ValidException("不支持的文件类型");}public static Supplier<BaseFont> defaultBaseFont() {return () -> {// 使用iTextAsian.jar中的字体BaseFont baseFont = null;try {//自己的字体资源路径Resource resource = new ClassPathResource("template/msyh.ttf");byte[] fileBytes = IoUtil.readBytes(resource.getInputStream());
//                String path = "src/main/resources/template/msyh.ttf"; //绝对路径只在开发工具下有效
//                baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); //设置字体为itext自带字体baseFont = BaseFont.createFont("msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED, true, fileBytes, null, false);//设置自定义字体} catch (Exception e) {e.printStackTrace();throw new ValidException("设置字体失败,失败原因" + e.getMessage());}// 使用Windows系统字体(TrueType)
//            BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H,
//                    BaseFont.NOT_EMBEDDED);return baseFont;};}public static Consumer<Tuple5<PdfReader, PdfStamper, PdfGState, BaseFont, String>> defaultContextStyleConsumer() {return (Tuple5<PdfReader, PdfStamper, PdfGState, BaseFont, String> consumer) -> {// 获取PDF页数int total = consumer.getT1().getNumberOfPages();// 遍历每一页for (int i = 0; i < total; i++) {// 内容PdfContentByte content = consumer.getT2().getOverContent(i + 1);// 页宽度float width = consumer.getT1().getPageSize(i + 1).getWidth();// 页高度float height = consumer.getT1().getPageSize(i + 1).getHeight();//开始写入文本content.beginText();consumer.getT3().setFillOpacity(0.3f);//水印透明度content.setGState(consumer.getT3());content.setColorFill(BaseColor.LIGHT_GRAY);//字体大小int fontSize = 48;content.setFontAndSize(consumer.getT4(), fontSize);//设置字体的输出位置 A4大小 595,842
//                content.setTextMatrix(70, 200);//倾斜角度float rotation = 30f;int spacing = (int) (fontSize * consumer.getT5().length());int num = (int) Math.ceil((double) (height) / spacing);for (int j = 0; j < num; j++) {//需要生成多少行int marginLeft = -(int) (Math.random() * fontSize * consumer.getT5().length());int colSpacing = (int) (fontSize * consumer.getT5().length());while (marginLeft < width) {//需要生成多少列content.showTextAligned(Element.ALIGN_JUSTIFIED_ALL, consumer.getT5(), marginLeft, spacing * j, rotation);marginLeft += colSpacing;}}//结束写入文本content.endText();/* 要打图片水印的话 *//* Image image = Image.getInstance("c:/1.jpg");content.addImage(image); */}};}}
  1. 主方法调用
 public static void main(String[] args) {ByteArrayOutputStream targetOutPut = new ByteArrayOutputStream();PdfUtil.addTextWaterMark("文件url", targetOutPut, "水印内容",PdfUtil.defaultBaseFont(), PdfUtil.defaultContextStyleConsumer());}
  1. BaseFont方法 设置中文字体
  • 直接引用itxtPdf字体
  • 引用自定义字体
    自定义字体需要注意点:

    1. 直接从windows复制字体 C:\Windows\Fonts 下,字体文件可能存在多个 参数名称传参需要逗号分隔加数字
      BaseFont baseFont = BaseFont.createFont(“msyh.ttf,0”, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED, true, fileBytes,null, false);
    2. spring项目中,如果放在静态文件区只能读取流的方式读取文件,路径也不能使用绝对路径或相对路径
  1. 效果图 会自动计算列宽,需要调整的调整字体大小,位置的话调用 showTextAligned

itextPdf pdf加水印相关推荐

  1. (Java)word转pdf(aspose),pdf加水印(itextpdf),并支持POI模板(包括checkbox)导出

    目录 1.引入jar包 2.pdf处理工具类 3.poi模板导出工具类 4.测试类 5.模板 6.最终效果 1.引入jar包 2.pdf处理工具类 import com.aspose.cells.Pd ...

  2. java pdf水印排布问题_java 实现 PDF 加水印功能

    使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 com.itextpdf itextpdf 5.5.11 com.itextpdf itext-asian 5.2.0 java 代码实 ...

  3. Java实现Excel和word转pdf加水印,复制及可用

    Java实现Excel和word转pdf加水印,复制及可用 时隔大半年,之前朋友,今天突然找我说,他们有个需求要做这东西.想起来之前自己照着官方文档写,也走了不少坑.今天就索性写个,也为了方便以后使用 ...

  4. java如何给pdf加水印_java pdf加水印的方法

    本文实例为大家分享了java pdf加水印的具体代码,供大家参考,具体内容如下 引入依赖 com.itextpdf.tool xmlworker 5.5.10 com.itextpdf itextpd ...

  5. java使用2种方法操作liberoffice把word转pdf,pdf加水印,java远程调用Linux执行命令

    文章目录 libreoffice下载地址 安装 (第一种) java调用 (第二种 推荐) java调用Linux命令转pdf java远程连接Linux执行命令(少数情况) linux安装windo ...

  6. Springboot使用itext及documents4j操作pdf(word转pdf、pdf加水印(文字或图片,可指定位置)、pdf加密(打开密码,编辑密码))

    pom.xml引入 <!-- pdf文档生成 --><dependency><groupId>com.documents4j</groupId>< ...

  7. itextPDF5.5.13 pdf加水印的权限控制

    1.我们的需求需要对pdf加水印,其中有加密的和未加密的, 操作过程中发现 有的虽然加密了 但是符合PDFReader的五种加密算法,就可以成功破解加水印,还有一些就会抛出一些异常 第一种报错:com ...

  8. PDF转换图片,图片的切割,图片转换PDF以及PDF加水印等记录贴

    PDF转变为图片: 把图片进行切割: 把图片转变回PDF: 为PDF加水印文字: 为PDF加水印图片. 1,PDF转变为图片 /*** @author dalin*将PDF格式的文件转换成png文件* ...

  9. XDOC Office Server 发布 1.1.0 版本,支持 PDF 加水印

    XDOC Office Server 是一个 JavaEE 服务,用于将 Office 文档转换为 PDF,格式兼容性好. 版本更新 支持 &_watermark 参数,对生成的 PDF 加水 ...

  10. 怎么给pdf加水印,pdf加水印步骤

    怎么给pdf加水印?有时候位置方式别人随意使用pdf文件里面的内容,我们需要给做好的pdf文件添加水印,这样可以起到一定的保护作用,那么怎么给pdf文件添加水印呢?有的小伙伴肯定会说,用专业的pdf编 ...

最新文章

  1. Error: Could not open client transport with JDBC Uri: jdbc:hive2://henu2:10000: java.n et.ConnectExc
  2. dm365 resize
  3. 微软Build 2019大会.NET课程视频汇总
  4. rest spring_Spring REST:异常处理卷。 2
  5. Python | threading02 - 互斥锁解决多个线程之间随机调度,造成“线程不安全”的问题。
  6. [轉]解决Windows XP下缩略图显示模式下文件夹没有名称的方法
  7. Series 入门(创建和增删改查)
  8. Java eclipse汉字乱码解决
  9. 如何在HTML添加英文字母序号,怎样在文章中正确的使用序号(国外英文资料).doc...
  10. 最全的Java笔试题库之选择题篇-总共234道【61~120】
  11. 公众号获取openid
  12. 48 Fixing relationship Problems with Humor 用幽默解决人际关系问题
  13. 苹果safari浏览器的正确使用方法
  14. 监听队列中linux方法ss -a,Linux命令:ss命令
  15. 用计算机画有常数的函数图像,信息技术应用 用计算机画函数图象教学实录
  16. Python的就业方向、薪资,学完前景怎么样?
  17. ip国家 数据库下载
  18. 工程流体力学笔记暂记7(动量方程)
  19. new操作符的执行过程
  20. NOI2005 聪聪和可可

热门文章

  1. imx6 android 最新,【iMX6Q-Android6.0】---移植 iMX6Q android6.0 源码 史上最详细
  2. 18650锂电池保护板接线图_锂电池保护板的基础知识及常见不良分析
  3. linux操作系统日志查看,linux 如何查看系统日志
  4. android能播放4k视频格式,四平台六款手机4K视频播放实测
  5. 电钻有刷好还是无刷好_有刷电机与无刷电机究竟哪个好?看完就知道了!
  6. 永磁同步电机dq坐标系中转矩公式中系数3/2的由来
  7. js获取当前路径的url
  8. H3C交换机设置与无线控制器时间同步
  9. windows录屏_电脑是怎么录屏的呢?推荐三个录屏实用方法!
  10. android 沙盒 ios,iOS之沙盒机制