1. #1
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut Freehep dessin vectoriel et PDF

    Bonjour,

    je cherche à faire du dessin vectoriel dans un PDF afin d'un mettre des dessins et du texte.
    J'ai testé plusieurs lib mais elles ne permettaient pas de mettre du texte.

    J'ai atterri sur freehep et sa multitude de JAR associés.
    Déjà à ce niveau je ne suis pas sûr d'avoir tout bien paramétré correctement dans mon projet. (Si tu l'utilises et que tu peux m'aider ce serait génial !)

    Ensuite j'ai enfin réussi à générer un PDF.
    Sauf que je ne pige pas bien le fonctionnement, j'ai des blancs pas possible en haut et en bas de ma page (1/6 de la page en haut, idem en bas et sur les coté je dirais 1cm)
    Le dessin donc ne part pas d'en haut, et je ne comprends pas le lien avec l'objet dimension dans cette fenêtre de dessin.

    Mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public static void main(String[] args) throws FileNotFoundException {
    		// Comment faire pour le format A3 du pdf
    		PDFGraphics2D graphics = new PDFGraphics2D(new FileOutputStream(FILE_OUT), 
    													new Dimension(200, 200));
     
    		Properties properties = new Properties();
           // properties.setProperty(PDFGraphics2D.ORIENTATION, "PORTRAIT");
           // properties.setProperty(PDFGraphics2D.PAGE_SIZE, "A3");
            properties.setProperty(PDFGraphics2D.PAGE_MARGINS, "0");
     
     
    		graphics.startExport();
    		graphics.setStroke(new BasicStroke(3));
    		graphics.setPaintMode();
    		graphics.setClip(0, 0, 297, 420);
    		//graphics.setBackground(Color.GRAY);
    		//graphics.setProperties(properties);
     
    		graphics.drawLine(0,0,200.0,0);
    		graphics.setColor(Color.GREEN);
    		graphics.drawLine(0, 10, 300, 10);
    		graphics.setColor(Color.CYAN);
    		graphics.drawLine(0, 20, 350, 20);
    		graphics.setColor(Color.black);
    		graphics.drawLine(0, 30, 570, 30);
     
    		graphics.setColor(Color.gray);
    		graphics.drawLine(1.0,-145.0,200.0,250.0);
    		graphics.drawLine(1.0,1.0,200.0,250.0);
    		graphics.drawLine(1.0,100.0,200.0,250.0);
    		graphics.endExport();
    S'il y a quelqu'un qui a déjà utilisé cet lib et peux me donner des conseils sur comment gérer les différents formats (A3-A4 ....) et bien faire partir les dessins avec l'axe x,y (0,0) en haut à gauche comme sur d'autres lib que j'ai pu trouver je suis preneur.

    Merci.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Salut,

    J'ai utilisé freehep y'a bien dix ans, mais j'avais abandonné cette API parce que super boguée, lente, et plus supportée. Et l'orientation Java2D était séduisante au début pour éviter d'écrire le code en double entre impression et export PDF, surtout qu'à l'époque on n'avait pas de lecteur PDF systématique sur les machine, mais elle s'est avérée assez limitée et les problèmes rencontrés étaient vraiment très gênants (de mémoire, si je me souviens bien, on avait des décalages inattendus (translations), et ça ressemble assez à ce que tu décris).

    Des bibliothèques très bien faites comme PDFBox (Apache) ou IText proposent des solutions alternatives (on ne fait pas du Java2D, mais on peut si on veut) mais beaucoup plus complète et on trouve beaucoup plus de documentation et d'exemples.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Merci pour ta réponse.

    La dernière release date de 2014, j'imagine que certaines choses on du être corrigé !

    avec les bibli que tu proposes ca fait du vectoriel et mélange dessin, ajout d'image, et de texte vectoriel ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par zulot Voir le message
    avec les bibli que tu proposes ca fait du vectoriel et mélange dessin, ajout d'image, et de texte vectoriel ?
    Oui.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Je regarde actuellement pdfbox d'appache qui m'a amené vers un lib graphics2d par rotor qui permettrait de dessiner, et sur une autre lib openhtmltopdf qui permet du texte enrichie via html ...
    Pour l'instant je fais mon trie, mais je repars pour la 3ème fois de zéro !

    Je n'ai pas regardé IText encore.

    Si tu as des url avec des exemples de code je suis preneur.
    Mes trois besoin sont :
    • dessiner des lignes (path) paramétrables, et autre forme géometrique
    • ajouter du texte en changeant la forme et la position
    • ajouter de petites images à certaines positions

    Tout ca en vectoriel dans un PDF

    Choisir le format du PDF est aussi important. (A3-A4 ... pas de bordure)

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Pour PDFBOX, la bibliothèque dont tu parles permet d'utiliser la même API que Graphics2D, mais il y a une API standard tout à fait suffisante pour dessiner en vectoriel (voir PDFGraphicsStreamEngine). Sur Tutorials Point, il y a pas mal de tutoriels comme "Creating Boxes in a PDF Document" par exemple, qui montre comment récupérer le content stream et créer un rectangle. La doc de l'API est pas mal aussi pour voir ce qu'on peut faire : https://pdfbox.apache.org/docs/2.0.8...entStream.html. Le tracé de ligne passe par moveTo et lineTo, des méthodes assez classiques dans ce genre de systèmes (qu'on retrouve dans la classe Java Path2D par exemple). Il y a aussi des packages d'exemples (notamment un qui étend le "Stream Engine").

    Pour IText, il y a le site d'origine qui propose de très bons et nombreux tutoriels (https://developers.itextpdf.com/cont...ext-5-examples, https://developers.itextpdf.com/exam...ics2d-examples, https://developers.itextpdf.com/exam...ion/chapter-15...).
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Merci pour toutes ces informations ! (Je viens de mettre 1mois de recherche à la poubelle lol)
    Par contre question bêtes tout ce dont tu parles ca dessine bien en vectoriel ?

    J'ai été faire un tour sur IText, du coup je me pose une question, c'est quoi la différence entre IText et PDFbox?
    Je n'ai pas trouvé comment creer un shape par exemple avec IText pour ensuite le dessiner.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par zulot Voir le message
    J'ai été faire un tour sur IText, du coup je me pose une question, c'est quoi la différence entre IText et PDFbox?
    Ce sont deux bibliothèques de génération de PDF en Java (et dotnet pour Itext), les plus connues. IText est la plus ancienne et très utilisée dans l'industrie (et existe en version payante). PDFbox est plus récente et est une projet Apache. Le type de licence n'est pas le même : AGPL pour IText et Apache Licence 2.0 pour PDFBox, toute deux basées sur GPL.

    Je n'ai pas trouvé comment creer un shape par exemple avec IText pour ensuite le dessiner.
    voir ici, ensuite pour dessiner une java.awt.Shape, tout dépend de la Shape. Pour une forme standard, genre cercle, rectangle, tout ça, il y a les classes dédiées (java.awt.geom) et sinon Path2D est vraiment pour moi la plus pratique. Graphics2D.draw( Shape ) ensuite pour dessiner.

    Je ne sais pas ce que tu as besoin de dessiner, mais selon les cas, il peut être intéressant de traiter le dessin vectoriel en SVG. Par exemple tu fais ton SVG sous inkscape. Si c'est une forme "standard", on peut trouver ça tout fait sur Internet (gratuitement) : on trouve par exemple des polices vectorielles, des bibliothèques d'icônes, les symboles de schémas électriques, des formes comme les régions ou les pays, etc. C'est pour ça que je t'ai donné le lien sur le Chapitre 15 : tu y trouveras un exemple de programme SvgToPdf.java (utilise Batik une autre bibliothèque, donc tu peux aussi l'utiliser avec PDFBox) pour dessiner du SVG directement.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    T'es une source de connaissance incroyable !

    Inkscape ne va pas correspondre à mon besoin.
    J'ai des données et ces données par des traitements algorithmique ressortent sous une forme. (Le dessin doit être fait automatiquement à la demande suivant paramètre mais là on s'éloigne)
    Ca peut être très simple comme des traits, ou rond, voir très compliqué avec changement de couleurs, et formes plus ou moins complexes.
    Je complète le document par du texte (vectoriel) et parfois quelques petites images (noir et blanc)

    Et comme je débute avec les lib Graphics2D, j'essaie de comprendre l'imbrication de tout ça.

    J'ai mon protocole de validation des librairies étapes par étapes qui me permet d'apprendre à m'en servir aussi.
    • generer PDF
    • modifier le format (A3-A4)
    • ajouter traits
    • ajouter String
    • ajouter image
    • creation shape complexe

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Je viens de m'apercevoir d'un truc, entre Itext5 et IText7 il n'y a pas d'exemple Graphics2D dans IText7 ...

    Pour toi, si je dois faire un graphics, vaut mieux que j'utilise IText5?

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Normalement, il n'y a pas de raison qu'une version plus récente fasse moins de choses qu'une version plus ancienne. Je n'ai pas trop suivi les dernières versions, donc je ne sais pas ce qui a changé, s'il y a des choses qui ne sont plus supportées par exemple. A priori, ils ont ajouté certaines interfaces, pour que ça soit plus pratique, plus intuitif. C'est ce que dit la présentation. Comme effectivement on ne trouve pas les exemples Graphics2D pour IText7, et surtout on ne trouve pas de classe PDFGraphics2D dans l'API, je t'ai donné la doc de IText5. Maintenant, ça c'est si tu veux absolument utiliser l'interface Graphics2D. Tout est faisable directement par la classe PdfCanvas, simplement les interfaces ne sont pas tout à fait complètement identiques (maintenant, ce n'est pas non plus tellement différent que ça pourrait être incompréhensible : les méthodes sont quasiment les mêmes avec parfois des différences (genre release dans PDFCanvas et dispose dans PDFGraphics2D) et le principe similaire.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Merci encore mille fois pour tes réponses.

    Du coup j'ai fait pas mal de tests et tu m'as fait me soulever une question.
    Pourquoi ne pas utiliser le format SVG ? Si l'utiliser quelle bibliothèque aujourd'hui est la mieux ?

    Maintenant que je commence à toucher à la bibliothèque graphics2D je n'arrive pas bien à comprendre le lien entre la taille de la zone et sa valeur.
    Je m'explique, est ce des pouces, des cm, des pixels ...
    si je veux faire une image de 30x40cm, comment définir la taille de mon graphic ?

    Car à mon avis le mieux est de décorréler mon dessin du format de sortie.
    En gros je dessine et maitrise sa taille (voir plus haut) et ensuite je me décide en format de sortie. A moins que le format de sortie ait des impacts sur comment dessiner ?

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par zulot Voir le message
    Pourquoi ne pas utiliser le format SVG ? Si l'utiliser quelle bibliothèque aujourd'hui est la mieux ?
    Une bibliothèque pour quoi .
    1. générer du SVG ?
    2. dessiner du SVG ?
    3. bibliothèque de fichier SVG ?


    Pour les deux premières questions, je ne connais que Batik et JFreeSVG. Laquelle est la mieux, difficile à dire. Batik est lourd mais très complet, et permet de faire le rendu. JFreeSVG est plus légère et plus rapide que Batik, mais il me semble que ça ne permet que de générer du SVG (à l'aide d'une classe qui étend Graphics2D).

    Citation Envoyé par zulot Voir le message
    Maintenant que je commence à toucher à la bibliothèque graphics2D je n'arrive pas bien à comprendre le lien entre la taille de la zone et sa valeur.
    Je m'explique, est ce des pouces, des cm, des pixels ...
    si je veux faire une image de 30x40cm, comment définir la taille de mon graphic ?
    C'est un vrai problème. Graphics2D n'est pas censé gérer les dimensions métriques. Sa taille est infinie. L'unité des coordonnées dépend de l'implémentation. Avec un Graphics2D créé pour dessiner à l'écran, ce sont des pixels. Avec un Graphics2D créé pour autre chose, et bien, ça dépend de cet autre chose. Pour une bibliothèque PDF, je dirais que logiquement (à vérifier dans la doc), l'unité c'est l'unité standard PDF, donc le point (1/72ème de pouces).

    Citation Envoyé par zulot Voir le message
    Car à mon avis le mieux est de décorréler mon dessin du format de sortie.
    C'est aussi mon avis. Générer une forme vectorielle (SVG, Java2D) et l'adapter (AffineTransform) au moment de la sortie dans le format final.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Citation Envoyé par joel.drigo Voir le message
    Une bibliothèque pour quoi .
    1. générer du SVG ?
    2. dessiner du SVG ?
    3. bibliothèque de fichier SVG ?
    Une bibliothèque pour faire un dessin ( à partir de graphics2D? ) et l'enregistrer en SVG.

    Du coup JFreeSVG répondrait à mon besoin. (A voir les fonctionnalités bien sur)

    Citation Envoyé par joel.drigo Voir le message
    C'est un vrai problème. Graphics2D n'est pas censé gérer les dimensions métriques. Sa taille est infinie. L'unité des coordonnées dépend de l'implémentation. Avec un Graphics2D créé pour dessiner à l'écran, ce sont des pixels. Avec un Graphics2D créé pour autre chose, et bien, ça dépend de cet autre chose. Pour une bibliothèque PDF, je dirais que logiquement (à vérifier dans la doc), l'unité c'est l'unité standard PDF, donc le point (1/72ème de pouces).
    AHHAHA justement l'information que je ne trouve jamais !
    Mais on ne peut pas limiter de base l'air de dessin en JAVA2D/Graphics2d ?
    Un bon tutoriel graphics2D à conseiller ?


    Citation Envoyé par joel.drigo Voir le message
    C'est aussi mon avis. Générer une forme vectorielle (SVG, Java2D) et l'adapter (AffineTransform) au moment de la sortie dans le format final.
    Encore de belles recherches en perspective pour moi sur ce AffineTransform !

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par zulot Voir le message
    Mais on ne peut pas limiter de base l'air de dessin en JAVA2D/Graphics2d ?
    Et bien pas le "graphics2d" en lui-même. C'est le "destinataire final" qui impose ses limites. Mais en cas de clipping. Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_ARGB); // je créer une image de 100x100 pixels
    Graphics2D graphics = image.createGraphics(); // récupération du graphics pour dessiner dans l'image
     
    graphics.setColor(Color.RED);
    graphics.fillRect(-50000,25,50000,50); // je dessine un rectangle qui déborde largement de mon image, mais évidemment mon image ne change pas de taille pour autant
     
    graphics.dispose();
    Citation Envoyé par zulot Voir le message
    Un bon tutoriel graphics2D à conseiller ?
    Non, je n'en connais pas vraiment, de simple et complet. Le tutoriel d'Oracle, comme pas mal d'autres et une présentation plus ou moins exhaustive, mais très technique. La plupart que je connais sont ciblés sur un aspect donné, ou sont une simple introduction.


    Citation Envoyé par zulot Voir le message
    Encore de belles recherches en perspective pour moi sur ce AffineTransform !
    Pour le coup, cette partie est plutôt simple et intuitive. Si tu sais ce qu'est une translation, une homothétie et une symétrie axiale, et une rotation (le dernier cas est moins utile, voire inutile dans ton cas, le shear/cisaillement); ça ne devrait que te prendre le temps de lire la javadoc.

    Dans les trucs sympas de java.awt.geom, il y a aussi les Area (pour faire du "csg").
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Alors j'avance bien je dessine, je joue avec les stroke les color, je m'habitue a toute la lib.

    Par contre je ne comprends pas très bien comment fonctionne les Path et PathIterator.
    N'est il pas possible de changer la couleur pendant le dessin du Path ?

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par zulot Voir le message
    Par contre je ne comprends pas très bien comment fonctionne les Path
    Les Path2D se dont des polylignes, continues, ou discontinues, ouvertes ou fermées, qu'on construit en partant d'un point, en avançant soit en ligne droite, soit en courbe (bézier par exemple).

    Citation Envoyé par zulot Voir le message
    et PathIterator.
    Ceci sert surtout à se déplacer sur un Path2D. Par exemple, on peut utiliser Path2D pour générer une trajectoire, la convertir en PathIterator, avec un pas, puis itérer sur le PathIterator pour déterminer les coordonnées successives d'un mobile.

    Citation Envoyé par zulot Voir le message
    N'est il pas possible de changer la couleur pendant le dessin du Path ?
    Non. Avec Graphics2D, ce ne sont pas les formes qui portent la couleur, mais le pipe. Pour gérer ça, soit, on gère ça par appels successifs soit pour simplifier, avec une couche intermédiaire, par une classe spécifique.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Merci pour ces réponses.

    J'ai joué avec Batik, j'ai généré mon canvas.
    Avec tes explications d'unité SVG, j'ai pris comme principe 300dpi, j'ai donc pour du 30x40cm un canevas de 3543x4724
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    graphics.setSVGCanvasSize(new Dimension(3543,4724));
    J'ai mon objet SVGGraphics2D, avec tous ses dessin et string en shape/

    Maintenant j'aimerais le transformer soit en PDF en choisissant le format PDF (A3, A4, 30x40 ...) ou en PNG en ayant le format qui va bien (A3, A4, 30x40 ...)
    Sauf que je but sur la transformation en pdf, ou en image à la bonne taille.

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : décembre 2004
    Messages : 688
    Points : 360
    Points
    360

    Par défaut

    Bonjour,

    Je viens de tomber sur un soucis avec la librairie de Batik.
    Comment avec la fonction drawString dessiner un saut de ligne de ma variable ?
    \n ou \n\r n'est pas pris en compte ca les supprime et colle mon texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void drawTitle() {
    		String text = "Bonjour\n\rComment va?";
    int x =10; int y =10;
    		this.drawString(text, x, y);	
    	}
    Affichage
    BonjourComment va?

  20. #20
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 647
    Points : 25 278
    Points
    25 278
    Billets dans le blog
    2

    Par défaut

    Salut,
    Citation Envoyé par zulot Voir le message
    Comment avec la fonction drawString dessiner un saut de ligne de ma variable ?
    On ne peut pas. C'est drawString, pas drawText

    Comment faire alors ?

    Comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    String string = "Ligne 1\n    Ligne 2\nLigne 3"; \\ le texte
     
    float x=0; // coordonnées gauche du début du texte
    float y=25; // attention, y de la baseline
    int maxWith = Integer.MAX_VALUE; // la largeur max sur laquelle on veut écrire, ici comme c'est juste pour passer à la ligne sur \n, je mets le max 
     
    AttributedString text = new AttributedString(string);
     
    // tu peux ajouter d'autres styles (couleurs, taille, graisse, etc.), mais il faut au minimum la police
    Font font = new Font("Arial",Font.BOLD,30); 
    text.addAttribute(TextAttribute.FONT, font);
     
     
    AttributedCharacterIterator iterator = text.getIterator();
    LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, g2d.getFontRenderContext()); // on peut configurer la façon dont le texte wrap (voir BreakIterator)...
    measurer.setPosition(0);
    while (measurer.getPosition() < string.length()) {
    	    	int next = measurer.nextOffset(maxWith); 
    	    	int end = measurer.getPosition()+next;
    	    	int linebreakpos = string.indexOf( '\n', measurer.getPosition()+1); // adapter en fonction du caractère de séparation
    	    	if( linebreakpos != -1 && next > (linebreakpos - measurer.getPosition()) ){
    	    		end = linebreakpos;
    	    	} 
    		TextLayout layout = measurer.nextLayout(maxWith, end, false/*à ajuster selon besoin = dernier mot inclus ou pas*/);
     
    		y += layout.getAscent();
    		// si gestion rtl, à la place de la ligne suivante, faire (mais il faut paramétrer maxWith pas au max) : layout.draw(g, x + (layout.isLeftToRight() ? 0 : (maxWith - layout.getAdvance())), y);
    		layout.draw(g2d, x , y);
    		y += layout.getDescent() + layout.getLeading();
    }
    Comme tu parlais de texte vectoriel, sache que TextLayout permet de générer les Path2D, et plein d'autres choses.

    Les imports au cas où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import java.awt.font.LineBreakMeasurer;
    import java.awt.font.TextAttribute;
    import java.awt.font.TextLayout;
    import java.text.AttributedCharacterIterator;
    import java.text.AttributedString;
    // import java.text.BreakIterator;


    Si tu as plusieurs textes, tu peux avoir intérêt à te faire une petite classe.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [Lazarus] Dessin vectoriel ou MetaFileCanvas
    Par pdufresn dans le forum Lazarus
    Réponses: 6
    Dernier message: 01/06/2006, 11h34
  2. Dessin vectoriel 2D : librairies, docs, etc.
    Par lio33 dans le forum MFC
    Réponses: 3
    Dernier message: 24/05/2006, 14h43
  3. Dessin vectoriel et PHP
    Par Pagan dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/05/2006, 23h32
  4. Dessin vectoriel avec Python
    Par cboudy dans le forum PyQt
    Réponses: 2
    Dernier message: 04/04/2006, 22h38
  5. Dessin vectoriel
    Par Speed41 dans le forum Langage
    Réponses: 6
    Dernier message: 16/08/2004, 08h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo