PDF嵌入隐藏的文字

所需依赖

xml 复制代码
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-core</artifactId>
    <version>9.0.0</version>
    <type>pom</type>
</dependency>

源码

java 复制代码
/**
 * 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) {
                // 如果表单不存在,返回 null
                return null;
            }
            // 获取指定名称的字段
            PdfFormField field = form.getField(filedName);
            if (field == null) {
                // 如果字段不存在,返回 null
                return null;
            }
            // 返回字段值的字符串表示
            return field.getValueAsString();
        } catch (Exception e) {
            // 发生异常时抛出服务异常
            throw new ServiceException(0, "获取PDF字段处理失败");
        }
    }
}
相关推荐
shjita5 小时前
java根据键值对中值的大小进行排序的手法。
java·开发语言·servlet
开开心心就好6 小时前
近200个工具的电脑故障修复合集
安全·智能手机·pdf·电脑·consul·memcache·1024程序员节
薪火铺子6 小时前
Spring Security 6.x 实战指南
java·后端·spring
善恶怪客6 小时前
Java-数据类型
java
学习3人组6 小时前
Mes全连路架构图
java·erp
其实秋天的枫6 小时前
2026年初中英语大纲词汇表1600词
经验分享·pdf
上弦月-编程6 小时前
C语言指针从入门到实战
java·jvm·算法
Cyan_RA96 小时前
SpringMVC 请求数据绑定与参数映射 详解
java·后端·spring·mvc·springmvc·映射请求数据
逻辑驱动的ken6 小时前
Java高频面试考点场景题20
java·开发语言·深度学习·面试·职场和发展
bzmK1DTbd6 小时前
Java游戏服务器:Netty框架的高并发网络通信
java·服务器·游戏