iTextSharp + FileStream =损坏的PDF文件

我正在尝试使用iTextSharp创建一个pdf文件。 我的尝试将pdf的内容写入MemoryStream,因此我可以将结果写入文件和数据库BLOB。 文件被创建,大小约为21kB,当使用Notepad ++打开时,它看起来像一个pdf。 但是我的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(); 

我犯的错误在哪里?

谢谢你,诺伯特

我认为您的问题是您没有正确地向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); } } 

我有类似的问题。 我的文件被下载但文件大小为13Bytes。 当我使用二进制编写器来编写文件时,我解决了这个问题

 byte[] bytes = new byte[0]; //pass in your API response into the bytes initialized using (StreamWriter streamWriter = new StreamWriter(FilePath, true)) { BinaryWriter binaryWriter = new BinaryWriter(streamWriter.BaseStream); binaryWriter.Write(bytes); } 

只是一些想法 – 如果用文件流替换内存流会发生什么? 这能否为您提供所需的结果? 这至少可以告诉你问题出在哪里。

如果这确实有效,文件如何不同(大小和二进制表示)?

只是一个猜测,但你有没有尝试在写入之前寻找内存流的开头?

 myMemoryStream.Seek(0, SeekOrigin.Begin); 

尝试仔细检查使用iText操作PDF的代码。 确保您正在调用任何PdfContentByte对象的相应EndText方法,并确保在将文件写入磁盘之前调用myDocument.Close()。 这些是我在过去使用iTextSharp生成PDF时遇到的问题。

 documentobject.Close(); using (FileStream fs = System.IO.File.Create(path)){ Memorystreamobject.WriteTo(fs); }