【问题标题】:Itextsharp open password protected file modify it and adopt protectionItextsharp 打开受密码保护的文件对其进行修改并采用保护
【发布时间】:2013-10-24 11:48:08
【问题描述】:

我打开一个现有的 pdf。检查保护并询问密码是否受保护并打开它:

        PdfReader pdfReader = null;
        Stream outputStream = null;
        PdfStamper pdfStamper = null;

        try
        {
            pdfReader = GetPdfReaderObject();
            outputStream = new FileStream(filePathDestination, FileMode.Create, FileAccess.Write, FileShare.None);
            pdfStamper = new PdfStamper(pdfReader, outputStream);

                PdfLayer layer = new PdfLayer("watermark", pdfStamper.Writer);

                for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) {
                    pdfStamper.FormFlattening = false;
                    iTextSharp.text.Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex);
                    PdfContentByte pdfData = pdfStamper.GetOverContent(pageIndex);

                    pdfData.BeginLayer(layer);

                    PdfGState graphicsState = new PdfGState();
                    graphicsState.FillOpacity = 0.5F;
                    pdfData.SetGState(graphicsState);
                    pdfData.BeginText();

                    iTextSharp.text.Image watermarkImage = iTextSharp.text.Image.GetInstance(System.Drawing.Image.FromFile(watermarkImagePath), ImageFormat.Png);

                    float width = pageRectangle.Width;
                    float height = pageRectangle.Height;

                    watermarkImage.SetAbsolutePosition(width / 2 - watermarkImage.Width / 2, height / 2 - watermarkImage.Height / 2);

                    pdfData.AddImage(watermarkImage);
                    pdfData.EndText();
                    pdfData.EndLayer();
                }
            }
            pdfStamper.Close();
            outputStream.Close();
            outputStream.Dispose();
            pdfReader.Close();
            pdfReader.Dispose();

        } catch (Exception e) {
            ....
        }
    }

修改后我保存了它,但保护被破坏了。

为什么保护被破坏了? 如何保存原始文档的保护并将其添加到我修改过的文档中。

问候

【问题讨论】:

  • 请提供更多代码。您没有展示修改 PDF 的方式。你用PdfStamper吗?还是PdfCopy?还是PdfWriter?以及如何?

标签: c# pdf itextsharp


【解决方案1】:

您使用PdfStamper 来操作现有的 PDF。

对于任何源 PDF:如果您希望对结果进行加密,您可以适当地使用SetEncryption 方法。

看看EncryptionPdf.cs,尤其是它的方法EncryptPdf

PdfReader reader = ...;
using (MemoryStream ms = new MemoryStream())
{
    using (PdfStamper stamper = new PdfStamper(reader, ms))
    {
        stamper.SetEncryption(
                USER, OWNER, 
                PdfWriter.ALLOW_PRINTING, 
                PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA
        );
    }
    return ms.ToArray();
}

这里USEROWNER 是您选择的用户和所有者密码。您可能想要使用一组不同的权限。

对于已加密的源 PDF,您也可以选择在附加模式下使用 PdfStamper(即使用 PdfStamper 构造函数并将 bool append 参数设置为 true)。在这种情况下,原始加密也将应用于更新的 PDF。

【讨论】:

  • 使用附加标志,保护/加密在修改后也起作用。但是,如果我使用 Acrobat Reader 打开 pdf,它会告诉我:“此页面存在错误。Acrobat 可能无法正确显示该页面。请联系创建 PDF 文档的人员以更正问题”。我还需要加密我新添加的图像吗?是什么问题?在没有加密的文档上,它可以正常工作。
  • @GermanSniper 你能提供一个样本,包括操作前后的样本吗?
  • 稍后我会提供一些示例文件。但是又出现了一个问题:如果我添加标签 append 我不能从 pdf 中删除内容。如何保存加密、删除和添加内容?慢慢的我要疯了……
  • 使用附加模式的替代方法是使用 unethical 模式,参见。 @Bruno 回答下的讨论。只需将静态 bool PdfReader.unethicalreading 设置为 true 并使用您的 PdfStamper 而不使用附加模式。
  • 这里有两个错误的示例文件。我希望你能在这些方面帮助我。 Sample pdf with error
【解决方案2】:

您使用的是哪个版本的 iText?

当使用owner 密码打开受密码保护的 PDF 并由PdfStamper 操作时,所有原始密码保护确实被删除了。这在 iText 5.3.5 中发生了变化。见changelog

重要提示:我们现在在为文档盖章时保留原始所有者密码。

换句话说:对于 5.3.5 之前的所有 iText 版本,所有者密码都会丢失。从 5.3.5 开始,应该保留它。

【讨论】:

  • 我使用的是 5.4.3 版本。这不可能是问题
  • 我们现在在给文档盖章时保留原始所有者密码 - 总是?我在PdfStamperImp 代码中找到了一个if (reader.isEncrypted() &amp;&amp; (append || PdfReader.unethicalreading)) { crypto = new PdfEncryption(reader.getDecrypt()); },它看起来只保留在附加或不道德模式下......
  • 嗯...我写了那个代码。既然你让我想起了不道德的模式,我记得:如果你知道所有者密码,你可能应该用stamper.setEncryption()设置密码。如果我们自动重用现有密码,则无法将文档解密为未加密的 PDF(这也是一个用例)。我对你的回答投了赞成票(我也对这个问题投了赞成票,因为这是一个很好的问题)。
  • 如果我没记错的话,添加isEncrypted 以外的条件的签入注释是这使得使用压模解密变得不可能。 ;)
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2021-10-08
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多