9

私は Pisa を使用して HTML を PDF に変換しています (Django プロジェクトで)。複数のページにまたがるテーブルを処理すると、非常に遅くなります。

200 行のテーブルは変換に最大 150 秒かかりますが、小さなテーブルに分割すると 15 秒かかります。

Pisa で処理する HTML テーブルを作成するためのヒントやベスト プラクティスはありますか?

4

1 に答える 1

8

私も同じ問題を抱えていました。文書はただの一面と巨大な表でした。PDF のレンダリング時間は、コンテンツ テーブルのサイズに応じて指数関数的に増加していました。

問題の可能性があるチェックリストを作成しました

PDF レンダリング関数で簡単なタイミングをとったところ (HTML レンダリング、StringIO への渡し、または HTTP 応答の作成である可能性があるため)、pisa.pisaDocument 呼び出しが返されるまでに 60 秒かかることに気付きました。問題となる可能性のあるもののチェックリストを作成し、それぞれに取り組みました。チェックリストには、画像、CSS、マークアップの複雑さ、およびフレームが含まれていました。

画像はレンダリング時間にほとんど影響しませんでした (ページごとに 1 つしかなかったので、YMMV)。フレームもそうではありませんでした。

マークアップの複雑さが、私のテンプレートの主な問題でした。どうやら pisa はテーブル内のいくつかの列を非常にゆっくりとレンダリングします

テーブルのレンダリングに時間がかかりすぎていましたが、テーブルを小さなテーブルに分割すると、レンダリング時間が指数関数的に増加しなくなり、すべてをレンダリングするのにかかる時間が半分になることに気付きました。Django テンプレートで以下のコードを使用しました。

    {% if forloop.counter|divisibleby:20 %}</table><table>{% endif %}

編集:この修正はテーブル ヘッダーの繰り返しではうまく機能しないため、そうしているrepeat="1"場合は、各ページに収まる行数を正確に把握する必要があります。

また、CSS にこのモンスターのセレクターがありました。

    html, body, div, span, applet, object, iframe,
    h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    a, abbr, acronym, address, big, cite, code,
    del, dfn, em, img, ins, kbd, q, s, samp,
    small, strike, strong, sub, sup, tt, var,
    b, u, i, center,
    dl, dt, dd, ol, ul, li,
    fieldset, form, label, legend,
    table, caption, tbody, tfoot, thead, tr, th, td,
    article, aside, canvas, details, embed,
    figure, figcaption, footer, header, hgroup,
    menu, nav, output, ruby, section, summary,
    time, mark, audio, video{
        ...
    }

* {...}少し高速化されたレンダリングに変更することで。*ブラウザは、上記のモンスターを使用している場合よりもセレクタを使用している場合ほど速くページをレンダリングしないため、これは直観に反していました。

また、何らかの理由で、2 つのページ内<style>タグを 1 つのタグにマージすると、レンダリング時間も短縮されました。

于 2012-12-14T12:41:32.467 に答える