iTextSharp + FileStream =损坏的PDF文件

Nor*_*ert 8 c# pdf memorystream filestream itextsharp

我正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)

我犯的错误在哪里?

谢谢你,诺伯特

Jay*_*ggs 29

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


Olu*_*ola 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案可以通过解释为什么这可以解决问题以及错误是什么来改进。 (3认同)