Java itext为pdf 文件添加水印核心功能代码片段

2023-11-06

/**
	 * 
	 * @param content
	 * @param pageRect
	 * @param waterMarkContent 水印文字
	 */
	private static void addWaterMark(PdfContentByte content, Rectangle pageRect, String waterMarkContent){
		try {
			// 方式一:系统自带字体文件文件
//			String path= "C:\\Windows\\Fonts\\SIMHEI.TTF";
//			BaseFont bf = BaseFont.createFont(path, BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
			//BaseFont bf = BaseFont.createFont();
	       
	        // 方式二:指定字体文件拷贝至源码文件中src/main/java,通过读取流方式事项字体文件加载
	        InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/digipower/erms/font/SIMFANG.TTF");
	        byte[] bytes = new byte[stream.available()];
	        stream.read(bytes);
	        BaseFont bf = BaseFont.createFont("SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED, BaseFont.NOT_CACHED,
	        		bytes, bytes);

	        Font f = new Font("仿宋", Font.PLAIN, SimpleTypeConverterUtil.convertIfNecessary(ApplicationPropertiesHolder.getProperty("watermark.size", "50"), int.class));
	        FontMetrics fm = sun.font.FontDesignMetrics.getMetrics(f);  
	        int textH = fm.getHeight();
	        int textW =fm.stringWidth(waterMarkContent);
			content.beginText();
            // 设置字体填充色值
			content.setColorFill(new Color(201,189,189));
             // 设置字体大小
            content.setFontAndSize(bf, SimpleTypeConverterUtil.convertIfNecessary(ApplicationPropertiesHolder.getProperty("watermark.size", "23"), float.class));
             // 设置字体透明度
            PdfGState gs = new PdfGState();
            Float opacity = Float.valueOf(ApplicationPropertiesHolder.getProperty("watermark.opacity", "0.8"));
            gs.setFillOpacity(opacity);// 设置透明度为0.8
            content.setGState(gs);
            //高度,宽度的增长步长, 目前分别是 : textH*5, textW*4。 根据后续业务调整,跟字体,size相关.
            for (int height = 100 + textH; height < pageRect.getHeight();  
                    height = height + textH * 5) {
                for (int width = 200 + textW; width < pageRect.getWidth() + textW;   
                        width = width + textW * 2) {
                    // 设置水印内容和水印倾斜角度
                	content.showTextAligned(Element.ALIGN_LEFT, waterMarkContent, width - textW, height - textH, 30);
                }  
            }
            content.endText();
			
		} catch (Exception e) {
			logger.error("添加水印出错. waterMarkContent :" + waterMarkContent, e);
		} 
	}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java itext为pdf 文件添加水印核心功能代码片段 的相关文章

