itextpdf PDF 文字、图片 签名

news/2025/1/3 13:57:57/文章来源:https://www.cnblogs.com/vipsoft/p/18644127

itextpdf PDF 文字、图片 签名


public class PdfElementInfo {public enum TypeEnum {UNKNOWN,TEXT,IMAGE}/*** 1. 文本* 2. 图片*/private int type;private float x;private float y;/*** 文本内容*/private String text;private float fontSize;/*** 路径*/private String imgPath;...getter & setter....
}
/*** 添加文字水印** @param inputUrl* @param outputUrl* @param elementInfoList* @param pageRange       -1 全部,空:第一页,1:第一页,1~3:第1、2、3页*/private void addElement(String inputUrl, String outputUrl, List<PdfElementInfo> elementInfoList, String... pageRange) {PdfStamper stamper = null;PdfReader reader = null;try {BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outputUrl), false));reader = new PdfReader(inputUrl);stamper = new PdfStamper(reader, bos);int total = reader.getNumberOfPages() + 1;List<Integer> pageNumList = new ArrayList<>();if (pageRange.length == 0) {pageNumList.add(1);}if (pageNumList.size() > total) {throw new CustomException("指定页,超过了PDF文件页数");}PdfContentByte content;// BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);// "c:\\windows\\fonts\\SIMHEI.TTF" 使用windows系统的黑体BaseFont base = BaseFont.createFont("C:\\windows\\fonts\\SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);PdfGState gs = new PdfGState();for (Integer pageNum : pageNumList) {content = stamper.getOverContent(pageNum);// 在内容上方加水印
//                content = stamper.getUnderContent(pageNum);//在内容下方加水印gs.setFillOpacity(0.2f);content.beginText();//content.setTextMatrix(390, 810);//内容居中,横纵坐标,偏移量//content.showTextAligned(Element.ALIGN_CENTER, "AAAA", 179.54f, 718.62f, 0);for (PdfElementInfo textInfo : elementInfoList.stream().filter(p -> p.getType() == 1).collect(Collectors.toList())) {//字体大小content.setFontAndSize(base, textInfo.getFontSize());content.showTextAligned(Element.ALIGN_CENTER, textInfo.getText(), textInfo.getX(), textInfo.getY(), 0);}for (PdfElementInfo imgInfo : elementInfoList.stream().filter(p -> p.getType() == 2).collect(Collectors.toList())) {//添加图片Image image = Image.getInstance(imgInfo.getImgPath());/*img.setAlignment(Image.LEFT | Image.TEXTWRAP);img.setBorder(Image.BOX); img.setBorderWidth(10);img.setBorderColor(BaseColor.WHITE); img.scaleToFit(100072);//大小img.setRotationDegrees(-30);//旋转*///图片的位置(坐标)image.setAbsolutePosition(imgInfo.getX(), imgInfo.getY());// image of the absolute,宽、高,取最值值进行适配image.scaleToFit(100, 100);//image.scalePercent(imgInfo.getScalePercent());//依照比例缩放. 调整缩放,控制图片大小content.addImage(image);}content.setFontAndSize(base, 8);content.endText();}} catch (Exception ex) {ex.printStackTrace();} finally {try {if (stamper != null) {stamper.close();}//关闭打开的原来PDF文件,不执行reader.close()删除不了(必须先执行stamper.close(),否则会报错)if (reader != null) {reader.close();}} catch (Exception e) {e.printStackTrace();}}}
@Testvoid testSignature() throws Exception {String inputUrl = "D:\\THOTH\\0.SyncService\\Api.22586\\Report\\Report.pdf";//生成的文件路径String outputUrl = "D:\\THOTH\\0.SyncService\\Api.22586\\Report\\Report_out_" + DateUtil.current() + ".pdf";String imageUrl = "D:\\Users\\Pictures\\R-C.png";List<PdfElementInfo> elementInfoList = new ArrayList<>();PdfElementInfo textInfo = new PdfElementInfo();textInfo.setType(PdfElementInfo.TypeEnum.TEXT.ordinal());textInfo.setFontSize(10.5f);textInfo.setX(200f);textInfo.setY(100f);textInfo.setText("张三" + DateUtil.current());elementInfoList.add(textInfo);textInfo = new PdfElementInfo();textInfo.setType(PdfElementInfo.TypeEnum.TEXT.ordinal());textInfo.setFontSize(10.5f);textInfo.setX(400f);textInfo.setY(100f);textInfo.setText("李四" + DateUtil.current());elementInfoList.add(textInfo);PdfElementInfo imgInfo = new PdfElementInfo();imgInfo.setType(PdfElementInfo.TypeEnum.IMAGE.ordinal());imgInfo.setX(100f);imgInfo.setY(200f);imgInfo.setImgPath(imageUrl);elementInfoList.add(imgInfo);addElement(inputUrl, outputUrl, elementInfoList);//删除原来的PDF文件/*File targetTemplePDF = new File(inputPDFFilePath);targetTemplePDF.delete();*/}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861928.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于CH32V307以太网使用

1、关于仿真 在使用以太网时,不建议使用仿真功能。因为在网络协议栈内部有一个变量需要固定间隔时间去进行累加计数,若使用仿真功能,会导致这个变量停止累加计数,从而导致程序出现异常;2、关于内部10M PHY的使用 在使用内部10M PHY时,内部 10M PHY的时钟由 PLL3 提供,且…

搭建dvwa靶机

# 1、直接使用docker搭建方便很多,这个环境依赖问题没必要多花时间去研究; ubuntu安装docker apt-get update apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor …

深入理解Git:从原理到实践的全面指南

Hello World 深入理解Git:从原理到实践的全面指南本文深入剖析Git的核心概念和底层实现原理,包括对象模型、分支管理、合并策略等关键特性。通过理解Git的数据结构和工作机制,帮助开发者更好地处理版本控制中的各种复杂场景,从基础使用者进阶为Git专家。在日常开发中,很多…

墨天轮国产数据库排行榜年终总结-2024年

本文对2024年墨天轮中国数据库流行度排行榜进行了年终盘点,包含多个维度的详细分析整理,欢迎大家阅读交流。图片说明:按照墨天轮中国数据库流行度排行榜分数比例生成 前言: 岁月不居,时节如流。岁末年终,忽焉已至。墨天轮平台已于2024年12月1日公布了中国数据库流行度排行榜…

CISSP备考经验分享2024年12月

https://www.cnblogs.com/iAmSoScArEd/p/18644021 我超怕的 CISSP备考经验分享2024年12月 考试过了,以下是我的备考经历,不一定适合所有人,所以请按照自己的习惯备考。 考试感受 考试形式:CAT模式、中文(感兴趣可以先了解下考试模式:https://www.isc2china.org/cissp-cat…

Gradle下载Plugins插件连接超时 failed: Connection timed out: connect的解决方法

可以去gradle官方plugin仓库看看插件是否存在。 出现超时的问题多半都是网络因素,可能是复杂的网络导致你访问不了吧,配置下plugins可访问使用的仓库即可。 需要注意buildscript在plugins之上的位置。 buildscript {repositories {mavenLocal()maven { url https://maven.ali…

定义通用返回包装类

定义通用返回包装类 包装返回正确的数据格式,返回类型示例 {"code":200,"message":"success","data":[] }通用包装类 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;/*** @author zhangsh…

dolphinscheduler相关

任务状态和事件驱动时序图

蓝牙设备过多导致Win11出现不定时死机现象

10月份之后发现自己的ROG FLOW X16笔记本开始不定时死机了。具体表现是正常使用过程突然死机,各种地方点不动,不能注销,不能重启,不能关机,我的电脑打不开,任务管理器打开是一片空白。仅有一些窗口最大化和最小化之类的功能可以点击。并且没有任何表征,就是突然给你出现…

绝对不能错过的:Air201看门狗定时器!

看门狗技术(Watchdog Timer)是嵌入式系统中一种重要的稳定性增强技术,用于监测和恢复系统的正常运行状态。当系统因程序跑飞、死机或受到电磁干扰而无法正常工作时,看门狗能够及时检测并采取相应措施,从而避免系统长时间处于故障状态。 本文将带你了解看门狗的工作原理、应…

关于Chat2DB的吐槽

最近心血来潮准备支援原子一波、看着多出来一个选项联合会员chat2db、于是纳闷chat2db是个啥东西于是下载下来试用了一下,怎么说呢、不好评价 ​ SQL优化功能:一股浓浓的AI味,跟你直接问ChatGpt差不多。 ​ sql提示也没想象的好、自然语言转sql更是难用、不如直接自己写 ​ …

[转] 认知负荷才是关键

Title: cognitive-load/README.zh-cn.md at main zakirullin/cognitive-load URL Source: https://github.com/zakirullin/cognitive-load/blob/main/README.zh-cn.md简介(Introduction)这世上有如此多的“流行语”和“最佳实践”,但是让我们把注意力转向更基础的方面。即——…