Bonjour à tous
Je voudrais pouvoir generer une image (au format gif ou autre) d'un fichier html contenant non seulement du text mais aussi des images
J'ai vu que le JTextPane permettait d'interpreter du code Html . Cependant les images contenues dans les balises ne sont pas interprétées. Je me retrouve donc avec ma page web mais sans images!
Est ce que quelqu'un pourrait , a defaut de me donner une solution , m'expliquer pourquoi les images de ma page html ne s'affiche pas ?
merci beaucoup
J'aimerais bien te donner la solution, mais ça ne va pas être possible dans un premier temps. Si les images ne sont pas chargées, c'est que la JVM ne les trouve pas, mais ça je suppose que tu t'en doutais. La question est de savoir pourquoi elle ne les trouve pas et comme tu ne donnes aucun renseignement impossible de savoir.
Où sont elles ces images ? Quelque part sur le disque, dans l'archive Jar de ton application. Est-ce que le problème se produit aussi bien en lancement autonome que sous ton éditeur (Netbeans, Eclipse, etc..) ? Est-ce que simplement les liens dans la page sont correct ? Est-ce que tu peux montrer un peu du code Java qui charge la page ?
Bref aide nous un peu à t'aider :)
Hello
tout d'abord merci beaucoup de t'etre interressé à mon post !!
Je n'ai pas le code sous la main (mais je vais y remedier). Je vais aussi tester le lancement à la main (je n'ai fait mes tests que via mon editeur IntelliJ)
Les images se trouvent sur mon disque dans un repertoire "images" dans le repertoire du projet. Les liens absolus sont correctes par contre j'ai peut etre un soucis avec le chemin relatif. Lorsque mon appli se lance je ne sais pas quel est le repertoire ou s'excute le programme (je vais me renseigner).
IL ya une autre question qui me chiffonne. Depuis hier j'ai eu l'occasion de voir un bout de code qui affichait une fenetre contenant une page HTML. Le code permettait d'enregistrer "l'image" de la page. Cependant il fallait que la page html soit d'abord afficher . Il n'etait (apparemment) pas possible de generer l'image sans que la Frame contenant la page web s'affiche. Je te mettrais ce bout de code la prochaine fois.
Encore merci pour l'attention que tu portes aux post des ptits debutants comme moi.
a+
hello
voila comme prevu le code concerné. Cette classe permet d'afficher une page web dans un JtextPane cependant lorsque je veux enregistrer "l'image" de la page web j'ai un soucis.
En effet il faut attendre que la page soit entierement affichée pour que je puisse l'enregistrer (d'ou le JButton button). Ne serait ce pas possible :
- soit de ne pas a attendre l'affichage de la page dans le JtextPane
- soit (encore mieux) de ne pas avoir besoin d'afficher la page web
De plus (j'en profite ...) je risque d'avoir un autre soucis (je ne me suis pas encore penché sur la question :$) il s'agit de la definition de l'image de la page web. En effet la page affichée dans mon JtextPane ne s'affiche pas avec la meme qualité que dans Mozzilla ou IE. L'image generée n'aura donc pas la meme definition que celle affiché dans mon navigateur.... Y a t il moyen de parametrer tout cela ?
Je ne sais pas si tu pourras m'aider mais quoi qu'il arrive je réitère mes remerciements!!
Bonne journée
import javax.swing.*;
import javax.imageio.ImageIO;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.File;
import java.net.URL;
import java.net.MalformedURLException;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
/**
* Created by IntelliJ IDEA.
*/
public class Test {
private JTextPane editorPane;
private JFrame frame;
public static void main(String[] args) {
Test t = new Test();
t.run();
}
private void run() {
editorPane = new JTextPane();
editorPane.setEditable(false);
URL helpURL = null;
try {
helpURL = new URL("http://www.google.com");
}
catch (MalformedURLException e) {
e.printStackTrace();
}
if (helpURL != null) {
try {
FileInputStream fin = new FileInputStream("Google.htm");
File f = new File("Google.htm");
byte[] res = new byte[(int) f.length()];
fin.read(res);
String sres = new String(res);
System.err.println("RES : " + sres);
editorPane.setPage(helpURL);
}
catch (IOException e) {
System.err.println("Attempted to read a bad URL: " + helpURL);
}
}
else {
System.err.println("Couldn't find file: TextSamplerDemoHelp.html");
}
//Put the editor pane in a scroll pane.
JScrollPane editorScrollPane = new JScrollPane(editorPane);
editorScrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
editorScrollPane.setPreferredSize(new Dimension(250, 145));
editorScrollPane.setMinimumSize(new Dimension(10, 10));
frame = new JFrame();
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(editorScrollPane, BorderLayout.CENTER);
JButton button = new JButton(new AbstractAction () {
public void actionPerformed(ActionEvent e) {
saveImage();
}
});
frame.getContentPane().add(button, BorderLayout.SOUTH);
frame.setSize(800,600);
frame.show();
}
private void saveImage() {
RenderedImage image = getImage(frame);
try {
// Save as PNG
File file = new File("test.jpg");
ImageIO.write(image, "jpg", file);
} catch (IOException e) {
e.printStackTrace();
}
}
public RenderedImage getImage(Component component) {
if (component == null) {
return null;
}
int width = 800;
int height = 600;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
component.setSize(800,600);
//component.setPreferredSize(new Dimension(800,600));
Graphics2D g = image.createGraphics();
component.paintAll(g);
g.dispose();
return image;
}
} :oops: :oops:
Bonjour,
Je ne comprends pas, ça n'a rien à voir avec la question nitiale ça....
En effet si ton but est de récupérer une image, passer par JTextPane n'a pas de sens, et comme tu le dis il est meiux de ne pas avoir à afficher la page Web.
Oui je peux t'aider :)
Ce que tu dois faire c'est simplement poster vers le serveur une rêquete construitre sur l'URL de l'image. Le plus simple est d'utiliser la classe HttpURLConnection. Quand le serveur répond tu lit les octets dans le flux associés ezt tu as aisin ton image "en direct".
Voici un début de code que tu adapteras facilement à tes besoins
merci beaucoup !!!!
je vais regarder cela!
Comme je le disais dans mon autre post, je te prie de m'excuser pour mon empressement ... j'aurai du attendre la reponse de celui ci...
il y a quand meme un truc que j'ai un peu (beaucoup ) de mal a comprendre.
Dans l'exemple que tu me donnes , si j'ai bien compris, on lit directement la page web demandée.
Mais je ne vois pas comment je genere un fichier .jpg (ou gif ...) a partir de ce flux de données. Si j'ecris directement dans un fichier le code Html n'est pas interpreté (c'est pour ca qu'au depart je voulais utiliser un JTextPane, c'est pour son interpreteur Html)
J'ai vu qu'il existait la classe FileImageOutputStream mais je ne vois pas a quel moment on interprete le code Html afin de generer une instance de Image.
Est ce que j'ai mal compris comment cela fonctionnait ou ai je mal expliquer ce que j'attendais (ce qui est fort probable lol)
merci beaucoup pour ta preciseuse aide.
bien Cordialement
autre remarque d'ordre plus gle : comment fais tu pour afficher ton code dans une zone ou le text est bien formater.
JE sais que cela n'a rien a voir avec ma question mais je me dis que si j'ai l'occasion de mettre du code dans un cela sera plus lisible pour les autres lecteurs ...
merci
Très simple. J'ai mis dans l'URL http://www.programmez.com pour l'exemple, ainsi tu récupères le HTML de la page d'accueil de http://www.programmez.com.
C'était juste pour l'exemple.
Si tu donnes une URL de la forme
Le serveur va te servir l'image en question et rien qu'elle. Et toi en récupérant les octets dans le InputStream et en les écrivant dans un fichier tu vas générer le fichier de ton image automatiquement.
Regarde les boutons au dessus de la zone de texte où tu tapes tes messages. Ils te permettent d'insérer des balises BBCode "quote" (citation) "code", etc. :)
ok, effectivement j'ai mal expliqué ma demande.
Ce que je voudrais ce n'est pas recuperer l'image contenu dans une page web mais une sorte de "copie d'ecran" de toute la page web.
Je voudrais que, lorsque j'ouvre mon fichier jpg , je vois une image representant la page html (comme si j'avais ouvert mozzilla et que j'avais appuyer sur "impr Ecr" de mon clavier puis fait un coller dans un fichier jpg).
J'ai vu sur un forum que l'on pouvait faire des copies d'ecran... mais je voudrais juste la page html, pas l'ecran (fenetre + icone+ etc...) et ce, de façon automatique!
J'ai vu aussi que l'on pouvais generer une image d'un composant, ce que j'ai fait avec le JTextPane dans le code du debut.
Mais avec la class (cf au debut de la discussion) je suis obligé d'attendre que la page se charge dans le JTextPane pour en generer une image au format jpg.
Conscient d'avoir mal exprimé ma question j'espere que tu auras une idée pour resoudre mon problème...
Dans tous les cas merci de ton attention
C'est le moins qu'on puisse dire... :cry:
Ce que tu demandes est encore autre chose. Donc ça fait déjà deux fois que tu avais mal exprimé ta question.
La moindre des choses quand on demande de l'aide sur un forum c'est de poser une question claire et précise. Sinon ça décourage les bonnes volontés....
Et bien tu fais une capture de la fenêtre, tu interroges le système quant à la taille des bords de la fenêtre et tu découpes l'image en conséquence. Le tout par programmation donc automatiquement :)
Pardonne moi mais tu veux le beurre et l'argent du beurre là. Tu veux faire une capture d'écran d'une image dans un composant mais tu ne veux pas attendre que ça charge dans le composant....
Que d'exigence...
Je ne sais pas.
je me rend compte en lisant l'ensemble que mes posts, qu'effectivement mes demandes etaient tres peu clair... ceci est du au faite que pour moi memece n'etait pas clair.
Je te prie de m'excuser ... d'autant plus que, bien que je sois si peu claire, tu continue a me repondre!
La prochaine fois je tacherai de bien exposer mon problème.
Je te remercie pour toutes ces pistes
cordialement
Tu sais ça c'est un des problèmes principaux lorsqu'on doit développer quelque chose. Définir bien clairement ce qu'on veut faire, surtout au début du développement, ce n'est pas souvent facile.
Pas de problème.
Mais tu sais, je ne sais pas si tu dois suivre toutes ces pistes en fait. Il me semble que tu te lances dans quelque chose de difficile inutilement.
Fondamentalement pourquoi as tu besoin de faire ces capures de pages Web ?
Mon projet initial est d'envoyer des fax via un programme java
L'idée est que je recoive une page html sur le serveur (via une procedure client-serveur) et que cette page soit envoyer automatiquement via un fax.
Je dois passer par un fichier Html car pour la mise en page cela nous parraissait plus simple (surtout si on veut a l'avenir pouvoir mettre des logos ...)
J'ai trouvé un site (http://rreport.8m.com/RFax_help.html) qui propose (en demo) une api permettant l'envoie de fax.
Apparrement on peut mettre du code html qui sera interpreté.
J'ai donc essayer mais (d'ailleur il me semble que tu m'as aussi aidé pour ca !!!) les images incluses dans le code source html n'etaient pas envoyées.
Il y a donc deux problèmes :
1) envoyer du code html ou une image via mon logiciel de fax
Or bien que je suive les exemples donnés sur le site (meme ceux donnés dans la faq) je n'y arrive pas. Le code Html est bien interprété mais il ne trouve pas l'image (j'ai un logo carré brisé en diago , que l'on voit lorsque l'image n'est pas accessible)
2) Afin d'eviter ce problème nous nous etions demandé si nous ne pouvions pas assigner directement une image (générée prealablement) au JTextPane de l'application de fax. Mais vu que dans la bibli que fourni le site la majeur partie du code source n'est pas dispo et que je suis (tres) loin d'etre un boss en java j'ai du mal a trouver la bonne solution (et les bonnes questions :wink: )
Mais bon .. la encore ce la se solde pas un echec :cry: mais je vais perseverer !!
Je vais essayer d'orienter mes recherches sur le problème des images qui ne sont pas interpretées dans le code HTML
Dans mon repertoire (F:\testrfax) j'ai les fichiers suivants :
comm.jar
commtest.jar
rfax.jar
test.bat ( contient une ligne : "C:\Program Files\Java\j2re1.4.2_03\bin\java" -jar commtest.jar)
win32com.dll
test.jpeg
dans l'appli donné (en demo) sur le site il y a une zone ou l'on peut rentrer du code HTML.
Dans la faq ils disent de faire comme ceci
j'ai donc mis le code suivant
j'ai aussi essayer de mettre le code suivant
mais sans succes
Voila j'espere que mes explications sont plus claires ...
ps : je sais que (si mes souvenirs sont bons) java n'est pas forcement le meilleur langage pour toi mais je n'ai pas trop le choix :wink:
On dirait bien en effet.
parce que leur bazar ne résoud pas les liens vers le serveur qui contient la page je pense. C'est sans doute d'ailleurs pour cette raison qu'ils te disent de faire:
Pour avoir l'image en local quoi.
Oui c'est maintenant très clair.
Ca devrait pourtant marcher puisqu'ils le disent.
Tu as essayé de charger ta page FAX Example dans un navigateur pour voir. Histoire de voir s'il n'y a pas une erreur bête dans un lien ?
Tes souvenirs sont excellents :)
Java ... pff ... :twisted:
On te l'impose ?
Effectivement je pense que cela devrait fonctionner, je vais regarder si ce n'est pas une histoire de PATH. et je vais faire le test dont tu parles.
J'ai ecris un mail a la societé qui fournis cette api , on verra bien ce qu'il en est.
J'ai vu que l'on pouvais aussi envoyer des données au format PDF, je vais essayer pt etre que mon problème pourra etre ainsi contourné (mais franchement ca m'enerve de pas comprendre pourquoi ca ne fonctionne pas ...)
Pour repondre a ta question, on ne peut pas dire que l'on me l'impose, disons que je veux me remettre au java (la derniere fois que j'en ai fait c'etait a la fac il ya 5-6 ans) et je voudrais pouvoir faire une appli qui serve a quelque chose (pour une fois lol). et puis c'est vrai que ca peut etre un ptit plus pour mon cv ( oui je sais le java c 'est pas forcement un plus :wink: )
Ca doit bien faire 5 fois que je le repete mais honnetement c'est super cool de repondre à ce genre de post. Je sais pas comment mais c'est vrai que ca meriterai un ptit retour !
Passe une bonne soirée
salut
bon j'ai ecris au support technique de Rfax qui m'a repondu ceci
j'ai fait exactement ce qu'ils m'ont demandé (si si parfois je fais ce que l'on me demande :wink: ) mais sans succes ...
Je les ai prevenu ... j'attend de voire.
J'en viens a me demander si cela fonctionne vraiment
En plus j'ai récupérer le code source de class de l'api (en decompilant les class contenu dans le .jar)
A aucun moment ils affichent (en plus je l'aurai vu apparaitre à l 'ecran) le contenu du JEditorPane. Donc je vois pas comment ils peuvent generer une image a partir du fichier Html (qui contient lui meme une image)
enfi bon c'est à suivre ...
a+
Quand même ça doit fonctionner leur truc. C'est du Java mais quand même ;)
Tu as le droit de faire ça :?: :)
C'est quand même curieux chez toi cette obsession du JEditorPane.
Comme un navigateur affiche-t-il une page web ? Il obtient le source HTML de la page auprès du serveur, il l'interprète, éventuellement il interprète les url d'images et les charge ;) et il fait un rendu du tout.
Pourquoi leur bidule ne ferait-il pas pareil ? Sans JEditorPane je veux dire. Moi je n'ai rien vu à propos de JEditorPane sur le site (j'ai regardé rapidement il est vrai) Par contre j'ai vu qu'il y avait une interface à implémenter...
bon j'ai un retour du support technique ...
Au final ils m'ont filé le code source d'une des classe (HtmlFaxProducer) (celle que justement j'avais decompilée. Je sais bien que je n'ai pas le droit mais le faite de pas comprendre m'enervait trop :oops: ...)
Et effectivement c'est cette classe qui utilise le JTextPane (en faite si tu regarde dans la Faq ils en parlent , en gros ils disent que Rfax peut interpreter tous les formats que JTextPane ou de JEditorPane peuvent interpreter ... ). Mais ils ne comprennent pas pourquoi ca marche pas , voila cequ'ils m'ont repondu
Donc j'ai plus ou moins reussi a generer mon fax mais je suis obligé de faire apparaitre une fenetre contenant l'image a envoyer ( d'ou le fameux JTextPane :wink: )
En faite la technique que j'utilise c'est de passer ma propre image (classe Image) et non celle qu'ils sont sencés generer... JE sais c 'est pas propre mais pour l'instant j'ai pas d'autre solution...
Je te tiens au courant
a+
Je dois dire que je ne comprends pas non plus. Pourquoi ne voient-ils pas la "broken image icon" ?
J'en ai une bien propre, je viens juste d'y penser.
Ecris toi même ton moteur de rendu HTML :)
Trop difficile, trop de boulot ? Pas sûr. Toi qui es un fan de JTextPane ;)consulte les sources de la JDK, vois comment ils interprètent les balises HTML pour les afficher, et fais qcq chose à partir de ça. Tant que c'est une appli perso, ça ne doit pas poser de pb de licence de pomper un peu de code :)
hello Mr
Effectivement je pourrai recoder mon propre interpreteur Html... mais bon ne nous dispersons pas, je vais d'abord finir mon projet et on verra par la suite si je suis tjrs motivé lol.
Au final j'ai implementé (je sais pas si tu as eu le courage de regarder l'api que RFax propose) l'interface FaxProducer. en gros j'ai fait mon propre HtmlFaxProducer... A part le faite que j'ai une fenetre qui s'ouvre pdt 10s pour generer l'image , cela fontionne pas mal du tout.
Mon prochain objectif c'est en 1er lieu de trouver l'evenement envoyé quand mon image est bien chargée dans mon super pote le JTextPane :wink: , (pour l'instant je fait une pause de 10s...)
Le 2e objectif c'est d'essayr de trouver un moyen de ne pas afficher la page du tout ... mais bon ca je pense que ca doit deja etre un peu plus coton...
si ca t'interresse je te tiendrais au courant!
Passe une bonne journée
ps : J'ai deja lu Programmez! mais une fois ou deux... pourquoi tu fais partis de la redaction ?
Hello :)
:)
Ah ma foi non ;)
Je ne pense pas que l'événement existe. Si je devais faire ça, j'essaierais à partir de la méthode getStream du JEditorPane. Surveiller le stream devrait pouvoir permettre de s'enquérir de l'avancement des opérations. Enfin je pense... Je ne l'ai jamais fait.
Pas nécessairement si tu as résolu ton premier point. Bon les types ont dit ça: "we a trying to use in the background which seems to lead to problem with the threads that load images" Mais si tu surveilles ce fameux stream et éventuellement l'existence d'autres threads tu peux peut être arriver à gérer ça.
Oui ça m'intéresse en effet.
Ben oui, depuis le tout début :)