Supprimer un message
rfr
Alors voici le code torché à la va-vite ... hum ...
- package be.erefer.Html2Png;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.eclipse.swt.SWT;
- import org.eclipse.swt.browser.Browser;
- import org.eclipse.swt.browser.ProgressEvent;
- import org.eclipse.swt.browser.ProgressListener;
- import org.eclipse.swt.graphics.GC;
- import org.eclipse.swt.graphics.Image;
- import org.eclipse.swt.graphics.ImageData;
- import org.eclipse.swt.graphics.ImageLoader;
- import org.eclipse.swt.layout.FillLayout;
- import org.eclipse.swt.layout.GridData;
- import org.eclipse.swt.layout.GridLayout;
- import org.eclipse.swt.widgets.Display;
- import org.eclipse.swt.widgets.Shell;
- import org.mortbay.jetty.Server;
- import org.mortbay.jetty.handler.AbstractHandler;
- class RequestHandler extends AbstractHandler {
- private Main m = null;
- public RequestHandler(Main m) {
- this.m = m;
- }
- public void handle(String arg0, HttpServletRequest arg1,
- HttpServletResponse arg2, int arg3) throws IOException,
- ServletException {
- synchronized (this) {
- String url = arg1.getParameter("url");
- String width = arg1.getParameter("width");
- String height = arg1.getParameter("height");
- int x;
- int y;
- if (url == null || width == null || height == null) {
- throw new ServletException("Invalid Parameters");
- }
- try {
- x = Integer.parseInt(width);
- y = Integer.parseInt(height);
- } catch (Exception e) {
- throw new ServletException("Invalid Parameters");
- }
- m.SetSize(x, y);
- Object synch = new Object();
- m.setSynchObject(synch);
- m.launchImageCapture(url);
- synchronized(synch) {
- try {
- synch.wait();
- } catch (Exception e) {
- new ServletException("Internal Error");
- }
- }
- if (m.getRequestImageData() == null) {
- throw new ServletException("No image generated");
- }
- ImageLoader il = new ImageLoader();
- il.data = new ImageData[] {m.getRequestImageData()};
- ByteArrayOutputStream imgb = new ByteArrayOutputStream();
- il.save(imgb, SWT.IMAGE_PNG);
- //imgb.flush();
- arg2.setStatus(HttpServletResponse.SC_OK);
- arg2.setContentType("image/png");
- arg2.setContentLength(imgb.size());
- byte[] data = imgb.toByteArray();
- arg2.getOutputStream().write(data);
- arg2.getOutputStream().flush();
- }
- }
- }
- public class Main {
- private Browser b = null;
- private Display d;
- private Shell main;
- private int requestedWidth;
- private int requestedHeight;
- private Object synchObject;
- private ImageData requestImageData;
- private String requestUrl;
- public void SetSize(int x, int y) {
- requestedHeight = y;
- requestedWidth = x;
- }
- public void setSynchObject(Object o) {
- synchObject = o;
- }
- public ImageData getRequestImageData() {
- return requestImageData;
- }
- public void setRequestImageData(ImageData id) {
- requestImageData = id;
- }
- public void loadCompleted() {
- FrameGrabber fg = new FrameGrabber(this, main, b);
- d.timerExec(2000, fg);
- }
- public void imageCapture() {
- main.setSize(requestedWidth, requestedHeight);
- main.setActive();
- b.setData(synchObject);
- b.setUrl(requestUrl);
- }
- public void launchImageCapture(String url) {
- requestUrl = url;
- d.syncExec(new Runnable() {
- public void run() {
- imageCapture();
- }
- });
- }
- public void run() {
- Server server = new Server(9090);
- server.setHandler(new RequestHandler(this));
- try {
- server.start();
- } catch (Exception e) {
- throw new RuntimeException("Error in server");
- }
- d = new Display();
- main = new Shell(d, SWT.NO_TRIM);
- main.setLayout(new FillLayout());
- GridLayout gridLayout = new GridLayout();
- gridLayout.numColumns = 1;
- main.setLayout(gridLayout);
- GridData data = new GridData();
- data.horizontalAlignment = GridData.FILL;
- data.verticalAlignment = GridData.FILL;
- data.grabExcessHorizontalSpace = true;
- data.grabExcessVerticalSpace = true;
- main.setSize(1024, 768);
- main.setLocation(0, 0);
- b = new Browser(main, SWT.MOZILLA);
- b.setLayoutData(data);
- main.open();
- /*
- b.addTitleListener(new TitleListener() {
- public void changed(TitleEvent event) {
- loadCompleted();
- }
- });
- */
- //b.setText("<html><head></head><body>a</body></html>");
- if (!b.execute("window.scrollbars.visible=false;")) {
- System.out.println("Script not executed");
- }
- b.addProgressListener(new ProgressListener() {
- public void changed(ProgressEvent event) {
- }
- public void completed(ProgressEvent event) {
- if (requestUrl == null) {
- return;
- }
- loadCompleted();
- b.execute("window.scrollbars.visible=false;");
- }
- });
- while (!main.isDisposed()) {
- if (!d.readAndDispatch())
- d.sleep();
- }
- main.dispose();
- d.dispose();
- }
- public static void main(String s[]) {
- Main m = new Main();
- m.run();
- }
- }
- class FrameGrabber implements Runnable {
- private Browser b;
- private Shell s;
- private Main m;
- public FrameGrabber(Main m, Shell s, Browser b) {
- this.b = b;
- this.s = s;
- this.m = m;
- }
- public void run() {
- int xDelta = 0;
- int yDelta = 0;
- s.setActive();
- b.redraw();
- if (b.getVerticalBar() == null) {
- System.out.println("No VScroll");
- } else {
- System.out.println("VScroll");
- }
- if (b.getHorizontalBar() == null) {
- System.out.println("No HScroll");
- } else {
- System.out.println("HScroll");
- }
- if (b.getHorizontalBar() != null && b.getHorizontalBar().isVisible()) {
- yDelta = b.getHorizontalBar().getSize().y;
- System.out.println("yDelta = "+yDelta);
- }
- if (b.getVerticalBar() != null && b.getVerticalBar().isVisible()) {
- xDelta = b.getVerticalBar().getSize().x;
- System.out.println("xDelta = "+xDelta);
- }
- b.update();
- GC browserGC = new GC(b);
- Image img = new Image(Display.getCurrent(), b.getClientArea().width - xDelta, b.getClientArea().height-yDelta);
- browserGC.copyArea(img, 0, 0);
- m.setRequestImageData(img.getImageData());
- browserGC.dispose();
- synchronized(b.getData()) {
- b.getData().notify();
- }
- }
- }