随机推荐

  • 新版caffe添加自己的层(目前只学会添加,我想要添加的loss还没能实现)

    今天实现了在caffe框架中加入一个层 完成欧式距离的任务 之所以这样 是因为还没有实现自己想要的loss 只是试着学者 看能不能把添加层的流程顺下来 最后实现了 一 总体框架 1 在 src caffe proto caffe proto
  • SpringCache的介绍和使用

    1 简介 1 Spring 从 3 1 开始定义了 org springframework cache Cache和 org springframework cache CacheManager 接口来统一不同的缓存技术 并支持使用 JCa
  • 六、IP地址子网划分与VLAN

    一 IP地址的五大分类 概念 IP地址相当于人的身份证 用于在TCP IP通信协议中标记每台计算机的地址 通常用于十进制来表示 如192 168 1 100 但是在计算机内部 IP地址是一个32位的二进制数值 如11000000 10101
  • [转载]Chrome 与 Chrome OS 各版本下载集合

    Chrome OS 下载 由 Hexxeh提供的第三方编译版本 Chrome OS USB 镜像 点击这里 Chrome OS WMware 镜像 点击这里 Chrome OS Vanilla USB VMWare VirtualBox 点
  • 树的遍历-深度优先遍历和广度优先遍历

    深度优先遍历类似于树的先序遍历 假设给定初态是图中所有顶点均未被访问过 从图中某一顶点vi出发遍历图中的定义如下 首先访问出发点vi 并将其访问标志置为1 然后 从vi出发点依次搜索vi的每个邻接点vj 如vj未被访问过 则以vj为新的出发
  • 函数模板和类模板的实例化和具体化

    一 函数模板 1 显示实例化 explicit instantiation 和显示具体化 explicit specialization 的区别 1 形式上 显示实例化 template void Swap
  • estimate函数是什么?

    estimate 函数是用来估计参数值的函数 它通常用于统计学和机器学习中 用来求出一组样本数据的模型参数的最优解
  • VS2008/VS2010安装时提示VC++9.0 Runtime安装失败问题的解决方法

    查了一下 有以下几种解决方法 1 http blog csdn net zlqqhs article details 8821608 2 https dotblogs com tw johnny archive 2010 07 16 165
  • 矩阵向量求导(Matrix calculus)

    原文地址 注 不要把它和几何运算或者是向量运算混淆 前言 在数学中 矩阵微积分是进行多变量微积分的一种特殊符号 特别是在矩阵的空间上 它将关于许多变量的单个函数的各种偏导数和 或关于单个变量的多变量函数的偏导数收集到可以被视为单个实体的向量
  • linux从EMMC启动或TFTP启动的UBOOT参数

    从EMMC启动内核及设备树 setenv bootargs console ttymxc0 115200 root dev mmcblk1p2 rootwait rw setenv bootcmd mmc dev 1 fatload mmc
  • java-logback记录日志到指定文件并且压缩保存日志

    yml配置文件中加入如下配置 logging config classpath logback spring xml 项目根目录下的xml配置文件 level root info 全局日志的级别 file name mes log 输出日志
  • nvm 在 Windows 上的使用

    NVM Node Version Manager 是一个用于管理和切换多个 Node js 版本的工具 它允许你在同一台机器上同时安装和使用不同版本的 Node js 而无需手动安装和卸载 之前都是只安装一个版本的 node js 该更新时
  • 2021年字节跳动、阿里等大厂最全Android面试题,已开源

    前言 对于字节跳动的二面三面而言 Framework MVP架构 HashMap原理 性能优化 Flutter 源码分析等问题都成高频问点 然而很多的朋友在面试时却答不上或者答不全 今天在这分享下这些问点的视频解析给大家 希望对有需要的朋友
  • 一文教会你如何用 Python 分割合并大文件

    有时候 我们需要把一个大文件发送给别人 但是限于传输通道的限制 比如邮箱附件大小的限制 或者网络状况不太好 需要将大文件分割成小文件 分多次发送 接收端再对这些小文件进行合并 今天就来分享一下用 Python 分割合并大文件的方法 思路及实
  • 2017版VisualStudio asp.net利用ZXing生成条形码、二维码

    2017版VisualStudio asp net利用ZXing生成条形码 二维码 一 在asp net项目中添加ZXing 1 右击项目 管理NuGet程序包 2 搜索ZXing 下载ZXing net并安装即可 二 生成条形码 1 页面
  • Arch Linux 安装(痛苦版)

    我已经用了两年的Linux FreeBSD 平时都是硬盘安装 除了BSD有点阻碍 linux不在话下 但是Arch Linux让我感到无助 虽然最后是用光驱安装成功 为什么要装archLinux 我的二手笔记本 CPU P3 700 RAM
  • Test Driven Development感悟

    编程的思想有面向过程编程 面向对象编程 面向接口编程 面向接口编程是现在很多公司在使用的 面向接口效率更好 而且使得业务代码更加简洁易调试 面向对象的方法使得代码会多出很多接口 可以为以后的使用留接口 但是开发效率不高 面向过程写代码 可以
  • 8-高精度计算(加法)

    我们知道 在C语言和C 中对于所能存储的数值的最大值是有明确的上限的 但是我们有时候会需要去计算一些数值比较大的数字 例如位数为1000 10000的数字的加减运算 这时候我们就需要使用新的运算方法了 这里引入高精度的大数据计算 它可以用计
  • SDIO接口(3)——SDIO总线接口

    SDIO总线接口 SDIO是在SD标准上定义了一种外设接口 故名思义 就是SD的I O接口的意思 SD本来是记忆卡的标准 但是现在把SD连接一些外围I O使用 这样边形成了SDIO接口 SDIO本身只是一种接口技术 类似于SPI接口 通过I
  • Java itext为pdf 文件添加水印核心功能代码片段

    param content param pageRect param waterMarkContent 水印文字 private static void addWaterMark PdfContentByte content Rectang