IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Largeur en cm d'une chaine de caractère postscript ?


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut Largeur en cm d'une chaine de caractère postscript ?
    Bonjour a tous,

    En fait je développe une application destiné a créer un fichier postscript afin de lancer une impression. (sous linux avec kdevelop)

    J'ai pas mal potassé a ce sujet mais cependant je bloque sur une chose : trouver la longueur en cm d'une chaine de caractère.

    En effet, je crée mon fichier postscript et je dois afficher des messages a certains endoits et pour cela je dois savoir la largeur de ma chaine en cm !!!! voici mon choix de police:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(ps_file, "/Times-Roman findfont\n16 pt scalefont\nsetfont\n");
    je suis donc en 16 point ( de hauteur !!). Il m'est donc assez facile de convertir ces points en cm pour trouver la hauteur de ma chaine mais en revanche je n'arrive pas a calculer sa largeur !!! Je n'ai non plus pas trouvé d'explications sur le web ???

    Voila , si quelqu'un pouvait m'aider a ce sujet...

    Merci par avance a tous.

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Ça n'a rien à voir avec le C.

    Regarde les fichiers PFM (Postscript Font Metric).

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Bonjour,

    Pourquoi ne pas faire faire le calcul par postscript [1] ?

    Cordialement,
    DS.

    [1] - Qui, pour rappel, est un langage de programmation et offre pas mal de fonctionnalités...

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut
    Ça n'a rien à voir avec le C.
    C'est vrai mais je ne savais pas ou placer ce post du tout. Dsl si je ne sui pas dans la bonne section. J'airegardé du coté de fichiers pfm mais ils ne m'avancent pas a grand chose je ne trouve pas la largeur des caractères.

    Pourquoi ne pas faire faire le calcul par postscript [1] ?

    -->pas compris ce que tu veux me montrer !!!
    Je réalise déjà une conversion postscript mais je recherche la largeur d'une chaine de caractère ...

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par Novice10
    -->pas compris ce que tu veux me montrer !!!
    Je réalise déjà une conversion postscript mais je recherche la largeur d'une chaine de caractère ...
    Là, tout de suite, je n'ai pas trop le temps de me replonger dans ma doc., mais il me semble qu'il y a une fonction PostScript qui permet de renvoyer la largeur d'une chaîne à partir de la police.

    ...attends...

    Tiens, regarde à http://www.capcode.de/help/Fonts et plus particulièrement http://www.capcode.de/help/stringwidth.

    Tu pourrais soit déporter une partie de tes opérations dans le programme PostScript (et notamment ce qui touche aux calculs relatifs à la largeur de la chaîne), soit dynamiquement créer un script qui se contente de faire le calcul puis récupérer la valeur qu'il renvoie.
    Rappel : un programme en PostScript peut lire et écrire dans des fichiers...et pourquoi pas dans des tubes nommés, ce qui permettrait de "communiquer" avec ton programme.

    Je ne dis pas que c'est LA méthode, mais c'est une idée.

    Cordialement,
    DS.

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut
    Jusqu'à présent il est vrai que j'écrivais seulement dans mon fichiers postscript.

    D'après ce qu j'ai compris si j'utilise la fonction stringwidth, elle devrait me retourner les largeurs en x en en y mais ou les place t'elle ??? Je suppose que c'est a ce moment que je devrais lire mon fichier postscript???

    Désolé de toutes ces questions surtout si tu n'as pas le temps. Je suis un peu dérouté la par la complexité d'une telle chose!!!

    Si tu pouvais m'expliquer un petit peu plus. Je vais quand meme approfondir mes recherches dans ce sens. (de toute façon c'est la seule façon dont j'ai entendu parler puisque sur le web pas de réponse a ma question!)

    merci

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Postscript c'est un langage, tu peux faire ècrire à ton programme un programme postscript qui calcule lui-même les positions en tenant compte de la largeur et de la hauteur des chaînes.

    Dans un environnement plus contrôler, tu peux faire communiquer ton programme avec un programme postscript, au moyen de fichiers par exemple.

    Sinon tu as les TFM et les AFM qui contiennent toute l'information qu'il te faut pour calculer cela toi-même. Les AFM contiennent même des informations de kerning, pour réduire l'espace entre un A et un V de manière à avoir un résultat plus harmonieux.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par Novice10
    Jusqu'à présent il est vrai que j'écrivais seulement dans mon fichiers postscript.
    Et tu vas continuer.

    Citation Envoyé par Novice10
    D'après ce qu j'ai compris si j'utilise la fonction stringwidth, elle devrait me retourner les largeurs en x en en y mais ou les place t'elle ???
    Sur la pile. Le langage PostScript fonctionne avec une pile (plus d'une en fait). Pour appeler une fonction, on place les arguments nécessaires sur la pile, on appelle la fonction, elle dépile les arguments dont elle a besoin, elle fait son boulot et empile éventuellement un/des résultat(s) sur la pile.

    Citation Envoyé par Novice10
    Je suppose que c'est a ce moment que je devrais lire mon fichier postscript???
    Non. Ce n'est pas le fichier PostScript qu'il faut lire.

    Citation Envoyé par Novice10
    Désolé de toutes ces questions surtout si tu n'as pas le temps. Je suis un peu dérouté la par la complexité d'une telle chose!!!
    Ce n'est pas complexe, c'est juste, si je ne me trompe pas, que tu as du mal à comprendre que le PostScript est un langage de programmation...comme le Perl, le C, le Python, les scripts Shell, le JavaScript, etc...

    Citation Envoyé par Novice10
    Si tu pouvais m'expliquer un petit peu plus. Je vais quand meme approfondir mes recherches dans ce sens. (de toute façon c'est la seule façon dont j'ai entendu parler puisque sur le web pas de réponse a ma question!)
    Si tu veux je peux essayer de t'écrire un petit exemple (ou d'en retrouver un dans mes "cartons").
    En attendant, commence à lire ça : http://www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF. Au début, ils expliquent le principe de la pile, etc... Tu y verras peut-être plus clair.

    Pour mieux comprendre, tu peux essayer de sortir le PostScript de ton esprit. Imagines que tu écrives un programme qui crée un script en shell et que tu aies besoin d'une information que seul un script en shell puisse te donner. Que fais-tu ? Tu peux faire en sorte que ton programme crée un tube nommé, crée un script en shell qui écrivent dans le tube nommé, lance le script, lise ce que le script a écrit dans le tube puis crée un autre script à partir de l'information qu'il a lue.
    Dis-moi si c'est plus clair dit come cela...

  9. #9
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut
    Pour mieux comprendre, tu peux essayer de sortir le PostScript de ton esprit. Imagines que tu écrives un programme qui crée un script en shell et que tu aies besoin d'une information que seul un script en shell puisse te donner. Que fais-tu ? Tu peux faire en sorte que ton programme crée un tube nommé, crée un script en shell qui écrivent dans le tube nommé, lance le script, lise ce que le script a écrit dans le tube puis crée un autre script à partir de l'information qu'il a lue.
    Dis-moi si c'est plus clair dit come cela...
    Ok je vois ce que tu veux dire.

    Si tu veux je peux essayer de t'écrire un petit exemple (ou d'en retrouver un dans mes "cartons").
    Ah la je veux bien un petit exemple qui utilise stringwidth ! Sachant que j'utilise kdevelop et C.

    En attendant, commence à lire ça : http://www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF. Au début, ils expliquent le principe de la pile, etc... Tu y verras peut-être plus clair.
    Je m'y plonge de suite!

    Merci bien en tout cas de ton aide. C'est sympa.

  10. #10
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut
    Ok c'est bon merci bien David.Schris car j'ai compris l'utilisation de stringwidth.
    J'arrive meme a l'utiliser !! (pas mal pour un boulet comme moi !) Je suis très content..

    Cependant un petit doute subsiste encore: j'ai bien compris le principe de pile sur lequel repose le language postscrip mais comment sauvegarder une valeur que je viens de calculer ? Je voudrais par exemple, sauver la longueur d'une chaine et l'utiliser plus tard au cours de mon fichier postscript ?

    En fait dans mon programme c je voudrais analyser la longueur de plusieurs chaines de caractères, ensuite une fois que la chaine la plus longue est trouvé, je voudrais pouvoir definir une zone de travail par exemple qui sera fonction de la largeur de la plus longue chaine de caractère... Je sais pas si j'ai été clair ...

  11. #11
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut
    L'idéal (je sais pas si cela existe) serait que je puisse avoir la longueur de ma chaine au niveau de mon programme en c afin de faciliter la programmation !!

    Car en fait au début je recherche la longueur max pour une multitude chaine afin de réduire ma zone d'affichage ou de l'augmenter ne fonction cette largeur max.

    Voila, si vous avez une idée pour ce petit problème. En tout cas, j'ai réussi a utiliser stringwidth et cela fonctionne mais cela m'empeche de tester cette valeur dans mon programme en c...

    merci

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par Novice10
    L'idéal (je sais pas si cela existe) serait que je puisse avoir la longueur de ma chaine au niveau de mon programme en c
    Si par "avoir" tu veux dire calculer, regardes le troisième point du dernier message de Jean-Marc. Mais...

    Citation Envoyé par Novice10
    afin de faciliter la programmation !!
    ...à moins de trouver une bibliothèque qui fasse le travail pour toi, je ne suis pas certain que cela facilite les choses. D'un autre côté, cela te permettrai d'être indépendant d'un interpréteur Postscript.

    Citation Envoyé par Novice10
    Car en fait au début je recherche la longueur max pour une multitude chaine afin de réduire ma zone d'affichage ou de l'augmenter ne fonction cette largeur max.
    Comme déjà dit, tu peux le faire à deux endroits : dans ton programme C ou dans le programme PostScript.

    Citation Envoyé par Novice10
    Voila, si vous avez une idée pour ce petit problème. En tout cas, j'ai réussi a utiliser stringwidth et cela fonctionne mais cela m'empeche de tester cette valeur dans mon programme en c...
    L'un n'empêche pas l'autre. Tiens, un petit exemple connu pour la route : pshttpd, un serveur web écrit en Postscript.

    Citation Envoyé par Novice10
    Cependant un petit doute subsiste encore: j'ai bien compris le principe de pile sur lequel repose le language postscrip mais comment sauvegarder une valeur que je viens de calculer ? Je voudrais par exemple, sauver la longueur d'une chaine et l'utiliser plus tard au cours de mon fichier postscript ?
    Ca, c'est facile.
    Pour donner un nom à une valeur constante, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /maValeurSauvegardee 16 def
    Pour donner un nom à une valeur qui est au sommet de la pile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /maDeuxiemeValeurSauvegardee exch def
    Tu veux un tableau ?
    Pas de soucis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    26 array
    (A) exch (E) exch (I) exch (O) exch (U) exch
    astore
    /voyelles exch def
    Tu veux le Nième élément du tableau ?
    Facile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /leEnieme 3 def
    % ...blablabla...
    voyelles leEnieme get
    % ...le suivant ?
    leEnieme 1 add
    voyelles exch get
    Vu ?

    Je vais essayer de te préparer un petit exemple ce soir ou (plus probable) demain après-midi.

  13. #13
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut
    Sinon tu as les TFM et les AFM qui contiennent toute l'information qu'il te faut pour calculer cela toi-même. Les AFM contiennent même des informations de kerning, pour réduire l'espace entre un A et un V de manière à avoir un résultat plus harmonieux.
    En effet, en observant les fichiers afm on voit une multitude de parametres mais je ne trouve pas le ficher afm correspondant a ma police (times new roman).
    Il est vrai que la meilleure chose pour moi serait de calculer la longueur d'une string directement dans mon programme c mais cela me semble très compliqué a faire !


    Citation:
    Novice10 a écrit :
    Voila, si vous avez une idée pour ce petit problème. En tout cas, j'ai réussi a utiliser stringwidth et cela fonctionne mais cela m'empeche de tester cette valeur dans mon programme en c...
    L'un n'empêche pas l'autre. Tiens, un petit exemple connu pour la route : pshttpd, un serveur web écrit en Postscript.
    La j'ai pas compris ce que tu veux dire. Pourais-je récupérer cette valeur au niveau de mon prog C afin de l'utiliser ???? NB: le lien ne marche pas, lorsque je clique sur les fichiers cela me dit que les fichiers sont introuvables .

    En tout cas, c'est sympa de voir que ces forums sont hyper actifs et a l'écoute des débutants.

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par Novice10
    La j'ai pas compris ce que tu veux dire. Pourais-je récupérer cette valeur au niveau de mon prog C afin de l'utiliser ????
    Oui.

    Premier exemple : un script en shell qui récupère une valeur générée par un script en Postscript.
    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
    33
    34
    35
    36
    37
    38
    39
    40
    [d_schris@mojo.internal.doubleclick.net postscript]$ cat testOutput1.ps
    % Exemple d'un script écrivant un nombre
    % aléatoire sur la sortie standard.
     
    % On utilise "l'heure" actuelle pour initialiser la graine
    % du générateur.
    realtime 1000 mod srand
     
    % Génère un entier pseudo-aléatoire et le place sur la pile
    rand
     
    % Ecrit la représentation textuelle de l'élément qui est sur
    % la pile (l'entier pseudo-aléatoire) sur la sortie standard.
    =
    [d_schris@mojo.internal.doubleclick.net postscript]$ cat testOutput1.sh 
    #!/bin/bash
     
    #  Appel/exécution du script Postscript générant un nombre pseudo-aléatoire
    #+ et récupération de la valeur
    nombreGenere=`gs -q -dBATCH -sDEVICE=nullpage testOutput1.ps`
    valeurRetour=$?
     
    [[ ${valeurRetour} -ne 0 ]] && { echo "L'exécution du script a provoqué l'erreur n°${valeurRetour}" >&2 ; exit 1 ; }
     
    echo "Nombre généré pseudo-aléatoirement : ${nombreGenere}"
    [d_schris@mojo.internal.doubleclick.net postscript]$ ./testOutput1.sh 
    Nombre généré pseudo-aléatoirement : 8269044
    [d_schris@mojo.internal.doubleclick.net postscript]$ ./testOutput1.sh 
    Nombre généré pseudo-aléatoirement : 10269077
    [d_schris@mojo.internal.doubleclick.net postscript]$ ./testOutput1.sh 
    Nombre généré pseudo-aléatoirement : 8924517
    [d_schris@mojo.internal.doubleclick.net postscript]$ ./testOutput1.sh 
    Nombre généré pseudo-aléatoirement : 16420439
    [d_schris@mojo.internal.doubleclick.net postscript]$ ./testOutput1.sh 
    Nombre généré pseudo-aléatoirement : 13311144
    [d_schris@mojo.internal.doubleclick.net postscript]$ ./testOutput1.sh 
    Nombre généré pseudo-aléatoirement : 16134720
    [d_schris@mojo.internal.doubleclick.net postscript]$ ./testOutput1.sh 
    Nombre généré pseudo-aléatoirement : 16470860
    [d_schris@mojo.internal.doubleclick.net postscript]$
    PS : pshttpd.ps peut être récupéré ici

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 17h40
  2. Réponses: 2
    Dernier message: 29/07/2008, 13h16
  3. Réponses: 9
    Dernier message: 17/01/2003, 12h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 06h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 08h50

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