MemoryStream 看起来像是使用 iTextSharp 损坏了文件

Posted

技术标签:

【中文标题】MemoryStream 看起来像是使用 iTextSharp 损坏了文件【英文标题】:MemoryStream looks like corrupt the file using iTextSharp 【发布时间】:2013-11-06 06:41:03 【问题描述】:

我有两个代码:

string fileInput = @"c:\temp\input.pdf";
string fileOutput = @"c:\temp\saida.pdf";

PdfReader reader = new PdfReader(fileInput);

Stream output = new System.IO.FileStream(fileOutput, System.IO.FileMode.Create);

Document doc = new Document();
PdfCopy writer = new PdfCopy(doc, output);

doc.Open();
PdfImportedPage pagina = writer.GetImportedPage(reader, 23);
writer.AddPage(pagina);

doc.Close();

output.Close();

效果很好!该文件有 46.451 字节

但我需要使用内存而不是文件。所以我尝试了下一个代码:

string fileInput = @"c:\temp\input.pdf";
string fileOutput = @"c:\temp\saida.pdf";

PdfReader reader = new PdfReader(fileInput);

//Stream output = new System.IO.FileStream(fileOutput, System.IO.FileMode.Create);
MemoryStream output = new MemoryStream();

Document doc = new Document();
PdfCopy writer = new PdfCopy(doc, output);

doc.Open();
PdfImportedPage pagina = writer.GetImportedPage(reader, 23);
writer.AddPage(pagina);

//Added line. Just to compare...
output.WriteTo(new FileStream(fileOutput, FileMode.Create, System.IO.FileAccess.Write));

doc.Close();

output.Close();

该文件有 45.582 字节。 Acrobat Reader 告诉我文件已损坏。我做错了什么?

谢谢!

【问题讨论】:

【参考方案1】:

在你这样做的时候

output.WriteTo(new FileStream(fileOutput, FileMode.Create, System.IO.FileAccess.Write));

结果 PDF 尚未完成。因此,显然 Acrobat Reader 会抱怨。

要将完成的 PDF 放入内存流中,您必须等到之后

doc.Close();

默认情况下,这会隐式关闭您可能不需要的输出流。因此,您可能还想在之前将 SetCloseStream(false) 应用于 PdfCopy。

【讨论】:

以上是关于MemoryStream 看起来像是使用 iTextSharp 损坏了文件的主要内容,如果未能解决你的问题,请参考以下文章

优势/劣势 MemoryStream.Position 或 MemoryStream.Seek [重复]

使用 MemoryStream 和 CryptoStream 满足代码分析处置规则 [重复]

使用 NAudio 读取包含作品音频的 MemoryStream

使用 StreamWriter 写入 MemoryStream 返回空

MemoryStream相关知识分享

.NET性能优化-使用RecyclableMemoryStream替代MemoryStream