2012-12-07 44 views
1

我有我的應用程序一個問題,即從磁盤讀取PDF,然後有把它寫回不同稍後的位置。閱讀PDF轉換爲字符串或字節[]和寫入字符串/字節[]回磁盤

發出的文件不再是有效的PDF了。

在非常簡化的形式,我試圖讀/使用

var bytes = File.ReadAllBytes(@"c:\myfile.pdf"); 
File.WriteAllBytes(@"c:\output.pdf", bytes); 

var input = new StreamReader(@"c:\myfile.pdf").ReadToEnd(); 
File.WriteAllText("c:\output.pdf", input); 

...與約100置換上述的與正被指定的各種編碼寫它。沒有一個輸出文件是有效的PDF文件。

有人可以伸出援手嗎?非常感謝!! 。

+1

'File.Copy' not working? – Oded

+0

http://stackoverflow.com/questions/230128/best-way-to-copy-between-two-stream-instances – sehe

+2

您發佈的第一個代碼片段將會工作。您的輸入PDF必須以不正確開頭。 – usr

回答

3

在C#/。NET 4.0:

using (var i = new FileStream(@"input.pdf", FileMode.Open, FileAccess.Read)) 
    using (var o = File.Create(@"output.pdf")) 
     i.CopyTo(o); 

如果上具有byte[]第一堅持

using (var i = new FileStream(@"input.pdf", FileMode.Open, FileAccess.Read)) 
    using (var ms = new MemoryStream()) 
    { 
     i.CopyTo(ms); 
     byte[] rawdata = ms.GetBuffer(); 

     using (var o = File.Create(@"output.pdf")) 
      ms.CopyTo(o); 
    } 

內存流可能需要ms.Seek(0, SeekOrigin.Origin)或類似,之前的東西第二個CopyTo。看看它,或者嘗試一下

+0

@usr取決於使用。如果instream將成爲網絡流,這有點... _impossibru_。可能這是關於OP正在嘗試做什麼,否則File.Copy顯然是贏家 – sehe

+0

好的,我同意任意流的情況。 – usr

+1

儘管我認爲@JayRiggs答案在技術上是「正確的答案」,但考慮到問題的措辭,這是一個「更好的」答案,因爲它比將整個文件讀入字節數組並將其反彈出來要有效得多。 – JerKimball

3

您使用File.WriteAllText來寫你的文件了。

嘗試File.WriteAllBytes

+0

這。你需要匹配讀/寫「類型」 - 讀取字節和書寫爲文本不會工作。 – JerKimball

+0

我相信我的每個代碼示例都是這樣做的。第一個示例使用字節[],第二個示例使用字符串。我錯過了什麼嗎? – TimH