ITextSharp - 添加水印;保持PDF可编辑 - FormFlattening = false

时间:2012-10-18 15:11:44

标签: itextsharp

我们有大量的PDF文件,我们正在创建一个网站,允许用户下载它们,以及我们想要的时间:

  1. 用它们的名字加上水印。
  2. 我们希望表单字段保持打开状态,以便他们输入信息。
  3. 我们希望能够打印并保存文档
  4. 当我将水印放在文档上然后打开它时,我收到了来自Adobe的消息:

      

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

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

    1. 删除使用权限:打破上面的#3。
    2. 以附加模式打开它:如果修改它并使用“FormFlattening = false”或true保存它没关系,如果我在表单上放置水印,则字段不再可编辑。
    3. 来自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. 
      

2 个答案:

答案 0 :(得分:1)

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

添加水印不是您允许对数字签名文档执行的操作的一部分。绝对没有办法达到你想要的效果而不会使触发阅读器启用的数字签名失效。

简而言之:你正在尝试做一些不可能完成的事情。您只能通过使用Adobe软件来实现这一点,因为您需要使用Adobe的私钥才能在打破它后“恢复”读取器。

答案 1 :(得分:0)

好建议。

每次重新启动计算机时,A​​dobe都会抱怨需要更新。我想要的最后一件事就是被黑客攻击,这可能在将来无效。

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

仍然坚持