Djangoを使用してレポートサイトを作成しています。レポートは動的に生成され、いくつかのSVGチャートも含まれています。ユーザーが表示している現在のレポートに基づいて、ヘッダーとフッターを追加したPDFファイルを作成したいと思います。Phantomjsに出くわしましたが、2つの問題があります。最初は、ページでユーザーがログオンする必要があるため、サーバーにURLを送信すると、phantomjsがログページのPDFを作成します。次に、レポートはajaxを使用して生成されるため、同じURLでも異なるレポートが作成されます。これを行うためのより良い方法はありますか?
4 に答える
Wkhtmtopdfは、htmlをpdfとそのpythonLibに変換するための優れたツールです。
一般的な問題は、Webサーバーでの認証方法です。WKHTMLTOPDFとPHANTOMJSの両方で、認証トークンをそれらに渡し、Cookieでサーバーに返すようにすることでこれを行いました。
したがって、WKHTMLTOPDFの場合、これは次のようになります。
wkhtmltopdf --cookie=LtpaToken2=<sometoken>
これは、認証トークンを渡すJavaWebサーバーで機能します。djangoについてはよくわかりませんが、認証には同様のCookieベースのメカニズムを使用する必要があります。次のことを行う必要があります。
- トークンサーブ側を取得します(通常、Cookieまたはリクエストヘッダーを参照することで取得できます)
- それをツール、wkhtmltopdfまたはphantomjsに渡します
- ツールが保護されたページを要求すると、Cookieを返す必要があります。どちらにも同じコマンドラインパラメータがあります。
AJAXの場合、最善の方法は遅延を入れることです。繰り返しますが、どちらにも遅延を構成するメカニズムがあります。WKHTMLTOPDFの場合は、コマンドラインパラメーターで指定できます。phantomjsではwindows.setTimeOutを指定できます。ページをレンダリングする前に、Ajaxが終了するのに十分な遅延を与えます。
Princeは素晴らしいオプションであり(SVGを処理する必要があります)、非営利目的での使用は無料です。私は自分のプロジェクトの1つでpisaを使用していましたが、SVGを処理しません。
さて、たくさんグーグルした後、私は何も見つけることができませんでした。そこで私は2つのハック的な解決策を思いつきました。
ユーザーが表示しているページで、テキスト領域を非表示にするフォームを作成します。送信ボタンの名前は「PDFの生成」です。ページをレンダリングした後、JavaScriptを使用して必要なdiv内のすべてのhtmlを取得し、それらをテキスト領域。ボタンをクリックすると、htmlがサーバー側に渡され、Pythonを使用してローカルでhtmlファイルを作成し、Phantomjsを使用してhtmlファイルに従ってPDFを作成します。
ユーザーが表示しているのとまったく同じページをレンダリングするURLを作成しますが、ユーザーがログインする必要はありません。したがって、ローカルホストのみがURLにアクセスできるようにApacheまたはNginxを構成する必要があります。したがって、Phantomjsは問題なくURLにアクセスし、PDFを生成できます。