0

在磁盘上有一个 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);
4

1 回答 1

3

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

你让人们猜测你的问题。

第一个猜测:

你有一个 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 压缩外部参照)。

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

于 2013-02-21T16:06:28.893 回答