2012-03-30 4 views
2

Unten ist mein Code Ich erstelle Passwortgeschützte pdf von ItextSharp.Wie kann ich nur ein einzelnes PDF erzeugen

Tatsächlich werden zwei PDFs generiert und gespeichert.

Aber ich möchte nur Datei gespeichert werden.

Wenn ich dieselbe für die Eingabe und Ausgabe verwende, erhalte ich einen Fehler.

Ihre Hilfe wirklich schätzen.

Letter1 mydoc = new Letter1(); 
mydoc.GenerateLetter(); 
string WorkingFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
string InputFile = Path.Combine(WorkingFolder, "Testing1.pdf"); 
FileStream f = new FileStream(InputFile, FileMode.Create); 
f.Write(mydoc.DocumentBytes, 0, mydoc.DocumentBytes.Length); 
f.Close(); 
string OutputFile = Path.Combine(WorkingFolder, "TestingOut1.pdf"); 
using (Stream input = new FileStream(InputFile, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read)) 
{ 
    using (Stream output = new FileStream(OutputFile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     PdfReader reader = new PdfReader(input); 
     PdfEncryptor.Encrypt(reader, output, true, "abc123", "secret", PdfWriter.ALLOW_SCREENREADERS); 
    } 
} 
+0

Konnte man nicht einfach die temporäre Eingabedatei 'Testing1.pdf' löschen, sobald die Ausgabedatei fertig ist? –

+1

Ich verbrachte mehr Zeit mit dem Formatieren/Reparieren Ihrer Frage, als ich normalerweise eine Frage beantworten würde. Etwas Mühe in die Frage zu stecken ist etwas erforderlich auf SO – sehe

Antwort

0

Keine Notwendigkeit, einen separaten Strom instanziiert die PDF Sie verschlüsseln möchten zu lesen. Verwenden Sie die PdfReader overloaded constructor that accepts a file path. Etwas wie dieses:

PdfReader reader = new PdfReader(InputFile); 
using (Stream output = new FileStream(
    OutputFile, FileMode.Create, FileAccess.Write, FileShare.None 
)) 
{ 
    PdfEncryptor.Encrypt(
    reader, output, true, "abc123", "secret", PdfWriter.ALLOW_SCREENREADERS 
);  
} 
+0

Das stimmt, aber er endet immer noch mit einer zweiten Datei, die er vermeiden will. –

+0

?!?!? 'InputFile' bedeutet für mich ** existierende ** Datei, obwohl das Code-Snippet' FileMode.Create' verwendet. Der zweite Kommentar zu der Frage erwähnt, dass das Code-Snippet stark von jemand anderem modifiziert wurde. Es kann also niemand raten, ob das OP ein vorhandenes PDF verwendet oder ob ** das PDF von Grund auf neu erstellt wird. Und Sie _sollte wissen, dass ** weder ** eine temporäre Datei ** noch ** ein 'MemoryStream' für ** entweder ** Fall notwendig ist ... – kuujinbo

+0

Hallo allerseits, ich schätze Ihre Vorschläge sehr. Alle obigen Kommentare funktionieren gut für mich. Jetzt wird das Problem direkt in MyDocuments gespeichert. Ich benutze MVC3 und ich möchte Benutzer zu seinem eigenen Pfad speichern, indem er einen Dialog mit Password Potected öffnet. Bitte helfen Sie mir dabei. –

3

Betrachten wir ein Memory

Ungeprüfte Code (geschrieben in Browser :)

using (MemoryStream m = new MemoryStream()) 
{ 
    m.Write(mydoc.DocumentBytes, 0, mydoc.DocumentBytes.Length); 
    m.Seek(0, SeekOrigin.Origin); 

    string OutputFile = Path.Combine(WorkingFolder, "TestingOut1.pdf"); 
    using (Stream output = new FileStream(OutputFile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     PdfReader reader = new PdfReader(m); 
     PdfEncryptor.Encrypt(reader, output, true, "abc123", "secret", PdfWriter.ALLOW_SCREENREADERS); 
    } 
}