2

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

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

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

问候

4

2 回答 2

3

您使用 aPdfStamper来操作现有的 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构造函数)。在这种情况下,原始加密也将应用于更新的 PDF。bool appendtrue

于 2013-10-24T13:30:57.513 回答
1

Which version of iText are you using?

When a password protected PDF was opened using the owner password and manipulated by PdfStamper, all original password protection was indeed removed. This changed in iText 5.3.5. See the changelog:

Important: we now keep the original owner password when stamping a document.

In other words: with all iText versions prior to 5.3.5, the owner password is lost. Starting with 5.3.5, it should be kept.

于 2013-10-24T13:16:48.490 回答