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

Langage Delphi Discussion :

Impression sur le canevas de l'imprimante


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut Impression sur le canevas de l'imprimante
    Bonjour à tous,

    Pour imprimer dans le canevas de l'imprimante, j'utilise ce bout de code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with printer do
    begin
    begindoc;
    canvas.textout(x,y,'texte à imprimer');
    enddoc;
    end;
    maintenant le probléme c'est que je veut répeter l'opération sur des centaines de feuilles (800 minimum) et j'ai modifier le code comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with printer do
    begin
    begindoc;
    for i:=1 to 800 do
    begin
             canvas.textout(x,y,'texte à imprimer'); 
             newpage;
    end;
    enddoc;
    mais là il imprime sur la première page mais pas sur les autres.

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour,

    pour moi sur D7 avec l'imprimante PdfCreator, ces 2 codes fonctionnent bien :

    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
    procedure TF_Princ.Button2Click(Sender: TObject);
    Var
      x, y : Integer ;
      i : Integer ;
    begin
      x := 300 ;
      y := 1000 ;
      with printer do
        Begin
          Begindoc;
          For i := 1 To 5 do
            Begin
              Canvas.textout(x,y,'texte à imprimer n° '+ IntToStr(i) );
              NewPage ;
            End ;
          Enddoc;
        End;
    end;
     
    procedure TF_Princ.Button3Click(Sender: TObject);
    Var
      x, y : Integer ;
      i : Integer ;
    begin
      x := 300 ;
      y := 1000 ;
      With printer do
        Begin
          For i := 1 To 3 do
            Begin
              BeginDoc ;
              canvas.textout(x,y,'texte à imprimer n° '+ IntToStr(i) );
              EndDoc ;
            End ;
        End;
    end;
    Le premier imprime toutes les pages dans le même fichier Pdf, le second créé autant de fichiers que de pages.

    A+
    Charly

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    bonjour,

    j'ai remédié au probléme on utilisant le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    with printer do
    begin
    begindoc;
    canvas.textout(x,y,'fff' );
    enddoc;
    end;
    mais, l'imprimante est réinitialisé à chaque fois.

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 732
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 732
    Points : 15 137
    Points
    15 137
    Par défaut
    Yep !
    Citation Envoyé par chekkal Voir le message
    bonjour,

    j'ai remédié au problème en utilisant le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    with printer do
    begin
    begindoc;
    canvas.textout(x,y,'fff' );
    enddoc;
    end;
    Elle est où, la boucle des 800 pages minimum dont il est question dans le post d'origine ?

    (En espérant que tu fais tes test vers du pdf, sinon bonjour le gaspillage de papier... À notre époque, ça la fout mal.)
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour,
    pour ne pas réinitialiser l'imprimante il faut utiliser ma première solution (et non la seconde). Avec PDF on a un seul fichier avec plusieurs pages (800 pour toi)

    A+
    Charly

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    désolé j'ai oublié d'intégrer la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    with printer do
    begin
    begindoc;
                for i:=1 to 800 do 
                   canvas.textout(x,y,'fff' );
    enddoc;
    end;
    Mon but c'est pas de créer un fichier (pdf pour l'exple). J'ai des pré-imprimé et je voudrais imprimer sur des positions bien précise sur chaque feuille. le code ci-dessus marche mais la réinitialisation de l'imprimante prend à chaque fois 2 secondes en moyenne, alors pour 1000 feuilles

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 732
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 732
    Points : 15 137
    Points
    15 137
    Par défaut
    Yep !
    Citation Envoyé par Charly910 Voir le message
    Bonjour,
    pour ne pas réinitialiser l'imprimante il faut utiliser ma première solution (et non la seconde).
    Celle qui inclut le NewPage à chaque tour de boucle ?
    Déjà testé, mais
    Citation Envoyé par chekkal Voir le message
    là il imprime sur la première page mais pas sur les autres .
    Au fait, il n'imprime rien sur les autres (ie 799 pages sortent blanches) ou elles ne sont même pas avalées par la machine ?

    Si c'est "rien", peut-être qu'il n'y a rien à imprimer ? À tester dans un pdf.

    Sinon c'est un problème d'imprimante/de pilote d'imprimante et là, on ne pourra rien faire : à voir avec le fournisseur.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour,
    @Jipété : oui avec Newpage à chaque tour de boucle, la boucle étant entre le Begindoc et le EndDoc, on obtient un pdf unique avec n pages

    Le dernier code proposé par Chekkal, n'imprime qu'une seule page avec 800 fois son texte imprimé à la même place car il ne modifie pas y ?

    je ne comprends pas son histoire de réinitialisation d'imprimante qui ne doit se produire qu'une seule fois au Begindoc ? (ou au EndDoc qui lance l'impression ?)

    A+
    Charly

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 402
    Points : 300
    Points
    300
    Par défaut
    Bonjour,
    Une autre solution consiste à donner une valeur à Printer.copies:=800; pour 800 pages et d'écrire dans le canvas pour définir le contenu de la page.

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour,
    j'ai essayé printer.copies := 3 sans succès (avec ou sans PrintDialog) : mon PDF ne contient qu'une page :

    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
    procedure TF_Princ.Button2Click(Sender: TObject);
    Var
      x, y : Integer ;
      i : Integer ;
    begin
      x := 300 ;
      y := 1000 ;
      i := 1 ;
      Printer.copies := 3 ;
      If PrintDialog1.execute Then
      Begin
        With printer do
          Begin
            BeginDoc ;
            canvas.textout(x,y,'texte à imprimer n° '+ IntToStr(i) );
            EndDoc ;
          End;
      End ;
    end;
    Je pense que le mieux pour Chekkal, c'est d'imprimer ses formulaires dans un seul fichier Pdf, de vérifier et d'imprimer ses 800 pages (comme quand on fait un mailing avec Word)

    A+
    Charly

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 732
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 732
    Points : 15 137
    Points
    15 137
    Par défaut
    Citation Envoyé par Bernard B Voir le message
    Une autre solution consiste à donner une valeur à Printer.copies:=800; pour 800 pages et d'écrire dans le canvas pour définir le contenu de la page.

    Lecture...
    Pour moi, tu vas avoir 800 fois la même page alors que l'OP veut 800 pages avec des informations différentes.

    Citation Envoyé par Charly910 Voir le message
    @Jipété : oui avec Newpage à chaque tour de boucle, la boucle étant entre le Begindoc et le EndDoc, on obtient un pdf unique avec n pages
    On est donc bien d'accord, attendons sa réponse puisqu'on dirait que NewPage lui pose un problème...

    Citation Envoyé par Charly910 Voir le message
    Le dernier code proposé par Chekkal, n'imprime qu'une seule page avec 800 fois son texte imprimé à la même place car il ne modifie pas y ?
    Oui, c'est bien ce qu'il veut, il a parlé de feuilles pré-imprimées dans lesquelles il va remplir des zones (comme des bulletins de salaire, ou des factures, etc.)

    Citation Envoyé par Charly910 Voir le message
    je ne comprends pas son histoire de réinitialisation d'imprimante qui ne doit se produire qu'une seule fois au Begindoc ? (ou au EndDoc qui lance l'impression ?)
    Ben oui, dans son dernier code le couple begindoc enddoc est dans la boucle

    Dans son cas, la génération d'un pdf puis son impression pourrait être une bonne idée.

    Citation Envoyé par Charly910 Voir le message
    j'ai essayé printer.copies := 3 sans succès (avec ou sans PrintDialog) : mon PDF ne contient qu'une page
    Je suspecte que l'impression vers pdf générant un fichier, l'option l'a généré 3 fois mais sans rien pour changer le nom, le n+1 a écrasé le n.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 402
    Points : 300
    Points
    300
    Par défaut
    Effectivement l'envoie de 3 fois le même fichier vers une fausse imprimante PDF ne génère qu'un seul enregistrement.

  13. #13
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Effectivement : d'après Microsoft dans Printer.Copies :

    Notes
    Si le PrintAction propriété est définie sur une valeur autre que PrintToPrinter, cette propriété est ignorée.
    donc avec une imprimante Pdf ce ne doit pas imprimer plusieurs copies (ce qui semble logique).

    A+
    Charly

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 732
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 732
    Points : 15 137
    Points
    15 137
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Effectivement : d'après Microsoft dans Printer.Copies :

    donc avec une imprimante Pdf ce ne doit pas imprimer plusieurs copies (ce qui semble logique).
    Bizarre bizarre, car j'étais persuadé qu'une sortie en pdf utilisait toute la mécanique d'impression dans la mesure où il s'agit là d'une imprimante, même si virtuelle.

    L'article (plus précisément ici) parle de PrintToPreview (dans une fenêtre, donc) ou de PrintToFile (dans un fichier, défini par une case à cocher [ou bouton radio, je ne sais plus trop] plus un nom de fichier à définir).
    OK, le pdf c'est un peu pareil, il va falloir donner un nom de fichier, mais la mécanique en amont est différente, àmha.

    Enfin, ça c'est du pinaillage, mais j'aime bien comprendre et être précis, ça aide au troubleshoot,

    Tiens, tu devrais, puisque tu es sous Windows (moi je suis sous Linux), faire un test en t'inspirant de l'exemple en VB du lien ci-dessus, et je suis à peu près sûr qu'en choisissant PrintToPrinter tu pourras ensuite choisir le printer... pdf !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #15
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour,

    j'ai essayé, mais j'ai une erreur sur Printer.PrintAction : l'identificateur Printer.PrintAction n'est pas défini (alors que Printer.copies l'est)

    dans l'aide de D7 la propriété PrintAction n'existe pas pour TPrinter.

    A+
    Charly

  16. #16
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 460
    Points : 24 874
    Points
    24 874
    Par défaut
    Sur XPS Microsoft Document Writer, ce code fonctionne parfaitement (quoi que 801 pages, la dernière est vide)
    C'est peut-être plus fiable que l'imprimante PDF que Chekkal utilise

    Faudrait tester avec 3 pages sur une vraie imprimante (ah et le papier, on peut le remettre encore et encore pour les tests)

    J'ai volontairement ajouter un petit calcul pour changer la place du libellé

    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
    procedure TZooVCLMainForm.Button4Click(Sender: TObject);
    var
      i, x, y: integer;
    begin
      x := 0;
      y := 0;
      with VCL.Printers.Printer do
      begin
        BeginDoc();
     
        for  i:= 1 to 800 do
        begin
          Inc(x, i);
          if x > PageWidth then
          begin
            x := 0;
            Inc(y, 100);
            if y > PageHeight  then
              y := 0;
          end;
     
          Canvas.TextOut(x, y, Format('texte à imprimer, page %d', [i]));
     
          NewPage();
        end;
     
        EndDoc();
      end;
    end;
    Nom : DevForum800Pages.jpg
Affichages : 494
Taille : 235,1 Ko
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  17. #17
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    @ ShaiLeTroll :
    Oui c'est exactement que je dis depuis le début. Ce code fonctionne aussi avec PdfCreator dans un fichier Pdf. On obtient n pages dans un même fichier. Ce qui ne fonctionne pas avec Pdf c'est les copies multiples : Copies := n

    J'ai l'impression que l'on a donné une bonne solution à Chekkal avec toutes ses pages dans un même fichier Pdf qu'il peut ensuite imprimer ?

    A+
    Charly

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/08/2012, 16h58
  2. Impression sur imprimante USB à partir d'un logiciel DOS
    Par el_aaroubi dans le forum Périphériques
    Réponses: 4
    Dernier message: 28/03/2007, 18h16
  3. Forcer l'impression sur une imprimante
    Par Poussy-Puce dans le forum ASP
    Réponses: 1
    Dernier message: 21/11/2006, 00h27
  4. Procédure pour impression sur imprimante matricielle
    Par snakers13 dans le forum WinDev
    Réponses: 2
    Dernier message: 15/10/2006, 17h55
  5. [CR][ASP.NET] Impression sur imprimante partagée
    Par Frusciante8 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 27/01/2005, 12h03

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