0

ディスクに 498kb の PDF があります。これを、デバッガーで表示するとサイズが 508978 と報告される MemoryStream に読み込んでいます。次に、リーダーとスタンパーを使用すると、出力 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

コード スニペットが不完全なため、質問に答えるのが難しくなっています。

あなたは人々にあなたの質問を推測させます。

最初の推測:

10KBのPDFがあって、で読むとPdfReaderいきなり100KB使います。あなたは驚いています。どうすればいいの?

答えは簡単です。10 KB の PDF は圧縮されています。で作業を開始するPdfReaderと、オブジェクトが作成され (メモリが必要)、データが解凍されます (より多くのメモリが必要です)。

2番目の推測:

オブジェクトがPdfReaderあり、それを使用してオブジェクトを作成しPdfStamperます。スタンパーの閉め忘れ。突然、非常に小さなファイルが表示され、PDF ビューアーが次のように表示します。これは実際の PDF ではありません。どうして?

ドキュメントを読まない多くの人が犯す間違いを犯しました。操作しているファイルはPdfStamper、スタンパーを閉じるまで完全には書き込まれません。

3 番目の推測:

オブジェクトがPdfReaderあり、それを使用してオブジェクトを作成しPdfStamperます。スタンパーは何もせず、ただ閉じるだけです。結果として得られる PDF のサイズが、元の PDF とは異なることに驚きました。

  • サイズが小さい: iText は未使用のオブジェクトを破棄することがあり、さまざまな方法でオブジェクトを並べ替えます。これは、PDF ライブラリでは一般的です。
  • サイズが大きくなります: 何も追加しなくても、元のドキュメントが完全に圧縮されている場合 (PDF 1.5 以上) など、ファイル サイズが大きくなる可能性があります。デフォルトでPdfStamperは、圧縮された xref-stream は作成されません (PdfStamper に xref を圧縮するように指示しない限り)。

これらの回答のいずれにも当てはまらない場合は、質問を言い換えることをお勧めします。そうでない場合は、モデレーターがそれを閉じるリスクがあります。

于 2013-02-21T16:06:28.893 に答える