当前位置: 首页 > 知识库问答 >
问题:

使用iText进行Acroform编辑的Pdf

吕皓
2023-03-14

我正在使用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中启用了扩展功能。文档自创建以来已更改,扩展功能的使用不再可用。请与作者联系以获取此文档的原始版本。”

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

知道我错过了什么吗?

共有1个答案

魏学智
2023-03-14

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

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

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

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

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

  1. 删除使用权限。这将导致表单不再启用读卡器。例如:如果文档的创建者允许将填写的表单保存在本地,则在删除使用权限后,将无法再保存

删除使用权限是这样完成的:

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();

在追加模式下使用iText是这样完成的:

PdfReader reader = new PdfReader(src);
PdfStamper stamper =
    new PdfStamper(reader, new FileOutputStream(dest), '\0', true);
stamper.close();
reader.close();

请注意PdfStamper中的额外参数。

 类似资料:
  • 我在尝试使用iText编辑pdf文档时遇到以下异常。这个问题是非常零星的,就像有时它是工作的,有时它是抛出错误。 下面是我用来编辑的代码:

  • 我正在尝试编辑远程AmazonEC2Linux实例上的文件。我目前正在使用nano,但我非常想要一个图形文本编辑器。我有两个问题: 当我ssh时,我必须使用sudo来编辑这些服务器文件。 我只能用亚马逊给我的密钥登录。ndrew.pemec2-user@55.55.44.33 请帮忙!我不挑剔,只是任何图形文本编辑器,因为使用nano是一个巨大的痛苦。

  • 首先,虽然我关注StackOverflow已经有相当一段时间了,但这是我第一次发布一些东西,所以如果我做错了或者不按规则做的话,请随时为我指出正确的方向。 我正在开发一个PDF数字签名应用程序,使用iText5,它依赖于一个外部服务,在我准备好PDF签名后提供一个签名哈希。 如iText文档中所述,在第一阶段,我准备了PDF(在最终实现中,所有PDF都可能是多签名的,因此我使用追加模式),如下所示

  • 问题内容: 我想使用itext生成pdf。我会在某些时候添加内容以进行分页。我需要插入几个单独的conenidos依赖源,所以我要求用户在单独的页面上插入。有任何想法吗??? 问题答案: 调用告诉iText将后续对象放置在新页面上。仅当您放置下一个对象时,才会真正创建新页面。另外,仅在当前页面不为空白时创建一个新页面;否则,仅创建一个新页面。否则,它将被忽略;您可以用来克服这一点。 请参见下面的链

  • 我想用iText生成一个pdf。我会在某个时候添加内容以进行分页。我需要插入几个单独的conenidos依赖源,所以我要求用户在单独的页面上这样做。有什么想法吗???

  • 我有一个pdf文件,需要数字签名,签名是由外部服务提供。在启动签名之前,我没有证书链。我尝试了下面的代码,但是得到了Sigdict/Contents非法的数据消息。 创建文档哈希并将其发布到外部服务以对其进行签名的源 方法getPKCS7DataFromDigitalSignatureResponse(responseXML)用于解析外部服务响应,它将PKCS7作为字符串返回。我试图找出问题的根源