iTextSharp + FileStream = PDF文件损坏

10

我正在尝试使用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();

我犯了什么错误?

谢谢, Norbert


你需要那个MemoryStream吗?在写入到FileStream之前,你关闭了myDocument吗? - Rubens Farias
5个回答

31
我认为你的问题在于没有正确地向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);
    }
}

5
我遇到了类似的问题。虽然文件开始下载了,但是文件大小只有13字节。我解决了这个问题,当我使用二进制编写器来编写我的文件时。
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);
}

3
这个答案可以通过解释为什么这样修复了问题以及出错原因来改进。 - Azsgy

0

一些想法 - 如果您将内存流替换为文件流会发生什么?这样做是否可以得到您需要的结果?这至少可以告诉您问题可能出在哪里。

如果这样做有效,那么这些文件有何不同(大小和二进制表示)?

只是猜测,您是否尝试在写入之前将内存流定位到开头?

myMemoryStream.Seek(0, SeekOrigin.Begin);

以下代码也无法正常工作:Document myDocument = new Document(); PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, new FileStream(path, FileMode.Create)); myDocument.Open(); // Content ... myDocument.Close();文件已损坏... :( - Norbert

0

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接