2016-10-21 2 views
-2
    string inputfile = "input file path"; 
        string outfile = "outfile file path"; 

        using (Stream output = new FileStream(outfile, FileMode.Create, FileAccess.Write, FileShare.None)) 
        { 
         PdfReader reader = new PdfReader(inputfile);    
         Dictionary<string, string> newInfo = new Dictionary<string, string>(); 
         newInfo.Add("Title", "Title"); 
         newInfo.Add("Subject", "Subject"); 
         newInfo.Add("Keywords", "Keywords"); 
         newInfo.Add("Creator", "Creator"); 
         newInfo.Add("Author", "Author"); 
         newInfo.Add("CustomInfo", "CustomeInformationCanStoreHere");       
         PdfEncryptor.Encrypt(reader,output,true,"*****","*****",PdfWriter.DO_NOT_ENCRYPT_METADATA, newInfo); 
        } 

I PDF-Datei über Code (Passwort und als PdfWriter.DO_NOT_ENCRYPT_METADATA gesetzt Option) unter Verwendung von verschlüsseltenIch verwende iText für pdf erstellen und Verschlüsselung

Als Option schlägt vor (DO_NOT_ENCRYPT_METADATA) Ich möchte nicht Metadaten verschlüsselt werden , aber es verschlüsselt immer noch Metadaten wie Titel, Betreff, Auther, Schlüsselwörter info ..

Fehlt in obigem Code etwas.

public void manipulatePdf(string source, string destination) { 
     PdfReader reader = new PdfReader(source); 
     Stream output = new FileStream(destination, FileMode.Create, FileAccess.Write, FileShare.None); 
     PdfStamper stamper = new PdfStamper(reader, output); 

     Dictionary<string, string> newInfo = new Dictionary<string, string>(); 
     newInfo.Add("Title", "Title"); 
     newInfo.Add("Subject", "Subject"); 
     newInfo.Add("Keywords", "Keywords"); 
     newInfo.Add("Creator", "Creator"); 
     newInfo.Add("Author", "Author"); 
     newInfo.Add("CustomInfo", "CustomeInformationCanStoreHere"); 

     stamper.MoreInfo = newInfo;    

     MemoryStream outStream = new MemoryStream(); 
     XmpWriter xmpw = new XmpWriter(outStream,newInfo);    
     stamper.XmpMetadata = outStream.ToArray();    
     byte[] password = Encoding.ASCII.GetBytes("password");    
     stamper.SetEncryption(password, password, PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA); 

     xmpw.Close(); 
     stamper.Close(); 
     reader.Close(); 
    } 

Antwort

0

Ihre Interpretation von DO_NOT_ENCRYPT_METADATA ist falsch. Sie denken, dass diese Einstellung das Info-Wörterbuch nicht verschlüsselt. Darum geht es in dieser Einstellung nicht. Diese Einstellung bezieht sich auf den XMP-Stream. XMP steht für die XML Metadata Platform und es sind Metadaten, die als XML-Stream in einer PDF (oder in anderen Dateien wie Bildern) gespeichert werden. Wenn ich mir Ihren Code anschaue, sehe ich, dass Sie keinen XMP-Stream erstellen. Siehe das ChangeMetadata Beispiel.

Darüber hinaus sollten Sie wissen, dass nicht jede Art von Verschlüsselung DO_NOT_ENCRYPT_METADATA unterstützt. Zum Beispiel sollte die 40-Bit-Standardverschlüsselung diese Einstellung ignorieren (aber ich sehe, dass Sie 128-Bit-Standardverschlüsselung verwenden, so dass es in Ordnung sein sollte).

+0

Bruno Vielen Dank diese Eingabe Ich habe Codeänderungen basierend auf Ihrem Vorschlag gemacht und in Frage aktualisiert, mein Problem ist, dass ich XMP-Daten lesen muss –

+0

Jetzt muss ich XMP-Daten von PDF lesen, aber ich möchte kein Passwort geben zum Lesen von XMP-Daten. –

Verwandte Themen