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字段处理失败");
        }
    }
}
相关推荐
缓慢更新3 小时前
审批的加签与会签:多人意见怎么合
android·java·数据库·低代码·rxjava
yuniko-n4 小时前
【JUC】volatile 非原子性深入解析
java
sun_weitao5 小时前
极简版 MCP 工具实现方案
java·linux·服务器
金銀銅鐵6 小时前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
布吉岛的石头6 小时前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
大文说跨境7 小时前
防关联浏览器的指纹覆盖到什么程度:六类参数的实测与自检方法
java·指纹浏览器·tiktok运营
Carol06307 小时前
上肢及肩肘关节
java·服务器·数据库
yliucherish7 小时前
Log4Shell 复现实录:我读 OpenJDK 源码,发现两道防线的默认值竟然相反
java
维拉德7 小时前
Java新人第一次接打标需求:从抓包找接口到客户端展示
java
luobobo8967 小时前
支付回调验签连续失败三天,最后发现是网关的时间戳单位问题
java