2

flot で作成されたチャートを取得し、wkhtmltopdf を使用して PDF にレンダリングしようとしています。

そのために、チャートを含む div 内の HTML を取得し、それをサーバーに返します。

PDFでは、実際のチャートではなく、軸のみが表示されていることがわかりました。

ブラウザで見ると、グラフは次のようになります。

ここに画像の説明を入力

しかし、同じ画像を wkhtmltopdf でレンダリングすると、次のようになります。 ここに画像の説明を入力

両方のテンプレートに flot/examples/examples.css を含めました。

wkhtmltopdf に渡される HTML は次のようになります。

<body>
  <h2>Incidents per 100 Workers</h2>
  <p>This is the test output</p>
        <div id="content">
                <div class="demo-container">
                        <div id="placeholder" class="demo-placeholder">
            <canvas height="450" width="850" style="direction: ltr; position: absolute; left: 0px; top: 0px; width: 850px; height: 450px;" class="flot-base"></canvas><div style="position: absolute; top: 0px; left: 0px; bottom: 0px; right: 0px; font-size: smaller; color: rgb(84, 84, 84);" class="flot-text"><div style="position: absolute; top: 0px; left: 0px; bottom: 0px; right: 0px; display: block;" class="flot-x-axis flot-x1-axis xAxis x1Axis"><div class="flot-tick-label tickLabel" style="position: absolute; max-width: 106px; top: 431px; left: 23px; text-align: center;">0</div><div class="flot-tick-label tickLabel" style="position: absolute; max-width: 106px; top: 431px; left: 144px; text-align: center;">2</div><div class="flot-tick-label tickLabel" style="position: absolute; max-width: 106px; top: 431px; left: 265px; text-align: center;">4</div><div class="flot-tick-label tickLabel" style="position: absolute; max-width: 106px; top: 431px; left: 386px; text-align: center;">6</div><div class="flot-tick-label tickLabel" style="position: absolute; max-width: 106px; top: 431px; left: 507px; text-align: center;">8</div><div class="flot-tick-label tickLabel" style="position: absolute; max-width: 106px; top: 431px; left: 624px; text-align: center;">10</div><div class="flot-tick-label tickLabel" style="position: absolute; max-width: 106px; top: 431px; left: 745px; text-align: center;">12</div></div><div style="position: absolute; top: 0px; left: 0px; bottom: 0px; right: 0px; display: block;" class="flot-y-axis flot-y1-axis yAxis y1Axis"><div class="flot-tick-label tickLabel" style="position: absolute; top: 418px; left: 2px; text-align: right;">-1.5</div><div class="flot-tick-label tickLabel" style="position: absolute; top: 348px; left: 2px; text-align: right;">-1.0</div><div class="flot-tick-label tickLabel" style="position: absolute; top: 279px; left: 2px; text-align: right;">-0.5</div><div class="flot-tick-label tickLabel" style="position: absolute; top: 209px; left: 6px; text-align: right;">0.0</div><div class="flot-tick-label tickLabel" style="position: absolute; top: 140px; left: 6px; text-align: right;">0.5</div><div class="flot-tick-label tickLabel" style="position: absolute; top: 70px; left: 6px; text-align: right;">1.0</div><div class="flot-tick-label tickLabel" style="position: absolute; top: 1px; left: 6px; text-align: right;">1.5</div></div></div><canvas height="450" width="850" style="direction: ltr; position: absolute; left: 0px; top: 0px; width: 850px; height: 450px;" class="flot-overlay"></canvas>
            </div>
                </div>
        </div>
</body>
</html>

これを引き起こす可能性のあるアイデアはありますか?

ありがとう


答え !

以下の Ryley が述べたように、HTML をサーバーに送り返すだけでは、ほとんどのチャートが「書き込まれる」キャンバスが失われるため、十分ではありません。

代わりに私はこれをしました:

//fplotChart is the value returned by calling 
//the fPlot .plot() function
var fplotChartCanvas = fplotChart.getCanvas();
valueToSubmitToServer = fplotChartCanvas.toDataURL();

そして、値がサーバーに戻ったら、IMG要素の「src」として「valueToSubmitToServer」を使用しました

<img id="chart1" src="{{ pdf_inject_canvas_url }}">

元の背景色が失われたことを除けば、これはうまく機能しました。

4

2 に答える 2

2

Flot はcanvas要素を使用してグラフ自体をレンダリングし、html div を配置してラベルを表示します。使用している wkhtmltopdf のバージョンはcanvas要素をサポートしていないと思います。私は wkhtmltopdf 0.10.0 rc2 の静的にリンクされたバージョンを使用して、flot グラフを pdf に正常にキャプチャしたので、それは間違いなく可能です。プラットフォームで動作するバージョンを追跡する必要があります。

于 2013-06-04T15:21:18.620 に答える
1

私はこの同じ問題を何度も経験しました。これは、wkhtmltopdf がキャンバス スペースをレンダリングするために使用するいくつかの依存関係が欠落していることが原因です (これらはグラフィック アクセラレーションされたコンテンツであるためだと思います)。何が欠けているのか正確には思い出せませんが、wkhtmltopdf はおそらく、有用なデバッグ情報を stdout または呼び出し元のログに書き込んでいるでしょう。X サーバー環境または QT の依存関係が関係している可能性がありますが、前述のとおり、ログを確認するのが最善です。

レガシー IE バージョン (<= IE8) をサポートする必要がある場合を除いて、キャンバスを dataURL に解析することは問題ありません。

于 2013-07-07T13:57:12.363 に答える