2010-02-02 74 views
8

我想用iTextSharp創建一個pdf文件。我嘗試將pdf的內容寫入MemoryStream,以便將結果寫入文件和數據庫BLOB。該文件被創建,大小約爲21kB,在使用Notepad ++進行操作時,它看起來像一個pdf。但我的PDF閱讀器說它已經被破壞了。 這裏是一個小的代碼段(僅嘗試寫入文件,而不是一個數據庫):iTextSharp + FileStream =損壞的PDF文件

Document myDocument = new Document(); 
MemoryStream myMemoryStream = new MemoryStream(); 
PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream); 
myDocument.Open(); 
// Content of the pdf gets inserted here 
using (FileStream fs = File.Create("D:\\...\\aTestFile.pdf")) 
{ 
    myMemoryStream.WriteTo(fs); 
} 
myMemoryStream.Close(); 

哪裏的錯誤,我做什麼呢?

謝謝 諾伯特

+0

你需要一個MemoryStream的?在寫入FileStream之前是否關閉了myDocument? – 2010-02-02 19:07:26

回答

27

我認爲你的問題是你沒有正確地向你的PDF添加內容。這是通過Document.Add()方法完成的,並通過調用Document.Close()完成。

但是,當您調用Document.Close()時,您的MemoryStream也會關閉,因此您將無法將它寫入FileStream中。你可以通過將你的MemoryStream的內容存儲到一個字節數組來解決這個問題。

下面的代碼片段工作對我來說:

using (MemoryStream myMemoryStream = new MemoryStream()) { 
    Document myDocument = new Document(); 
    PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream); 

    myDocument.Open(); 

    // Add to content to your PDF here... 
    myDocument.Add(new Paragraph("I hope this works for you.")); 

    // We're done adding stuff to our PDF. 
    myDocument.Close(); 

    byte[] content = myMemoryStream.ToArray(); 

    // Write out PDF from memory stream. 
    using (FileStream fs = File.Create("aTestFile.pdf")) { 
     fs.Write(content, 0, (int)content.Length); 
    } 
} 
+1

謝謝,這爲我做 – Norbert 2010-02-02 21:13:25

+0

有同樣的問題,這解決方案工作。謝謝! – 2010-11-05 23:02:16

+0

感謝您爲我工作的解決方案... – ssmsnet 2013-04-30 10:04:45

0

只是一些想法 - 如果你更換一個文件流內存流會發生什麼?這是否給你你需要的結果?這至少會告訴你問題出在哪裏。

如果這確實起作用,文件如何不同(大小和二進制表示形式)?

只是一個猜測,但你有沒有試圖尋求在寫入之前的內存流的開始?

myMemoryStream.Seek(0, SeekOrigin.Begin); 
+0

以下內容也不起作用: 'Document myDocument = new Document(); PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument,new FileStream(path,FileMode.Create)); myDocument.Open(); //內容... myDocument.Close();?!' 損壞的文件... :( – Norbert 2010-02-02 20:50:57

+0

你試過刷新流 – matt 2010-02-02 21:04:47

0

嘗試雙重檢查您的代碼,用iText操縱PDF。確保您正在調用任何PdfContentByte對象的相應EndText方法,並確保在將文件寫入磁盤之前調用myDocument.Close()。這些都是我在使用iTextSharp生成PDF時過去遇到的問題。

0
​​