Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用iText进行Acroform编辑的Pdf_Java_Pdf_Itext - Fatal编程技术网

Java 使用iText进行Acroform编辑的Pdf

Java 使用iText进行Acroform编辑的Pdf,java,pdf,itext,Java,Pdf,Itext,我正在使用iText向现有pdf文件添加文本。它适用于简单的pdf,但在使用AcroForms的pdf时存在问题 我的代码: PdfReader reader = new PdfReader("/Users/simple-user/Downloads/acroform.pdf"); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream( "/Users/simple-user/Do

我正在使用iText向现有pdf文件添加文本。它适用于简单的pdf,但在使用AcroForms的pdf时存在问题

我的代码:

    PdfReader reader = new PdfReader("/Users/simple-user/Downloads/acroform.pdf");
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
            "/Users/simple-user/Downloads/acroform2.pdf"));
    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
            BaseFont.NOT_EMBEDDED);

    PdfContentByte over = stamper.getOverContent(1);
    over.beginText();
    over.setFontAndSize(bf, 10);
    over.setTextMatrix(107, 107);
    over.showText("page updated");
    over.endText();

    stamper.close();
错误消息: “此文档在Adobe Acrobat Reader DC中启用了扩展功能。文档自创建以来已被更改,无法再使用扩展功能。请与作者联系以获取此文档的原始版本。”

并没有我想添加到文件中的文本


你知道我遗漏了什么吗?

你的诊断是错误的。问题与AcroForms的存在无关。问题与文档是否启用了读取器有关。只能使用Adobe软件启用读卡器。这是一个需要使用Adobe的私钥进行数字签名的过程。当存在有效签名时,Adobe Reader中的特定功能(如签名时的使用权限中所定义)将被解锁

请查看此问题的答案,了解如何检测PDF是否启用了读卡器:

您更改了此类PDF的内容,因此破坏了签名。破坏此签名是导致错误消息的原因:

本文档启用了Adobe Acrobat Reader DC中的扩展功能。文档创建后已更改,扩展功能不再可用。请联系作者以获取本文档的原始版本

有两种方法可以避免此错误消息:

  • 删除使用权限。这将导致表单不再启用读卡器。例如:如果文档的创建者允许将填写的表单保存在本地,则在删除使用权限后将不再可能保存
  • 以追加模式填写表单。这将导致更大的文件大小,但将保留读卡器启用
  • 删除使用权限的操作如下所示:

    PdfReader reader = new PdfReader(path_to_file);
    if (reader.hasUsageRights()) {
        reader.removeUsageRights();
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(path_to_new_file));
        stamper.close();
    }
    reader.close();
    
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper =
        new PdfStamper(reader, new FileOutputStream(dest), '\0', true);
    stamper.close();
    reader.close();
    
    在追加模式下使用iText的操作如下:

    PdfReader reader = new PdfReader(path_to_file);
    if (reader.hasUsageRights()) {
        reader.removeUsageRights();
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(path_to_new_file));
        stamper.close();
    }
    reader.close();
    
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper =
        new PdfStamper(reader, new FileOutputStream(dest), '\0', true);
    stamper.close();
    reader.close();
    

    注意
    PdfStamper

    中的额外参数有什么问题?有错误信息吗?我们需要更多的细节来提供帮助。哦,对不起,忘了。错误消息“此文档在Adobe Acrobat Reader DC中启用了扩展功能。文档自创建以来已更改,扩展功能的使用不再可用。请与作者联系以获取此文档的原始版本。”并且没有我要添加到文件中的文本。请编辑您的问题以包含此错误,尽可能多的了解细节。你为什么使用一种要求你是PDF专家的方法?为什么不使用iText中提供的方便方法呢?2.您正在位置x=107处添加文本;y=107。您如何知道这些坐标是有效的?下载并搜索水印示例(有几个)。您的代码看起来像是从某处复制/粘贴的。如果你喜欢复制/粘贴,为什么不自己从母版复制/粘贴呢?;-)