Itextsharp打开密码保护文件修改它并采用保护

时间:2013-10-24 11:48:09

标签: c# pdf itextsharp

我打开现有的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) {
            ....
        }
    }

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

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

此致

2 个答案:

答案 0 :(得分:3)

您使用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。

答案 1 :(得分:1)

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

当使用owner密码打开受密码保护的PDF并由PdfStamper操纵时,所有原始密码保护确实已被删除。这在iText 5.3.5中有所改变。请参阅changelog

  

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

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