7

我有一个可填写、可保存的 PDF 文件,它有一个所有者密码(我无权访问)。我可以在 Adob​​e reader 中填写,导出 FDF 文件,修改 FDF 文件,然后导入。

然后我尝试用 iText for .NET 来做。我无法从我的 PdfReader 创建 PdfStamper,因为我没有向读者提供所有者密码。有没有办法以编程方式执行此操作,或者我必须重新创建文档?

即使使用 FdfReader 也需要 PdfStamper。我错过了什么吗?任何合法的东西——我很确定我可以破解文件,但我不能。具有讽刺意味的是,重新创建它可能没问题。

4

4 回答 4

6

此行将绕过 iTextSharp 中的编辑密码检查:

PdfReader.unethicalreading = true;
于 2012-04-18T04:08:46.580 回答
3

[我在发布这个问题几个月后发现了这个问题,我现在将这个解决方案发布给在搜索中遇到这个问题的任何人。]

我的情况完全相同:我的客户有一个 PDF,其中包含我需要以编程方式访问的可填写字段。不幸的是,PDF 受密码保护,他们没有密码,所以我发现无法使用他们的文件。

我发现 iTextSharp 4.0.4 版(及更高版本)强制执行密码限制,而早期版本没有。

所以我下载了 4.0.3 版本,果然成功了。在我的情况下,我什至不必更改我的代码来使用这个旧版本。

您可以在 SourceForge 下载 4.0.3(和所有其他版本)

于 2009-09-22T03:29:43.387 回答
2

两件重要的事

  1. 设置PdfReader.unethicalreading = true防止 BadPasswordException。
  2. 在 PdfStamper 的构造函数中设置附加模式,否则 Adob​​e Reader Extensions签名会损坏,Adobe Reader 将显示以下消息:“此文档包含在 Adob​​e Reader 中启用特殊功能的某些权限。该文档自创建以来已更改,这些权限是不再有效。请联系作者获取本文档的原始版本。

所以你需要做的就是:

PdfReader.unethicalreading = true;
using (var pdfReader = new PdfReader("form.pdf"))
{
    using (var outputStream = new FileStream("filled.pdf", FileMode.Create, FileAccess.Write))
    {
        using (var stamper = new iTextSharp.text.pdf.PdfStamper(pdfReader, outputStream, '\0', true))
        {
            stamper.AcroFields.Xfa.FillXfaForm("data.xml");
        }
    }
}

请参阅如何使用 iText 填写 XFA 表单?

于 2014-12-13T11:57:35.577 回答
0

除非其他人插话,否则我会假设答案是“不”

我最终以未加密的形式重新生成了 PDF。

于 2009-01-22T16:01:03.420 回答