2017-02-07 1 views
0

Ich bin versucht, ein Verfahren zum Verschlüsseln von bestehenden PDF-Dateien zu schreiben und das verschlüsselte PDF zu einem Speicher-Stream auszuzuschreiben, mit dem folgenden Code:iTextSharp PdfStamper konsequent nur 15 Byte auszuschreiben

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

Ich folge das gleiche Muster, das ich an anderer Stelle online gesehen habe, aber ich stoße auf ein Problem, bei dem der MemoryStream, in den geschrieben wird, nur 15 Bytes hat, wenn die Datei an den PdfReader übergeben wurde, hat ungefähr 8Kb. Ich bin bei der Arbeit mit FileStreams nicht auf dieses Problem gestoßen, aber ich würde hier lieber MemoryStreams verwenden. Jede Hilfe wäre willkommen.

Antwort

2

Okay, so das Problem für mich war die Rückgabe der MemoryStream Bytes aus dem PdfStamper mit Block. Es muss einen impliziten Flush geben, der nicht stattfand, weil ich die Bytes zu früh zurückgab. Ich habe meinen Code folgendermaßen umgestaltet, was funktioniert:

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

Ja, das ist richtig. Sie haben das 'Stampfer'-Objekt nicht" geschlossen ". Angenommen, Sie hätten 'using' nicht verwendet, hätten Sie' PdfStamper stamper = new new PdfStamper (reader, outStream); 'und dann' stamper.Close(); '* before * mit der' ToArray() 'Methode verwendet . –

Verwandte Themen