0

一連の PDF を 1 つの PDF に結合し、外部メタデータを使用して適切に目次を作成する pyPdf アプリケーションがあります。一部のPDFでは非常にうまく機能しますが、他のPDFではハングしているように見え、実際にPDFを書き込むことはありません。書き込み操作をテスト ライブラリにコピーして、ハングしている場所を確認しました。メソッド '_sweepIndirectReferences' でハングしているようです (ここでは 311 行目)。実行を設定し、15 ~ 20 分後に戻ってブレークポイントを設定し、最初のページの間接参照をまだ解決していることを確認します。スタックの深さは 25 ~ 30 です。Acrobat を使用してファイルを結合すると、200 以上のページすべてが 1 分以内に完了します。

書き込み操作をそれほど高速にする必要はありませんが、プロセスを高速化するためにできることはありますか? Adobe なら 1 分以内にできることのように思えますが、私は 4 時間以内にできるはずです! 一部のファイルでのみ発生し、他のファイルでは発生しないことに注意してください。私の推測では、PDF が間接参照にどれだけ依存しているかによって、違いが生じると思います。

参考までに、次のようなpdfを生成しています。

opened_pdfs = []
o_pdf = PdfFileWriter()

for fname in list_of_pdfs:
    i_pdf = PdfFileReader(file(fname, 'rb'))
    opened_pdfs.append(i_pdf)

    for page in i_pdf.pages:
        o_pdf.addPage(page)

of = open(file_name, 'wb')
o_pdf.write(of)
of.close()

for pdf in opened_pdfs:
    pdfs.stream.close()

これはブックマークに関する部分を無視していますが、おそらく問題ないと思います。問題のあるものには、ブックマークも何もありません。

4

1 に答える 1

3

答えはありませんが、回避策があるかもしれません。ジョブをセグメントに分割してから、セグメントを結合します。それは私が抱えている問題(あなたと同じかもしれない)のために働きました、私はそれを見つけるのに十分にそれをデバッグしませんでした。また、pypdfのスーパーセットであると主張するPyPDF2を見て、スタックしていると思われるコードのビットが変更されているかどうかを確認することもできます。

私はpypdfを使用して、回想録の各ページを別々のファイルに入れた親愛なる八重奏者によって作成された約160の単一ページpdfをつなぎ合わせるための1回限りのスクリプトを作成しました。

回想録は約50%の写真で、PDFのファイルサイズは73kBから2.5MBの範囲です。pypdfコードの核心は、ドキュメントからほとんどまっすぐです。

for pdf_in in pdf_list:
    try:
        pdf = PdfFileReader(file(pdf_in, "rb"))
    except IOError:
        print "skipping ", pdf_in
        continue
    num_pages = pdf.getNumPages()
    if list_only:
        print pdf_in, ':', num_pages
    else:
        for i in range(num_pages):
            output.addPage(pdf.getPage(i))
        output.write(outputStream)
    total_pages += num_pages

ファイルがわずかに少なくなったとき、スクリプトを正常に実行しましたが、数時間かかる場合があります。5GBのPDFを作成しました!

今週末、私はいくつかのファイルを更新し(作成者の修正)、それを再実行しようとしました。偶然にも(?)私のmacbookproがフリーズし、再起動した後、2.9GBのPDFが不完全でした。

そこで、このコードを追加して、一度にseglen=35ファイルで実行しました。

if seglen:
    segments = len(pdf_list) / seglen + 1
    seglist = []
    for i in range(segments):
        outfile = kwargs['output_file'] + str(i)
        seglist.append(outfile + '.pdf')
        merge_files_in_order(pdf_list[i*seglen:(i+1)*seglen], kwargs['list_only'], outfile)
    # now stich the segments together
    merge_files_in_order(seglist, kwargs['list_only'], kwargs['output_file'])
else:
    merge_files_in_order(pdf_list, kwargs['list_only'], kwargs['output_file'])

これははるかに短い時間で実行され、不思議なことに、不完全な2.9GBファイル(または1か月ほど前に作成したような5GBファイル)ではなく、完全な288MBファイルが生成されました。

また楽しい:私は「セグメント」ファイルをクリーンアップしないので、それらも見ることができます。サイズの範囲は195MBから416MBですが、最終的に5つのファイルすべてを組み合わせると、結果のファイルは完全で288MBになります。私は非常に満足している。

于 2012-11-25T00:23:53.547 に答える