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字段处理失败");
        }
    }
}
相关推荐
北执南念14 分钟前
项目代码生成工具
java
中国lanwp20 分钟前
springboot logback 默认加载配置文件顺序
java·spring boot·logback
苹果酱05671 小时前
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
java·vue.js·spring boot·mysql·课程设计
Java致死1 小时前
单例设计模式
java·单例模式·设计模式
胡子发芽1 小时前
请详细解释Java中的线程池(ThreadPoolExecutor)的工作原理,并说明如何自定义线程池的拒绝策略
java
沫夕残雪1 小时前
Tomcat的安装与配置
java·tomcat
胡子发芽2 小时前
请解释Java中的NIO(New I/O)与传统I/O的区别,并说明NIO中的关键组件及其作用
java
柚个朵朵2 小时前
IDEA中使用Git
java·git·spring
马武寨山的猴子2 小时前
【MinerU】:一款将PDF转化为机器可读格式的工具——RAG加强(Docker版本)
人工智能·docker·容器·pdf·rag
jerry6092 小时前
优先队列、堆笔记(算法第四版)
java·笔记·算法