Programmation » [PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, G...
Catégorie:  
Rappel du message précédent
   
[PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, G...
Publié le 29/10/2007 @ 14:53:59,
Par Altar
Et qu'est-ce que t'empêche de faire exec bash ? :oh:


   
[PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, G...
Publié le 29/10/2007 @ 14:59:59,
Par zion

suis ptet trop naif :sweat:


Alors la clairement, si on te laisse exécuter du binaire sur ta machine t'es quand même mal barré :itm:
Je suis le Roy :ocube:
   
[PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, G...
Publié le 29/10/2007 @ 17:30:39,
Par cauet
Et qu'est-ce que t'empêche de faire exec bash ? :oh:

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.
   
[PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, G...
Publié le 29/10/2007 @ 17:46:57,
Par Clandestino
rfr > Tu pourrais me filer le source, que j'aie une idée de comment tu fais ?

Dernière édition: 29/10/2007 @ 17:48:32
   
[PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, G...
Publié le 29/10/2007 @ 18:11:52,
Par 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:

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:

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();
}
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
[PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, G...
Publié le 29/10/2007 @ 18:20:41,
Par Clandestino
Maintenant c'est pour moi :oh: A l'origine c'était pour un client, mais j'ai réussi à lui faire changer d'idée entretemps :lol:

Merci en tout cas :itm:
   
[PHP/ASP/ASP.NET] - Convertir une page HTML en image PNG, G...
Publié le 29/10/2007 @ 19:27:23,
Par rfr
Alors voici le code torché à la va-vite ... hum ...

  1. package be.erefer.Html2Png; 
  2. import java.io.ByteArrayOutputStream; 
  3. import java.io.IOException; 
  4. import javax.servlet.ServletException; 
  5. import javax.servlet.http.HttpServletRequest; 
  6. import javax.servlet.http.HttpServletResponse; 
  7. import org.eclipse.swt.SWT; 
  8. import org.eclipse.swt.browser.Browser; 
  9. import org.eclipse.swt.browser.ProgressEvent; 
  10. import org.eclipse.swt.browser.ProgressListener; 
  11. import org.eclipse.swt.graphics.GC; 
  12. import org.eclipse.swt.graphics.Image; 
  13. import org.eclipse.swt.graphics.ImageData; 
  14. import org.eclipse.swt.graphics.ImageLoader; 
  15. import org.eclipse.swt.layout.FillLayout; 
  16. import org.eclipse.swt.layout.GridData; 
  17. import org.eclipse.swt.layout.GridLayout; 
  18. import org.eclipse.swt.widgets.Display; 
  19. import org.eclipse.swt.widgets.Shell; 
  20. import org.mortbay.jetty.Server; 
  21. import org.mortbay.jetty.handler.AbstractHandler; 
  22. class RequestHandler extends AbstractHandler { 
  23. private Main m = null; 
  24.  
  25. public RequestHandler(Main m) { 
  26. this.m = m; 
  27.  
  28. public void handle(String arg0, HttpServletRequest arg1, 
  29. HttpServletResponse arg2, int arg3) throws IOException, 
  30. ServletException { 
  31.  
  32. synchronized (this) { 
  33.  
  34. String url = arg1.getParameter("url"); 
  35. String width = arg1.getParameter("width"); 
  36. String height = arg1.getParameter("height"); 
  37.  
  38. int x; 
  39. int y; 
  40.  
  41. if (url == null || width == null || height == null) { 
  42. throw new ServletException("Invalid Parameters"); 
  43.  
  44. try { 
  45. x = Integer.parseInt(width); 
  46. y = Integer.parseInt(height); 
  47. catch (Exception e) { 
  48. throw new ServletException("Invalid Parameters"); 
  49.  
  50. m.SetSize(x, y); 
  51.  
  52. Object synch = new Object(); 
  53. m.setSynchObject(synch); 
  54.  
  55. m.launchImageCapture(url); 
  56.  
  57. synchronized(synch) { 
  58. try { 
  59. synch.wait(); 
  60. catch (Exception e) { 
  61. new ServletException("Internal Error"); 
  62.  
  63. if (m.getRequestImageData() == null) { 
  64. throw new ServletException("No image generated"); 
  65.  
  66. ImageLoader il = new ImageLoader(); 
  67. il.data = new ImageData[] {m.getRequestImageData()}; 
  68.  
  69. ByteArrayOutputStream imgb = new ByteArrayOutputStream(); 
  70. il.save(imgb, SWT.IMAGE_PNG); 
  71. //imgb.flush(); 
  72.  
  73.  
  74. arg2.setStatus(HttpServletResponse.SC_OK); 
  75. arg2.setContentType("image/png"); 
  76. arg2.setContentLength(imgb.size()); 
  77.  
  78. byte[] data = imgb.toByteArray();  
  79.  
  80.                         arg2.getOutputStream().write(data); 
  81.  
  82. arg2.getOutputStream().flush(); 
  83.  
  84.  
  85.  
  86. public class Main { 
  87. private Browser b = null; 
  88. private Display d; 
  89. private Shell main; 
  90.  
  91. private int requestedWidth; 
  92. private int requestedHeight; 
  93.  
  94. private Object synchObject;  
  95.  
  96. private ImageData requestImageData; 
  97. private String requestUrl; 
  98.  
  99. public void SetSize(int x, int y) { 
  100. requestedHeight = y; 
  101. requestedWidth = x; 
  102.  
  103. public void setSynchObject(Object o) { 
  104. synchObject = o; 
  105.  
  106. public ImageData getRequestImageData() { 
  107. return requestImageData; 
  108.  
  109. public void setRequestImageData(ImageData id) { 
  110. requestImageData = id; 
  111.  
  112. public void loadCompleted() { 
  113. FrameGrabber fg = new FrameGrabber(this, main, b); 
  114.  
  115. d.timerExec(2000, fg); 
  116.  
  117. public void imageCapture() { 
  118. main.setSize(requestedWidth, requestedHeight); 
  119. main.setActive(); 
  120. b.setData(synchObject); 
  121. b.setUrl(requestUrl); 
  122.  
  123. public void launchImageCapture(String url) { 
  124. requestUrl = url; 
  125. d.syncExec(new Runnable() { 
  126. public void run() { 
  127. imageCapture(); 
  128. }); 
  129.  
  130. public void run() { 
  131.  
  132. Server server = new Server(9090); 
  133. server.setHandler(new RequestHandler(this)); 
  134. try { 
  135. server.start(); 
  136. catch (Exception e) { 
  137. throw new RuntimeException("Error in server"); 
  138.  
  139. d = new Display(); 
  140.  
  141. main = new Shell(d, SWT.NO_TRIM); 
  142. main.setLayout(new FillLayout()); 
  143.  
  144. GridLayout gridLayout = new GridLayout(); 
  145. gridLayout.numColumns = 1
  146. main.setLayout(gridLayout); 
  147. GridData data = new GridData(); 
  148. data.horizontalAlignment = GridData.FILL; 
  149. data.verticalAlignment = GridData.FILL; 
  150. data.grabExcessHorizontalSpace = true; 
  151. data.grabExcessVerticalSpace = true;  
  152. main.setSize(1024768); 
  153. main.setLocation(00); 
  154.  
  155. b = new Browser(main, SWT.MOZILLA); 
  156. b.setLayoutData(data); 
  157.  
  158.  
  159. main.open(); 
  160.  
  161. /* 
  162. b.addTitleListener(new TitleListener() { 
  163. public void changed(TitleEvent event) { 
  164. loadCompleted(); 
  165.  
  166. }); 
  167. */ 
  168.  
  169. //b.setText("<html><head></head><body>a</body></html>"); 
  170. if (!b.execute("window.scrollbars.visible=false;")) { 
  171. System.out.println("Script not executed"); 
  172. b.addProgressListener(new ProgressListener() { 
  173. public void changed(ProgressEvent event) { 
  174. public void completed(ProgressEvent event) { 
  175. if (requestUrl == null) { 
  176. return
  177. loadCompleted(); 
  178. b.execute("window.scrollbars.visible=false;"); 
  179.  
  180. }); 
  181.  
  182. while (!main.isDisposed()) { 
  183. if (!d.readAndDispatch()) 
  184. d.sleep(); 
  185.  
  186.  
  187.  
  188. main.dispose(); 
  189. d.dispose(); 
  190.  
  191.  
  192.  
  193.  
  194. public static void main(String s[]) { 
  195. Main m = new Main(); 
  196. m.run(); 
  197. class FrameGrabber implements Runnable { 
  198.  
  199. private Browser b; 
  200. private Shell s; 
  201. private Main m; 
  202.  
  203. public FrameGrabber(Main m, Shell s, Browser b) { 
  204. this.b = b; 
  205. this.s = s; 
  206. this.m = m; 
  207.  
  208. public void run() { 
  209.  
  210. int xDelta = 0
  211. int yDelta = 0
  212.  
  213. s.setActive(); 
  214. b.redraw(); 
  215. if (b.getVerticalBar() == null) { 
  216. System.out.println("No VScroll"); 
  217. else { 
  218. System.out.println("VScroll"); 
  219. if (b.getHorizontalBar() == null) { 
  220. System.out.println("No HScroll"); 
  221. else { 
  222. System.out.println("HScroll"); 
  223.  
  224. if (b.getHorizontalBar() != null && b.getHorizontalBar().isVisible()) { 
  225. yDelta = b.getHorizontalBar().getSize().y; 
  226. System.out.println("yDelta = "+yDelta); 
  227. if (b.getVerticalBar() != null && b.getVerticalBar().isVisible()) { 
  228. xDelta = b.getVerticalBar().getSize().x; 
  229. System.out.println("xDelta = "+xDelta); 
  230. }  
  231.  
  232. b.update();  
  233. GC browserGC = new GC(b); 
  234. Image img = new Image(Display.getCurrent(), b.getClientArea().width - xDelta, b.getClientArea().height-yDelta); 
  235.  
  236. browserGC.copyArea(img, 00); 
  237.  
  238. m.setRequestImageData(img.getImageData()); 
  239. browserGC.dispose(); 
  240. synchronized(b.getData()) { 
  241. b.getData().notify(); 
  242.  
  243. }

Dernière édition: 29/10/2007 @ 20:29:26
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
Répondre - Catégorie:  
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?