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

PDF嵌入隐藏的文字

所需依赖

<dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>9.0.0</version><type>pom</type>
</dependency>

源码

/*** PDF工具*/
public class PdfUtils {/*** 在 PDF 中嵌入字段* 在现有 PDF 文档中添加表单字段及其值** @param pdfBytes   原 PDF 文档的字节数组* @param filedName  要嵌入的字段名称* @param fieldValue 要嵌入的字段值* @return 嵌入字段后的 PDF 字节数组* @throws ServiceException 如果嵌入过程中发生错误*/public static byte[] embedField(byte[] pdfBytes, String filedName, String fieldValue) {try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {// 创建 PDF 文档对象,读取源 PDF 并指定输出流PdfDocument pdfDoc = new PdfDocument(new PdfReader(new ByteArrayInputStream(pdfBytes)),new PdfWriter(baos));// 获取 PDF 第一页对象PdfObject pdfObject = pdfDoc.getPdfObject(1);// 获取或创建 PDF 表单PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);// 创建表单字段PdfFormField pdfFormField = new PdfFormField((PdfDictionary) pdfObject);// 设置字段名称pdfFormField.setFieldName(filedName);// 设置字段值pdfFormField.setValue(fieldValue);// 设置字段为只读pdfFormField.setFieldFlags(PdfFormField.FF_READ_ONLY);// 将字段添加到表单中form.addField(pdfFormField);// 关闭文档并写入输出流pdfDoc.close();// 返回处理后的 PDF 字节数组return baos.toByteArray();} catch (Exception e) {// 发生异常时抛出服务异常throw new ServiceException(0, "嵌入PDF字段失败");}}/*** 从 PDF 中获取指定字段的值** @param pdfBytes  PDF 字节数组* @param filedName 要获取的字段名称* @return 字段值,如果字段不存在则返回 null* @throws ServiceException 如果获取过程中发生错误*/public static String getField(byte[] pdfBytes, String filedName) {try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(new ByteArrayInputStream(pdfBytes)))) {// 获取 PDF 表单,不自动创建PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, false);if (form == null) {// 如果表单不存在,返回 nullreturn null;}// 获取指定名称的字段PdfFormField field = form.getField(filedName);if (field == null) {// 如果字段不存在,返回 nullreturn null;}// 返回字段值的字符串表示return field.getValueAsString();} catch (Exception e) {// 发生异常时抛出服务异常throw new ServiceException(0, "获取PDF字段处理失败");}}
}
http://www.xdnf.cn/news/2303.html

相关文章:

  • [ACTF2020 新生赛]Upload
  • DeepSeek智能时空数据分析(五):基于区域人口数量绘制地图散点-大模型搜集数据NL2SQL加工数据
  • Python对比两张CAD图并标记差异的解决方案
  • 第5章 数据库系统(选择|案例|论文)(重点★★★★★)
  • 【ROS2】ROS开发环境配置——vscode和git
  • 【极致版】华为云Astro轻应用抽取IoTDA影子设备参数生成表格页面全流程
  • OceanBase数据库磁盘空间管理
  • AI声像融合守护幼儿安全——打骂/异常声音报警系统的智慧防护
  • 在Linux中使用ferror()函数和feof()函数判断文件是否读取成功,或者读取指针是否到达了文件末尾?
  • python实战项目66:抓取考研招生专业信息
  • 2025上海车展 | 移远通信重磅发布AR脚踢毫米波雷达,重新定义“无接触交互”尾门
  • IO与文件·I(linux+C)
  • 洛谷题目:P8856 [POI 2002] 火车线路 题解(有一点难)
  • Docker(二):docker常用命令
  • 概率论与统计(不确定性分析)主要应用在什么方面?涉及到具体知识是什么?
  • 如何识别DDoS攻击类型及有效防护?一篇简明指南
  • Git Bash 下使用 SSH 连接出现 “Software caused connection abort” 问题
  • Macos m系列芯片环境下python3安装mysqlclient系列问题
  • 数据需求管理办法有哪些?具体应如何应用?
  • 图神经网络(GNN)基本概念与核心原理
  • 某化工厂运维升级:智和信通运维平台实现工业交换机智能管理
  • Maven 4.0.0 模式-pom.xml配置详解
  • 《AI大模型应知应会100篇》第37篇:Agent框架入门:让AI具备自主行动能力
  • 数字巴别塔:全栈多模态开发框架如何用自然语言重构软件生产关系?
  • Unity 和 Unreal Engine(UE) 两大主流游戏引擎的核心使用方法
  • 回顾|Apache Cloudberry™ (Incubating) Meetup·2025 杭州站
  • MyBatis 类型处理器(TypeHandler)注册与映射机制:JsonListTypeHandler和JsonListTypeHandler注册时机
  • 174页Deepseek大模型在银行系统的部署方案
  • 一、I/O的相关概念
  • Spark RDD行动算子与共享变量实战:从数据聚合到分布式通信