在磁盘上有一个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);
答案 0 :(得分:2)
您的代码段不完整,因此很难回答您的问题。
你让人们猜出你的问题。
首先猜测:
你有10 KB的PDF,当用PdfReader
阅读时,你突然使用100 KB。你很惊讶怎么会这样?
答案很简单:压缩了10 KB的PDF。当PdfReader
开始使用它时,它会创建对象(需要内存)并解压缩数据(需要更多内存)。
第二次猜测:
您有一个PdfReader
对象,您可以使用它来创建PdfStamper
对象。你忘记关闭压模了。突然间,您有一个非常小的文件,PDF查看器告诉您:这不是真正的PDF。怎么样?
许多不阅读文档的人犯了错误。在关闭压模之前,您使用PdfStamper
操作的文件并未完全写入。
第三次猜测:
您有一个PdfReader
对象,您可以使用它来创建PdfStamper
对象。你没有对压模做任何事情,只需关闭它。您会惊讶于生成的PDF与原始PDF的大小不同。
PdfStamper
不会创建压缩的外部参照流(除非您指示PdfStamper压缩外部参照)。如果这些答案都不适用,我建议您重新提出问题。如果没有,你可能会被主持人关闭它。