0

我正在尝试使用以下代码编写一种加密现有pdf并将加密的pdf写入内存流的方法:

    public byte[] ProtectPdfStreamWithPassword(
        string filePath,
        string password)
    {
        using (var outStream = new MemoryStream())
        {
            using (var reader = new PdfReader(filePath))
            {
                using (var stamper = new PdfStamper(reader, outStream))
                {
                    var passwordBytes =
                            Encoding.ASCII.GetBytes(password);

                    stamper.SetEncryption(
                        passwordBytes,
                        passwordBytes,
                        PdfWriter.AllowPrinting,
                        PdfWriter.ENCRYPTION_AES_256);

                    return outStream.ToArray();
                }
            }
        }
    }

我遵循我在网上其他地方看到的相同模式,但我遇到了一个问题,当传递给 PdfReader 的文件大约 8Kb 时,写入的 MemoryStream 只写入了 15 个字节。我在使用 FileStreams 时没有遇到这个问题,但如果可能的话,我更愿意在这里使用 MemoryStreams。任何帮助,将不胜感激。

4

1 回答 1

2

好的,所以对我来说,问题是使用块从 PdfStamper 中返回 MemoryStream 字节。一定有一个隐含的 Flush 没有发生,因为我返回字节太快了。我将我的代码重构为以下内容,它有效:

public byte[] ProtectPdfStreamWithPassword(
            string filePath,
            string password)
        {
            using (var outStream = new MemoryStream())
            {
                using (var reader = new PdfReader(filePath))
                {
                    using (var stamper = new PdfStamper(reader, outStream))
                    {
                        var passwordBytes =
                                Encoding.ASCII.GetBytes(password);

                        stamper.SetEncryption(
                            passwordBytes,
                            passwordBytes,
                            PdfWriter.AllowPrinting,
                            PdfWriter.ENCRYPTION_AES_256);
                    }
                }

                return outStream.ToArray();
            }
        }
于 2017-02-07T22:53:12.790 回答