Poster une réponse à un sujet: [PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, GIF ou JPG
Attention, ce sujet est un sujet ancien (6150 jours sans réponse)
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();
- }
- }
- }
Clandestino
Maintenant c'est pour moi
A l'origine c'était pour un client, mais j'ai réussi à lui faire changer d'idée entretemps
Merci en tout cas
![:oh: :oh:](images/smileys/oh.gif)
![:lol: :lol:](images/smileys/laugh.gif)
Merci en tout cas
![:itm: :itm:](images/smileys/itm.gif)
rfr
rfr > Tu pourrais me filer le source, que j'aie une idée de comment tu fais ?
C'est pour toi ou un client?
Si c'est pour toi je t'explique, si c'est pour un client il paye
![:ddr555: :ddr555:](images/smileys/ddr555.gif)
Mais en gros, l'architecture est la suivante (sous linux):
Un serveur xvfb (Virtual Frame Buffer donc pas besoin de carte graphique) qui tourne parce que n'importe quel browser nécessite un environnement graphique ...
Une application Java SWT (hehe) qui intègre un widget Browser qui utilise xulrunner pour le rendu. Une fois la page chargée, je récupere l'image du widget browser que je convertit en PNG et que je refourgue à celui qui en fait la demande. J'utilise aussi Jetty pour fournir le serveur WEB (par facilité, on peut trouver bcp moins gourmand).
Dans l'application ici, toute les requêtes sont sérialisées car j'utilise toujours le même browser pour le rendu.
La source ... j'ai honte
![:wink: :wink:](images/smileys/wink.gif)
Mais en gros:
b = le widget du browser qui intègre xulrunner.
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();
}
Clandestino
rfr > Tu pourrais me filer le source, que j'aie une idée de comment tu fais ?
cauet
Et qu'est-ce que t'empêche de faire exec bash ?
![:oh: :oh:](images/smileys/oh.gif)
On parlait de dload() initialement.. Mais si on se fabrique une extension PHP maison.. effectivement, c'est dangereux. Je n'avais pas vu sous cet angle.
zion
Alors la clairement, si on te laisse exécuter du binaire sur ta machine t'es quand même mal barré
![:itm: :itm:](images/smileys/itm.gif)
Altar
Et qu'est-ce que t'empêche de faire exec bash ?
![:oh: :oh:](images/smileys/oh.gif)
cauet
sans accès shell?
suis ptet trop naif
![:sweat: :sweat:](images/smileys/sweat.gif)
ovh
Et tu crois qu'il n'y a aucun moyen de faire une escalade d'user?
![:oh: :oh:](images/smileys/oh.gif)
Ca donne le vertige
![:ciler: :ciler:](images/smileys/ciler.gif)
![:neowen: :neowen:](images/smileys/neowen.gif)
zion
PHP tourne sous ton user, c'est rarement le cas chez les autres hébergeurs.. les dégats sont donc.. limités, non?
Et tu crois qu'il n'y a aucun moyen de faire une escalade d'user?
![:oh: :oh:](images/smileys/oh.gif)