2016-04-08 12 views
0

ビデオなしでウェブサイトのスナップショットを撮りたいので、単純なテキストとCSSや画像があります。完全なJFXPanelの画像

私はウェブサイトをロードし

WritableImage image = scene.snapshot(new WritableImage(1920, 1080)); 
BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null); 
ImageIO.write(bufferedImage, "png", file); 

を経由して、それを保存する(JFXPanelのシーンである)のWebViewを使用しています(「シーン」JFXPanelのシーンです)

保存された画像は完全な内容ではなくウェブサイトの一部を表示するだけです(写真参照)。

enter image description here

どうやって確保/画像の寸法はJFXPanelコンテンツの寸法と一致し、everthingが表示されていることを強制していますか?

完全なコード:

package renderer; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.concurrent.Worker; 
import javafx.embed.swing.JFXPanel; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.Scene; 
import javafx.scene.image.WritableImage; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.List; 

public class HtmlRenderer extends Application { 
    private JFXPanel jfxPanel; 
    private WebView webView; 

    public void start(Stage stage) { 
     jfxPanel = new JFXPanel(); 
     webView = new WebView(); 

     webView.getEngine().getLoadWorker().stateProperty().addListener(
       new ChangeListener<Worker.State>() { 
        @Override 
        public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) { 
         if (newState == Worker.State.SUCCEEDED) { 
          HtmlRenderer.this.toImage(jfxPanel.getScene()); 
          try { 
           Platform.exit(); 
           HtmlRenderer.this.stop(); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }); 

     jfxPanel.setScene(new Scene(webView)); 

     this.updateView("http://www.stackoverflow.com/"); 
    } 

    private void toImage(Scene scene) { 
     WritableImage image = scene.snapshot(new WritableImage(1920, 1080)); 

     // TODO: save in matching dir using proper filename 
     File file = new File("D:/workspace/SiteChecker/test.png"); 

     try { 
      BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null); 
      ImageIO.write(bufferedImage, "png", file); 
     } catch (IOException e) { 
      // TODO: exception handling 
     } 
    } 

    public void updateView(String url) { 
     webView.getEngine().load(url); 
    } 

    private void reloadView() { 
     webView.getEngine().reload(); 
    } 

} 
+0

上記のコードは、Java 8の空白のページになります(OpenJDKとOracleの両方を試しました)。 –

+0

@DarrellTeagueあなたは受け入れられた答えを見ましたか?私もJava 8で作業していましたが、Oracleだけでした。 – Jonas

答えて

0

だから私は解決策を見つけたが、それははるかに完璧と本当にperfomantではないからです。 しかし、他には何も私のために働く。 トリックは、ウェブサイトを一度ロードし、サイトの幅と高さを決定することです。 2回目に、Webviewの推奨サイズを決められた値に設定し、新しいサイズでWebサイトを再度ロードします。最初は可視部分だけがレンダリングされるからだと思います。幅と高さではJavaScriptを用いて決定することができる

、例えば:

private int getPageWidth(WebView webView) { 
    String script = "Math.max(" + 
      "document.body.scrollWidth, document.body.offsetWidth," + 
      "document.documentElement.clientWidth, document.documentElement.scrollWidth," + 
      "document.documentElement.offsetWidth);"; 

    WebEngine engine = webView.getEngine(); 

    int maxWidth = (int) engine.executeScript(script); 
    return maxWidth; 
} 

いくつかのウェブサイトが面白いエンド/ボトムすなわちを持って何らかの理由で空きスペースがたくさんあります。

関連する問題