首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PdfStamper改变MemoryStream的大小

PdfStamper改变MemoryStream的大小
EN

Stack Overflow用户
提问于 2013-02-21 15:47:46
回答 1查看 2.7K关注 0票数 0

磁盘上有一个PDF格式,大小为498 is。我正在将它读入一个MemoryStream中,它在调试器中查看时报告大小为508978。然后使用读取器和邮票,输出MemoryStream的大小为15。当流被输出到磁盘时,PDF是不可读的。

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2013-02-21 16:06:28

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

你让人们猜测你的问题。

第一猜测:

您有一个10 KB的PDF,当用PdfReader读取它时,您突然使用了100 KB。你很惊讶。这怎么可能呢?

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

第二猜:

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

你犯了许多不看文档的人犯的错误。在关闭盖印器之前,您使用PdfStamper操作的文件不会被完全写入。

第三猜:

您有一个PdfReader对象,并使用它创建一个PdfStamper对象。你不能用盖章做任何事,你只要关闭它。您感到惊讶的是,生成的PDF与原来的PDF大小不同。

  • 大小更小: iText有时丢弃未使用的对象,并以不同的方式重新排序对象。这对于PDF库来说是典型的。
  • 大小更大:即使您没有添加任何内容,文件大小也会增加,例如,当原始文档完全压缩时(PDF1.5及更高版本)。默认情况下,PdfStamper不会创建一个压缩的xref流(除非您指示PdfStamper压缩xref)。

如果这些答案都不适用,我建议你重新表述你的问题。否则,您将面临版主关闭它的风险。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15006439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档