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

Windows Forms Discussion :

Qualité d'impression sur Graphics


Sujet :

Windows Forms

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut Qualité d'impression sur Graphics
    Bonjour,

    Après avoir cherché une librairie d'impression simple sans succès, je me suis tourné vers une écriture de mon code "à la main".

    Ayant compris que l'impression passe par une notion de Graphics, j'utilise ce moyen dans une procédure d'impression de texte. J'insiste sur le fait qu'il s'agit juste de texte, en gras ou non, souligné ou non.

    La composition de mon texte n'étant pas facile à réaliser pour un "débutant" en impression comme moi, je trouvais plus simple de découper mon impression en plusieurs cadres. Je crée donc un Bitmap que je compose à partir de 3 autres, le premier en haut à gauche, le second en haut à droite et le dernier au-dessous. J'écris donc sur 3 bitmap différents composés de la même manière. Par exemple pour celui du bas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bmpBottom = new Bitmap(width, 1000);
    Graphics gbmpBottom = Graphics.FromImage(bmpBottom);
    gbmpBottom.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    Ensuite, dans l'évènement PrintPage de mon PrintDocument, je code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void prd_PrintPage(object sender, PrintPageEventArgs e)
    {
        int larg = (int)Math.Ceiling(e.PageSettings.Bounds.Width - e.PageSettings.HardMarginX * 2);
        Bitmap bp = this.Patient.Printed(larg);
        e.Graphics.DrawImage(bp, e.PageSettings.HardMarginX, e.PageSettings.HardMarginY);
    }
    Jusque là, pas trop de souci !

    Sauf que ... le résultat est dégueulasse ... J'ai bien mon texte que j'ai "écris" sur le bitmap mais avec avec plein de points autour de chaque caractère. Comme si il y avait une diffusion de l'encre.

    Pour tester l'impression, j'ai codé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void prd_PrintPage(object sender, PrintPageEventArgs e)
    {
        e.Graphics.DrawString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
            new Font("Consolas", 10), Brushes.Black, 50, 50);
    }
    Le résultat est impeccable.

    Question : Vais-je devoir reprendre tout mon code ou y-a t'il une solution pour améliorer ça ?

    Papy !

  2. #2
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Août 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 13
    Points : 16
    Points
    16
    Par défaut
    Essaie p-e avec ce genre de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gbmpBottom.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gbmpBottom.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    avec ce code je n'ai plus de diffusion de points mais tous les caractères sont écrits en gras.

    Il parait que mon problème viendrait d'une différence de dpi entre le canvas du Bitmap et celui de l'imprimante. Mais comment faire accorder les deux, j'en ai aucune idée.

    Si je ne trouve pas de solution satisfaisante, je passerai par une autre solution style page HTML composée et imprimée par IE.

  4. #4
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Sinon il faudrait que tu positionne tout ton texte à la main, mais ça reste assez long à réaliser...
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Sinon il faudrait que tu positionne tout ton texte à la main, mais ça reste assez long à réaliser...
    Pas si long que ca !!

    J'ai un jour passé qq heures (moins d'une demi journée) a ecrire quelques methodes de centrage, alignement a droite, a gauche, ecriture dans un cadre deféni, c'est pas si long que ca et je suis aujourd'hui tres content d'avoir ca sous la main pour faire de la mise en page simple de formulaire et meme si nécésaire l'impression de datatables.

    Sincerement je crois que ca vaut la peine d'y inverstir un peu de temps avant de passer par des solution brico ou d'installer Crystal report
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Donc le mieux revient à se créer sa propre usine de préparation à l'impression.

    Pourrais-tu fournir quelques exemples olibara, j'avoue que je ne me suis jamais frotté à cette tâche, pensant qu'elle était trop longue et complexe.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par olibara Voir le message
    Pas si long que ca !!
    Sincerement je crois que ca vaut la peine d'y inverstir un peu de temps avant de passer par des solution brico ou d'installer Crystal report
    Si ce que j'ai à imprimer était composé d'éléments fixes, ça ne serait pas trop un problème. Je pourrais me faire ça aussi. Mais par exemple, dans le premier cas que j'ai à traiter, j'ai des infos personnelles sur 2 colonnes. L'adresse peut-être composée de 0 à 4 lignes. Du coup, les infos à écrire en-dessous doivent toute être décalées. Ca m'oblige à chaque fois à calculer la hauteur de ce que j'imprime pour déplacer mon Y d'impression suivant. C'est faisable, la preuve je viens de recoder la première partie de mon impression en imùprimant directement sur le canvas de l'imprimante et le résultat est impeccable. Mais en dessous de ça, il y a des cadres de taille dynamique, des textes plus ou moins longs, etc. Il n'y a pas qu ele centrage ou le style à prendre compte.

    A titre d'info, j'ai trouvé le lien suivant sur CodeProject :

    http://www.codeproject.com/KB/printi...Framework.aspx

    auquel je vais m'intéresser de plus près pour la suite de ce que j'ai à réaliser.

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour

    Pour le print Datatable j'ai un lien ici (c'est un peu vieux (quelques mois) mais comme modele ca peut servir)

    http://www.developpez.net/forums/d77...ion-datatable/

    Pour le reste je vais donner qq exemple tres vite !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Voila quelques methodes de positionnement de texte

    En gros ce qu'il faut bien capter c'est que sur l'event PrintPage on recupere un Graphics sur la surface du document dont on connait le cadre et les marges

    A partir de là on dessine tout ce qu'on veut sur le graphics en position X,Y

    C'est vrai que quand je m'y suis mis la premiere fois j'ai un peu ramé entre les event des dialogue d'impression et le fait qu'en définitive il s'agit de faire du dessin sur un graphics.

    Je donne ca brut de fonderie c'est du code pas documenté pour usage interne

    A noter que chaque methode retourne un SizeF permettant de connaitre le Size de ce qui vient d'etre ecrit et de repositionne surtout le Y !!

    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
       // **********************************************************************
    // mBnd=MarginBound
        private SizeF prCenter(string p, RectangleF mBnd, float y, Font cFont, Brush brA, Graphics curGraphics)
        {
          SizeF szf = curGraphics.MeasureString(p, cFont);
          float x = mBnd.Left + (mBnd.Width - szf.Width) / 2;
          curGraphics.DrawString(p, cFont, brA, x, y);
          return szf;
        }
        // **********************************************************************
        private SizeF prPos(string p, float posX, float y, Font cFont, Brush brA, Graphics curGraphics)
        {
          SizeF szf = curGraphics.MeasureString(p, cFont);
          curGraphics.DrawString(p, cFont, brA, posX, y);
          return szf;
        }
        // **********************************************************************
        private SizeF prPosBottom(string p, float posX, float y, Font cFont, Brush brA, Graphics curGraphics)
        {
          SizeF szf = curGraphics.MeasureString(p, cFont);
          curGraphics.DrawString(p, cFont, brA, posX, y - szf.Height);
          return szf;
        }
         // **********************************************************************
        private SizeF prRight(string p, float posX, float y, Font cFont, Brush brA, Graphics curGraphics)
        {
          SizeF szf = curGraphics.MeasureString(p, cFont);
          curGraphics.DrawString(p, cFont, brA, posX - szf.Width, y);
          return szf;
        }
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    l'idée de renvoyer des SizeF est pas bète.
    Je la reprendrai. Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Enlever le boutton impression sur une image !
    Par Gab-Gab dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/11/2004, 23h30
  2. [CR9] impression sur papier à entête
    Par liosec dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 30/08/2004, 10h52
  3. [CR10][ASP.NET]Impression sur le poste Client
    Par David.V dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 30/04/2004, 13h41
  4. [TP]Impression sur port USB
    Par haypo dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 18/07/2003, 11h09

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