3

サーバー上で FusionCharts を完全にレンダリングおよびエクスポートしようとしています。FCimg や FusionCharts .NET Solution などのソリューションを認識しています。Process クラスを使用して wkhtmltoimage を実行する Java ソリューションも実装しました。

ただし、これを行うための純粋な Java ソリューションを見つけようとしています。FusionCharts JS ライブラリとフュージョン チャートを生成するコードを含む html ファイルがあります。チャートを適切にレンダリングする JxBrowser を見つけましたが、Linux で動作させるには X-Server が必要です。Cobra/Lobo Browser も試しましたが、JavaScript を完全にはサポートしていません。サーバー上でフュージョン チャートをレンダリングおよびエクスポートする方法や、少なくとも Java で完全に JavaScript を含む (xserver を必要としない) html ファイルをレンダリングする方法はありますか?

すべての助けを前もってありがとう!

4

1 に答える 1

1

更新: xserver: WebRendererを必要としないソリューション。Swing Edition は、2012 年 7 月 9 日の時点で HTML5 をサポートする唯一のエディションです。swing Edition を使用して、GUI なしで画像をキャプチャできます。


Eclipse の SWT Browser を使用する方法を見つけました。ただし、これはヘッドレス モードでは実行できません。これを実装するには xserver を使用する必要があります。この質問を参照してください。

これには xserver が必要であり、ヘッドレス モードでは実行できないため、JxBrowser を使用することをお勧めします。これは非常に簡単で、すべてのフュージョン チャート スクリプトを含む html ファイルを生成するだけです。#1、#2、#3 を参照

  1. <html><head>ヘッダー ( )、jquery.min.js、FusionCharts.js、FusionCharts.HC.js、FusionCharts.HC.Charts.jsを含む template.html ファイルを作成する必要があります。これらの各スクリプトが独自のスクリプト タグ ( <script type="text/javascript"> [js code] </script>)内にあることを確認します。

  2. 次に、グラフをレンダリングする手順を含む独自のスクリプト タグを使用して、別の JavaScript 関数を追加します。例えば:

function load() { FusionCharts.setCurrentRenderer('javascript'); var chart = new FusionCharts("swf", 'chart0', "width", "height", "0", "1"); chart.setXMLData("XML DATA HERE"); chart.render("divNAMEHere"); }

  1. ここで、load() 関数 onload を呼び出し、チャートをレンダリングする div を作成し、html ファイルを終了する必要があります。例えば:

    `

テスト `
  1. Eclipse SWT ブラウザ ライブラリをインポートする新しいクラスを作成します。ディスプレイ、シェル、およびブラウザをインスタンス化します (これをガイドラインとして使用して、何が起こっているかを理解してください: http://www.roseindia.net/tutorials/swt/swt-browser.shtml )。

  2. ブラウザのテキスト ( browser.setText("htmlcode")) を template.html の html コードに設定します。これを行う最善の方法は、BufferedReader を使用してファイルを読み取ることです。

  3. 最後に、画像のレンダリングには時間がかかります。これを行うためのより良い方法がおそらくありますが、それを機能させたい場合は、カウントを設定し、特定の数の後に画像をキャプチャします。最後に追加する必要があるのは次のとおりです。

    int i = 0;
    while (!shell.isDisposed())
    {
      if (!display.readAndDispatch())
      {
         display.sleep();
         i++;
       //  System.out.println(i);
         if(i==100)
         {
             GC source = new GC (shell);  
             Image image = new Image(display, browser.getClientArea()); 
             source.copyArea(image, 0, 0);
             ImageLoader io = new ImageLoader ();
             io.data = new ImageData[] { image.getImageData() };
             File f = new File (currentDir+"/workpng.png");
             io.save (f.getAbsolutePath(), SWT.IMAGE_PNG); 
         }
      }
    }
    
于 2012-06-22T14:18:10.360 に答える