2011-08-04 5 views
9

モデルウィンドウにあるjavascriptチャートのPDFを作成しようとしています(私のグラフは.aspxビューでjavascriptとcssの組み合わせです)。レンダリングされたPDFファイル内の唯一のものは、ウィンドウからの静的コンテンツです。実際のjavascriptチャートは存在しません。私はjavascriptのチャートをつかむ可能性がどのようにwkhtmltopdfでPDFを作成し、javascriptをレンダリングする

public byte[] WKHtmlToPdf(string url) 
    { 
     var fileName = " - "; 
     var wkhtmlDir = "C:\\Temp\\wkhtml"; 
     var wkhtml = "C:\\Temp\\wkhtml\\wkhtmltopdf.exe"; 
     var p = new Process(); 

     p.StartInfo.CreateNoWindow = true; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.FileName = wkhtml; 
     p.StartInfo.WorkingDirectory = wkhtmlDir; 

     string switches = ""; 
     switches += "--print-media-type "; 
     switches += "--margin-top 0mm --margin-bottom 0mm --margin-right 0mm --margin-left 0mm "; 
     switches += "--page-size Letter "; 
     p.StartInfo.Arguments = switches + " " + url + " " + fileName; 
     p.Start(); 

     //read output 
     byte[] buffer = new byte[32768]; 
     byte[] file; 
     using (var ms = new MemoryStream()) 
     { 
      while (true) 
      { 
       int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length); 

       if (read <= 0) 
       { 
        break; 
       } 
       ms.Write(buffer, 0, read); 
      } 
      file = ms.ToArray(); 
     } 

     // wait or exit 
     p.WaitForExit(60000); 

     // read the exit code, close process 
     int returnCode = p.ExitCode; 
     p.Close(); 

     return returnCode == 0 ? file : null; 
    } 

任意のアイデアを次のようにPDFを作成するための

私の呼び出しがありますか?おそらく.Net版がより適切かもしれないし、生成されたページをファイルに保存してそれをツールに渡さなければならない。

ありがとうございました。

+0

私はこの問題を抱え、wkhtmltopdf 0.9.9を使用していることを確認して修正しました。 「gem install」バージョン(0.8.3)はそれをカットしていませんでした。 – dfrankow

答えて

9

私たちのプロジェクトでは、何かsimularを成功させています。現時点ではwkhtmltopdf 0.9.9とHighchartsを組み合わせて使用​​しています。 jQueryを使って少し微調整しても成功しました。私たちのプロジェクトでは、最初にビューを文字列にレンダリングし、それをstdinを使ってwkhtmlに渡します。その後、wkhtmlのstdoutを捕捉し、ブラウザに戻します。

stdinとstdoutを使用する以外は、あなたのwkhtml設定が正しいと思われます。それが問題になるかどうかはわかりません。

これらのグラフのいずれかを使用すると、私はあなたを助けることができると思います。どのようなチャートを使っていますか?

最後の一つのノート:Wkhtmltopdfの0.10rc2は、私がwkhtmltopdf 0.9.9とpdfkitルビーを使用していたポート80

+0

ありがとうございました "最後の1つのメモ"、私は現在それを修正する方法を探しています:) – AgelessEssence

+1

基本的に私は、アニメーションを無効にする隠されたブラウザウィンドウを開いてグラフの画像を保存し、内部をPDFにレンダリングします。 –

+0

あなたはビューを文字列にレンダリングすると述べましたか?どうやってするか?私はjavascriptとダイナミックなトレンドラインチャート(ハイチャートから)をレンダリングしています。しかし、チャート自体はpdfには表示されていません。すべてのポインタ? – Dhamayanthi

6

タグの判断はExtjs 4スクリプトからのチャートの出力を得ようとしているようです。

extスクリプトはおそらくグラフのアニメーションの一部を使用している可能性があり、JavaScriptのイベントがチャートを実行してレンダリングするのを待っています。したがって、デフォルトの時間(200ms)が完了するまでには、おそらく完了していないでしょう。

クイックフィックスは、コマンドラインにjavascriptの遅延ページのオプションを追加することです:

wkhtmltopdf http://dev.sencha.com/deploy/ext-4.0.2a/examples/charts/Mixed.html --javascript-delay=2000 test.pdfは確かに* nixの上で動作する、と同様のことは、Windows上で動作するはずです。

+0

ありがとう、良いアイデア。残念ながら、私にとっては何も変わりません。私はそれがチャートが表示され、あなたのextjs仮定が正しいモデルウィンドウかもしれないと思っています。 –

1

は異なるポート番号を使用している場合はlocalhostから外部リソース(JS/CSS)をロードするいくつかの問題を持っているようです宝石、そして同様の問題を抱えています。

すべてのタグを変更して絶対URLを使用するように修正しました。 wkhtmltopdfは、相対的なリソースがロードされていないので、ページがどのURLにアクセスされたかわからなかったようです。それがpdfkitまたはwkhtmltopdfの制限であるかどうかはわかりません。

私はhttps://github.com/mileszs/wicked_pdfからアイデアを得ました。