PdfStamper改变了MemoryStream的大小

时间:2013-02-21 15:47:46

标签: c# .net itextsharp memorystream

在磁盘上有一个498kb的PDF。我正在读这个MemoryStream,它在调试器中查看时报告大小为508978。然后使用阅读器和压模,输出MemoryStream的大小为15.当流输出到磁盘时,PDF是不可读的。

MemoryStream inputStream = new MemoryStream();
MemoryStream outputStream = new MemoryStream();

FileStream fs = File.OpenRead(@"e:\O1.pdf");           
inputStream.SetLength(fs.Length);
fs.Read(inputStream.GetBuffer(), 0, (int)fs.Length);
inputStream.Seek(0, SeekOrigin.Begin);


PdfReader reader = new PdfReader(inputStream);
PdfStamper stamper = new PdfStamper(reader, outputStream);
stamper.Writer.CloseStream = false;


AcroFields fields = reader.AcroFields;
foreach (String key in fields.Fields.Keys)
{
if (String.Equals(key, @"ReportID")) { stamper.AcroFields.SetField(@"ReportID", "Fred Bloggs");   }
}

stamper.Close();
Byte[] bytes = (Byte[])outputStream.ToArray();
File.WriteAllBytes(@"e:\O2.pdf", bytes);

1 个答案:

答案 0 :(得分:2)

您的代码段不完整,因此很难回答您的问题。

你让人们猜出你的问题。

首先猜测:

你有10 KB的PDF,当用PdfReader阅读时,你突然使用100 KB。你很惊讶怎么会这样?

答案很简单:压缩了10 KB的PDF。当PdfReader开始使用它时,它会创建对象(需要内存)并解压缩数据(需要更多内存)。

第二次猜测:

您有一个PdfReader对象,您可以使用它来创建PdfStamper对象。你忘记关闭压模了。突然间,您有一个非常小的文件,PDF查看器告诉您:这不是真正的PDF。怎么样?

许多不阅读文档的人犯了错误。在关闭压模之前,您使用PdfStamper操作的文件并未完全写入。

第三次猜测:

您有一个PdfReader对象,您可以使用它来创建PdfStamper对象。你没有对压模做任何事情,只需关闭它。您会惊讶于生成的PDF与原始PDF的大小不同。

  • 尺寸较小:iText有时会抛弃未使用的物体,并以不同的方式重新排列物体。这是PDF库的典型特征。
  • 大小更大:即使您没有添加任何内容,文件大小也会增加,例如原始文档完全压缩时(PDF 1.5及更高版本)。默认情况下,PdfStamper不会创建压缩的外部参照流(除非您指示PdfStamper压缩外部参照)。

如果这些答案都不适用,我建议您重新提出问题。如果没有,你可能会被主持人关闭它。