2017-02-07 2 views
0

Я пытаюсь написать метод для шифрования существующих PDF-и выписывая зашифрованный PDF в поток памяти, используя следующий код:iTextSharp PdfStamper последовательно только выписывая 15 байт

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(); 
       } 
      } 
     } 
    } 

Я следующие тот же шаблон, который я видел, используется в другом месте в Интернете, но у меня возникает проблема, когда в MemoryStream, который записывается только когда-либо, записано 15 байт, когда файл, переданный в PdfReader, имеет около 8 КБ. Я не столкнулся с этой проблемой при работе с FileStreams, но я предпочел бы использовать MemoryStreams здесь, если это возможно. Любая помощь будет оценена по достоинству.

ответ

2

Хорошо, поэтому проблема для меня возвращала байты MemoryStream из блока PdfStamper с использованием блока. Должен быть неявный 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(); 
      } 
     } 
+1

Да, это правильно. Вы не закрывали объект «stamper». Предположим, что вы не использовали 'using', вы бы использовали' PdfStamper stamper = новый новый PdfStamper (reader, outStream); 'и затем' stamper.Close(); '* before *, используя метод ToArray() , –

Смежные вопросы