0

我们有大量的 PDF 文件,我们正在创建一个网站以允许用户下载它们,当他们需要时,我们希望:

  1. 在上面加上他们的名字的水印。
  2. 我们希望表单字段保持打开状态,以便他们输入信息。
  3. 我们希望能够打印和保存文档

当我将水印放在文档上然后打开它时,我收到来自 Adob​​e 的消息:

“文档自创建以来已更改,无法再使用扩展功能。请联系作者...”

根据“iText-in-Action”一书,这是一个安全问题(第 8 章)。似乎有两种方法可以打开它们:

  1. 删除使用权:这打破了上面的#3。
  2. 以附加模式打开它:修改它并使用“FormFlatening = false”或true保存都没有关系,如果我在表单上放置水印,则字段不再可编辑。

Adobe 的错误消息确实描述了问题,我已经修改了带有水印的文档内容,因此表单字段被阻止。我尝试打开将水印放在上面的文档并将其保存到新文件中,然后将其关闭。然后重新打开它并尝试取消阻止表单字段,但它不起作用。

有谁知道这是否可能?我读过一些关于模板的东西;我不知道这是否是一个解决方案,因为需要将文档转换为模板?有谁知道这是否有帮助?

下面是我使用图像作为水印的代码示例,尽管我也尝试过添加文本:

        PdfReader reader = new PdfReader(sourceFile.FullName);
        //reader.RemoveUsageRights();

        var fileStream = new FileStream(outputPath, FileMode.Create, FileAccess.ReadWrite);

        PdfStamper pdfStamper = new PdfStamper(reader, fileStream, '\0', true);


        Image image = Image.GetInstance(imagePath);
        image.SetAbsolutePosition(250, 300);

        for (int i = 1; i <= reader.NumberOfPages; i++) // Must start at 1 because 0 is not an actual page.
        {
            PdfContentByte pdfPageContents = pdfStamper.GetUnderContent(i);

            pdfPageContents.AddImage(image);
        }

        pdfStamper.FormFlattening = false; // enable this if you want the PDF flattened. 
        //bool have = pdfStamper.PartialFormFlattening("test");
        pdfStamper.Close(); // Always close the stamper or you'll have a 0 byte stream. 
4

2 回答 2

1

启用 Reader 的文档使用 Adob​​e 拥有的私钥进行数字签名。如果 Adob​​e Reader 可以使用 Adob​​e 的公钥验证该签名,则启用额外功能(例如,允许您保存已填写的表格)。

添加水印不是您可以对数字签名文档执行的操作的一部分。如果不使触发阅读器启用的数字签名无效,您绝对无法实现您想要的。

简而言之:您正在尝试做一些不可能的事情。您只能通过使用 Adob​​e 软件来实现这一点,因为您需要 Adob​​e 的私钥在破解后“恢复”阅读器启用。

于 2012-10-19T06:36:44.190 回答
0

好建议。

每次我重新启动计算机时,A​​dobe 都会抱怨需要更新。我想要的最后一件事是被黑客困住,这在未来可能行不通。

我的一个尝试是在 PDF 的不同图层上创建水印,希望它不会将其视为更改 PDF 的文本图层,但这不起作用。我的老板想从原始 PDF 中抓取文本并将其复制到新文档中,然后在其上添加水印。即使我创建了一个新的 PDF,它仍然认为它正在修改它,并且这些字段仍然不可编辑。

仍然卡住

于 2012-10-19T13:52:30.500 回答