2010-02-02 75 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
​​