0

私はいくつかのpdf(1000以上)を取り、それらを単一のpdfにマージするプログラムを持っています。

プログラムは完璧に動作しますが、スプール エラーが発生しました。

マージされた pdf を Acrobat で開いて印刷すると、n ページの単一スプールをプリンターに送信する代わりに、元の pdf の数と同じ数のスプールが送信され、プリンターの処理が非常に遅くなります。

これはクラスの要約です

Document document = new Document ( iTextSharp.text.PageSize.A4 );
PdfWriter writer = PdfWriter.GetInstance ( document, new FileStream ( outputFilename, FileMode.Create ) );
writer.SetFullCompression();            
document.Open();
PdfContentByte cb = writer.DirectContent;

foreach( var file in files ) {
PdfReader reader = new PdfReader ( file );
int n = reader.NumberOfPages;
int i = 0;
while ( i < n) 
{
    i++;
    document.SetPageSize ( reader.GetPageSizeWithRotation ( i ) );                
    document.NewPage();
    page = writer.GetImportedPage ( reader, i );
    rotation = reader.GetPageRotation ( i );        
    cb.AddTemplate ( page, 1f, 0, 0, 1f, 0, 0 );
}
}

document.Close();
4

1 に答える 1

1

iText in Action - Second Edition の第 6 章をダウンロードしてください。PDF を連結するために間違ったクラスを使用していることがわかります。これを何度も繰り返しましたが、 PDF を連結するPdfWriter代わりに使用した理由を知りたいです。Pdf(Smart)Copyサイトのどこかでそのコード サンプルを見つけましたか? もしそうなら、そのページの作者を一緒にたたくことができるように私に知らせてください!

コード サンプルを使用すると、ページが XObject としてインポートされます。これにより、ネストのレベルに制限があるため、問題を引き起こす可能性のあるネストのレベルが追加されます。また、 にページを次々と追加する場合PdfWriter、PDF に冗長な情報が含まれすぎて、ファイルが肥大化する可能性があります。を使用することで回避できますPdfSmartCopy

最後に (本にはないもの):オブジェクトFreeReader()からすべてのページをコピーした後で、このメソッドを使用する必要がありPdfReaderます。これにより、コードが大幅に高速化され、必要なメモリが削減されます。

上記のどれも、異なるスプールがプリンターに送信される理由を説明していませんが、最初にコードの明らかな欠陥から始めて、そこから取り上げましょう。

于 2012-12-04T10:31:36.957 に答える