2012-03-30 191 views
2

以下是我的代碼我正在生成ItextSharp的密碼保護pdf。我怎樣才能生成一個PDF

其實兩個pdf正在生成和保存。

但我只想要保存文件。

如果我使用相同的輸入和輸出我收到錯誤。

真心感謝您的幫助。

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

難道你只是在輸出文件完成後才刪除臨時輸入文件'Testing1.pdf'? – 2012-03-30 12:58:02

+1

我花了更多的時間格式化/修復你的問題,而不是我通常會花費的時間來回答問題。在SO – sehe 2012-03-30 13:14:24

回答

0

無需實例化一個單獨的流中讀取要加密的PDF。使用PdfReader overloaded constructor that accepts a file path。類似這樣的:

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

上需要一些努力來解決這個問題,這是事實,但他仍然以第二個他想避免的文件結束。 – 2012-03-30 19:24:08

+0

?!?!? 'InputFile'對我來說意味着**現有的**文件,即使代碼段使用'FileMode.Create'。關於這個問題的第二個評論提到了代碼片段被其他人大量修改過,所以任何人都猜測OP是否使用現有的PDF **或者**是從頭開始創建PDF。而且你應該知道**既不** **臨時文件**也** ** MemoryStream'對**任何情況都是必要的...... – kuujinbo 2012-03-30 20:08:25

+0

大家好,我真的很感謝你的建議。以上所有評論對我來說都很好。現在問題是它的直接保存到MyDocuments。我正在使用MVC3,我希望用戶通過打開與密碼保護對話來保存到自己的路徑。可以幫助我解決這個問題。 – 2012-03-31 09:51:04

3

考慮使用一個MemoryStream

未經測試的代碼(寫在瀏覽器:)

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