0

わかりましたので、私の解決策を文書化するためにこれを求めており、自分で答えますが、私の方法の改善は大歓迎です.

問題: iframe に埋め込まれた html ページ (独自の URL が必要) と pdf の両方にレポートをレンダリングする必要があります。レポートには、私が見たどのグラフ API でもサポートされていない通常とは異なるグラフが含まれています。私のサイトは Joomla! を使用しています。CMS (V. 2.5.*) は、バックエンドが php と mysql であることを意味します。Joomla に設定されている既定のテンプレートから干渉されることなく、レポートをレンダリングする必要があります。Linuxホスト(基本LAMP)で実行しています。Joomla は html で base タグを使用し、svg の url() を台無しにします。

4

1 に答える 1

1

私の解決策には、wkhtml2pdf、 js、url parameters、およびjoomla component の作成が含まれます

2 つのサイト ビューを持つ基本的な Joomla コンポーネントを作成しました。1 つは HTML でレポートを生成し、もう 1 つは iframe でレポート ビューを表示します。レポートにはアクセスするための URL があり、それを埋め込む方法があります。このコンポーネントには、レポートを生成するための js と css も含まれており、メディア フォルダーに含めるために個別のファイルに抽出されました (ただし、これは機能ではなく、コードをクリーンにするためでした)。

レポート ビューは、レポートが正しくレンダリングされるようにページ ヘッダーに次の変更を加える必要がありました (グラフ用に保存)。そうしないと、リソースが間違ったタイミングで読み込まれました。

$document = &JFactory::getDocument();
$document->setBase('');//base tag screws up svg urls so get rid of it
$document->addscript('http://www.google.com/jsapi');
$document->addscript(JURI::root(true).'/media/com_metahealthzone/javascript/chart.js');
$document->addStyleSheet(JURI::root(true).'/media/com_metahealthzone/css/chart.css');

iframe で使用される URL には ?template=system を追加する必要があり、テンプレートの css がまだ適用されているため、tmpl=component は機能しませんでした。

Google のビジュアライゼーションを正しく表示するために、javascript を の最後にOnLoadCallback追加して svg を取得し、タグlinearGradientの子として aを追加して(Google がグラデーションをサポートしていない理由はわかりません)、すべての要素を取得します。グラデーションが必要なグラフで、塗りつぶしを に設定します。svg 名前空間のために忘れずに使用し、グラデーションタグを定義ではなくグラデーションの子にします。defsid="svg_grad"'url(#svg_grad)'setAttributeNSstop

私はまだ VML (愚かな IE) の微調整を行う必要があります。

私も克服しなければならなかった wkhtml2pdf に関するいくつかの問題がありました。js を使用して DOM に要素を追加すると、他のブラウザーのように動作しません。document.getElement*型関数を使用して新しい要素を取得できないため、返されたハンドルを保持する必要があります。また、wkhtml2pdf を使用して js が実行されるのを待つように指示する必要があります。そうしないと--no-stop-slow-scripts、グラフが表示されません (遅いです)。また、引数を使用して wkhtml2pdf の Cookie を設定して、ユーザーのセッションを偽装する必要がありました--cookie <name> <value>

于 2013-04-15T18:20:27.253 に答える