iTextsharp用长密码保护PDF文件

时间:2017-09-15 09:41:29

标签: c# pdf itext

我正在使用以下代码来保护使用iTextsharp库的PDF文件。

public Boolean ProtectPDF(String sourceFile, String newFile, String UserPassword, String OwnerPassword)
    {
        try
        {
            byte[] USER = System.Text.Encoding.ASCII.GetBytes(UserPassword);
            byte[] OWNER = System.Text.Encoding.ASCII.GetBytes(OwnerPassword);
            PdfReader reader = new PdfReader(sourceFile);
            PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create));
            stamper.SetEncryption(USER, OWNER, PdfWriter.AllowPrinting, PdfWriter.ENCRYPTION_AES_128);
            stamper.Close();
            reader.Close();

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

适用于“短”密码,例如 1234567890ABCDE = GHIJ12

如果我尝试使用“长”密码,例如 2017DgFLcnODOy8 = 7D- + 0 | Fk / 2?g- = 02d ^ xz-d3s @ 2 | WiuXjQJoRBU = ,我发现只有前32个字符被识别为密码,似乎我输入的字符无关紧要,但PDF文件仍然会打开。

PDF或ITextsharp库是否有任何限制,或问题是否存在于代码中?

请告知,谢谢。

1 个答案:

答案 0 :(得分:1)

这是PDF规范固有的限制,而不是iText的限制。

这是ISO 32000-1的相关部分。它谈到了一个32字节的字符串。

enter image description here

ISO 32000-1是生成PDF 1.7文件时的规范。由于您仍然提到iTextSharp(而不是iText for .NET),我假设您使用的是旧的iText版本。

几个月前,ISO 32000-2发布,即PDF 2.0。 iText 7.1将支持PDF 2.0。 PDF 2.0中将提供更长的密码(最多48个字节)。

如果您使用的密码长于规范中允许的密码,iText将忽略所有额外字节。