Hi,
ich muss Screenshots von HTML Seiten erzeugen. Dazu nehme ich die JTextpane, setzte die Seite über .setPage() und hole mir über .paint() ein Image der angezeigten Seite.
Für einzelne Seiten funktioniert das auch, aber wenn ich mehrere hintereinander speichern will, dann funktioniert das nur teilweise - es wird nicht immer alles angezeigt.
Ich muss also irgendwie sicherstellen, dass die HTML-Seite erst komplett geladen wird, bevor ich paint aufrufe.
Eigentlich dachte ich, dass extra dazu die Methode doc.setAsynchronousLoadPriority(-1); gäbe. Ich hab daher das HTMLEditorKit so überschrieben, dass bei .createDefaultDocument sofort auf synchrones Laden umgeschaltet wird.
- Trotzdem sehen die Images noch "ungeladen" aus.
Kann ich irgendwie sicherstellen, dass alles Threads, die in JTextPane aufgerufen werden erst beendet werden, bevor ich paint() aufrufe?
Hier ein Lösung, die theretische funktionieren sollte ... praktisch funktionierts nicht richtig.
ich muss Screenshots von HTML Seiten erzeugen. Dazu nehme ich die JTextpane, setzte die Seite über .setPage() und hole mir über .paint() ein Image der angezeigten Seite.
Für einzelne Seiten funktioniert das auch, aber wenn ich mehrere hintereinander speichern will, dann funktioniert das nur teilweise - es wird nicht immer alles angezeigt.
Ich muss also irgendwie sicherstellen, dass die HTML-Seite erst komplett geladen wird, bevor ich paint aufrufe.
Eigentlich dachte ich, dass extra dazu die Methode doc.setAsynchronousLoadPriority(-1); gäbe. Ich hab daher das HTMLEditorKit so überschrieben, dass bei .createDefaultDocument sofort auf synchrones Laden umgeschaltet wird.
- Trotzdem sehen die Images noch "ungeladen" aus.
Kann ich irgendwie sicherstellen, dass alles Threads, die in JTextPane aufgerufen werden erst beendet werden, bevor ich paint() aufrufe?
Hier ein Lösung, die theretische funktionieren sollte ... praktisch funktionierts nicht richtig.
Code:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.Document;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
public class Image2HTML {
public static void main(String[] args) {
URL url = null;
try {
url = new URL("http://www.google.de");
} catch (MalformedURLException e) {
e.printStackTrace();
}
// Verzeichnis wo die Bilder gespeichert werden
File folder = new File("/d:/tmp/");
String imageName = null;
for (int i = 0; i < 10; i++) {
imageName = "image-" + i + ".png";
saveImage(url, folder, imageName);
}
}
public static void saveImage(URL url, File folder, String imageName) {
JTextPane tp = new JTextPane();
tp.setSize(600, 400);
tp.setEditorKit(new SyncHTMLEditorKit());
try {
tp.setPage(url);
} catch (IOException e) {
e.printStackTrace();
}
int w = tp.getWidth(), h = tp.getHeight();
BufferedImage image = new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
tp.paint(g);
try {
ImageIO.write(image, "png", new File(folder.getPath() + "/"
+ imageName));
} catch (IOException e) {
e.printStackTrace();
}
}
}
class SyncHTMLEditorKit extends HTMLEditorKit {
public SyncHTMLEditorKit() {
super();
}
public Document createDefaultDocument() {
HTMLDocument doc = (HTMLDocument) super.createDefaultDocument();
doc.setAsynchronousLoadPriority(-1);
return doc;
}
}
Zuletzt bearbeitet: