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 Discussion :

[Impression]Comment faire ?


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut [Impression]Comment faire ?
    Bonjour,
    le sujet du post est assez vague mais j'avoue qu'il reflète bien mon niveau d'ignorance dans le domaine
    J'ai réalisé une application en C / Gtk qui écrit un certain nombre de donnée dans un fichier postscript. Je souhaiterai pouvoir imprimer ce fichier depuis le programme. Je souhaite m'appuyer sur l'API Win32 pour l'impression de ce fichier mais j'avoue ne pas tout comprendre. J'ai fouillé le net, difficile de trouver un tutorial abordable sur le pb... Voilà où j'en suis :
    - un clic sur le bouton imprimer de mon iHM permet l'ouverture de la boite de dialogue de selection de l'imprimante selon le code 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
    void print_ps(){
        PRINTDLG pd;
        //HWND hwnd;
    
    	// Initialize PRINTDLG
    	ZeroMemory(&pd, sizeof(pd));
    	pd.lStructSize = sizeof(pd);
    	//pd.hwndOwner   = hwnd;
    	pd.hDevMode    = NULL;     // Don't forget to free or store hDevMode
    	pd.hDevNames   = NULL;     // Don't forget to free or store hDevNames
    	pd.Flags       = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC; 
    	pd.nCopies     = 1;
    	pd.nFromPage   = 0xFFFF; 
    	pd.nToPage     = 0xFFFF; 
    	pd.nMinPage    = 1; 
    	pd.nMaxPage    = 0xFFFF; 
    	
    	if (PrintDlg(&pd)==TRUE) {
    		// GDI calls to render output.
    
    		// Delete DC when done.
    		DeleteDC(pd.hDC);
    	}
    }
    Le problème est donc le suivant : comment et où dois-je déclarer le path de mon fichier à imprimer ?
    D'avance merci.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Pour imprimer dans un fichier à partir du dialogue d'impression, il faut ajouter le flag PD_PRINTTOFILE.
    La case à cocher "Imprimer dans un fichier" dans le dialogue d'impression sera cochée et de cette manière Windows exécutera le dialogue d'enregistrement de fichier.

    Sinon, je ne vois personnellement pas de méthode simple pour définir le nom du fichier généré.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci, toutefois je ne souhaite pas imprimer dans un fichier mais imprimer le fichier en question, il s'agit d'un fichier postscript, je cherche juste à savoir comment transmettre le contenu de ce fichier à l'imprimante séectionné par l'utilisateur... N'y a t'il pas un lien, ou un tutorial sur le sujet ?

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Ho ! J'ai tout compris de travers... Désolé !

    Dans le principe, pour imprimer un fichier à l'aide des fonctions de l'API, cela se résume à :

    - Obtenir un contexte de périphérique pour ton imprimante (PrintDlg);
    - Initialiser la session d'impression (StartDoc);
    - Pour chaque page, l'initialiser (StartPage), dessiner le texte (TextOut etc) puis imprimer la page (EndPage);
    - Fermer la session d'impression (EndDoc).

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Ok, j'avance petit à petit mais j'avance. Comment puis-je, à partir de mon contexte de périphérique (PrintDlg), récupérer le nom de l'imprimante que l'utilisateur aura sélectionné ?

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    La fonction PrintDlg travaille avec une structure de type PRINTDLG.
    L'un des champs de cette structure est hDevMode, de type DEVMODE.

    Cette dernière structure contient le champ dmDeviceName, qui est le nom de ton imprimante.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci pour ces renseignements, mais je n'arrive pas à récupérer le contenu du champ dmDeviceName sus mentionné, un morceau de code pourrai peut-être m'aider.
    Merci.

  8. #8
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Même si tu n'utilises pas de structure DEVMODE pour initialiser ses paramètres en entrée, la fonction PrintDlg alloue une structure DEVMODE dans le tas global et renvoie son handle dans le champ hDevMode.

    Cette structure est accessible comme n'importe quel bloc alloué dans le tas global (en récupérant son adresse à l'aide de GlobalLock).

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    OK, le problème c'est que l'API win32 et moi ça fait deux... J'ai trouvé sur le lien suivant
    http://support.microsoft.com/default.aspx?scid=kb;EN;138594
    le moyen d'envoyer mes données brutes à l'imrimante. Il me manque donc la jonction entre le code fourni dans le premier post et celui de ce lien. Je continue de chercher mais autant le C ne me pose pas trop de pb, autant l'API windows me paraît très délicate à utliser...

  10. #10
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Bon j'ai essayé ça mais ça ne marche pas :
    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
    if (PrintDlg(&pd)==TRUE) {
    		// GDI calls to render output.
    		if( !ReadFileWithAlloc("c:\\tmp.ps", &dwSize, &pBytes ) )
    		g_print("Failed to allocate memory for and read file.\n");
    
    	    if( ! RawDataToPrinter(pd.hDevNames, pBytes, dwSize ) )
    		     g_print("Failed to send data to printer.\n");
    	    else
    		     g_print("Data sent to printer.\n");
    
    	    GlobalFree( (HGLOBAL)pBytes );	
    
    		// Delete DC when done.
    		DeleteDC(pd.hDC);
    	}
    je passe bien le premier if donc mon fichier est valide et est lu sans pb, par contre j'ai visiblement pas choppé le bon champ pour l'imprimante puisque j'ai droit à ça dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OpenPrinter Error [1801]:: Le nom de l'imprimante n'est pas
    valide.
    Failed to send data to printer.
    Quelqu'un pourrait'il m'aider à récuperer le nom de l'imprimante ?

  11. #11
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Tu peux exécuter PrintDlg en mode silencieux pour retourner le nom de l'imprimante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pd.lStructSize = SizeOf(tPrintDlg);
    pd.hDevMode = 0;
    pd.hDevNames = 0;
    pd.Flags = pd_PrintSetup | pd_ReturnDefault;
    PrintDlg(pd);
    D'accord, il faut utiliser l'API mais ce n'est pas la mort !

    Ensuite, le paramètre szPrinterName de RawDataToPrinter devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RawDataToPrinter(&pd.hDevMode.dmDeviceName... etc)
    J'espère ne pas avoir fait d'erreur de syntaxe car je n'ai jamais programmé en C.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Bonjour, encore merci à toi de suivre ce post.
    La compilation de ce que tu me propose me conduit à l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error C2224: left of '.dmDeviceName' must have struct/union type
    Pour essayer de remonter jusqu'au champ dmDeviceName, j'ai fouiller un peu. Le fichier COMMDLG.H indique que :
    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
    typedef struct tagPDA {
       DWORD            lStructSize;
       HWND             hwndOwner;
       HGLOBAL          hDevMode;
       HGLOBAL          hDevNames;
       HDC              hDC;
       DWORD            Flags;
       WORD             nFromPage;
       WORD             nToPage;
       WORD             nMinPage;
       WORD             nMaxPage;
       WORD             nCopies;
       HINSTANCE        hInstance;
       LPARAM           lCustData;
       LPPRINTHOOKPROC  lpfnPrintHook;
       LPSETUPHOOKPROC  lpfnSetupHook;
       LPCSTR           lpPrintTemplateName;
       LPCSTR           lpSetupTemplateName;
       HGLOBAL          hPrintTemplate;
       HGLOBAL          hSetupTemplate;
    } PRINTDLGA, *LPPRINTDLGA;
    Donc hDevMode est de type HGLOGAL (un Handle si j'ai bien compris) et donc n'est pas une structure ou une union... Donc pas de champ dmDeviceName. Je continue à chercher mais j'avoue que je suis en train de boire la tasse.

  13. #13
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Oups !
    Tu as parfaitement raison, j'ai écrit des c****ries. Désolé.

    J'aurais dû écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dm = GlobalLock(pd.hDevMode);
    RawDataToPrinter(&dm.dmDeviceName... etc)
    (avec les mêmes réserves quant-à la syntaxe C !)

  14. #14
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    OK, merci pour ton aide,
    j'ai essayé ce que tu m'as proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    LPBYTE dm;
    
    dm = (LPBYTE)GlobalLock(pd.hDevMode); 
    
    	    if( !RawDataToPrinter((dm.dmDeviceName, pBytes, dwSize)))
    		     g_print("Failed to send data to printer.\n");
    	    else
    		     g_print("Data sent to printer.\n");
    Mais là encore dm n'est pas de type structure ou union... J'ai déclaré dm de type LPBYTE mais je ne sais pas si c'est le mieux.

    EDIT : j'ai testé la valeur de dm et elle n'est pas NULL mais je ne sais pas ce qu'elle contient exactement, en tout cas si elle contient bien le nom de l'imprimante, je ne sais pas encore comment le récupérer. Je continue les recherches.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Bon en fouillant encore l'API, j'ai mis la main sur cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BOOL EnumPrinters(
      DWORD Flags,         // printer object types
      LPTSTR Name,         // name of printer object
      DWORD Level,         // information level
      LPBYTE pPrinterEnum, // printer information buffer
      DWORD cbBuf,         // size of printer information buffer
      LPDWORD pcbNeeded,   // bytes received or required
      LPDWORD pcReturned   // number of printers enumerated
    );
    Cette fonction semble me permettre de lister les imprimantes reconnue par l'OS. Malheureusement les quelques essaies que j'ai fait ne m'ont pas permi de récupérer le nom des imprimantes. Quelqu'un a t'il déjà utilisé cette fonction ed l'API, au quel cas lui serait-il possible de me dire comment récupérer le nom des imprimantes ?
    D'avance, merci.

  16. #16
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Chance666
    J'ai déclaré dm de type LPBYTE mais je ne sais pas si c'est le mieux
    dm est de type "adresse de structure DEVMODE". Il y a sûrement moyen de déclarer ça en C ? LPDEVMODE ou un truc de genre, je suppose.

    Ou alors, un typecast du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RawDataToPrinter((DEVMODE(dm).dmDeviceName,  etc
    Râââh je ne connais rien en C

  17. #17
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci Alcatiz pour ton aide, j'ai fini par trouver : la solution est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(pd.hDevNames) {
    			c = (char*)GlobalLock(pd.hDevNames);
    			if(c){
    				c += *((WORD*)(c + 2));
    				g_print("Printer selected : %s\n", c);
    				GlobalUnlock(pd.hDevNames);
    			}
    		}
    Encore merci pour ta patience, en espérant pouvoir t'aider un jour.

  18. #18
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut impression postscript
    Salut, je viens de lire ce sujet qui m'intéresse fortement, je dois en effet imprimer un postscript sur une imprimante postscript.
    Mon fichier postscript que je dois imprimer est en fait une bitmap que j'ai convertit en postscript avec "image" et "colorimage".

    Y a-t-il une certaine entête à respecter pour un fichier postscript (apparemment non, car ghostscript me l'ouvre ss problème).

    Le code de cette page est-il fait pour une imprimante postscript ou windows (gdi) ?

    Pouvez vous m'en dire plus quant au fichier, si je dois ajouter obligatoirement certains champs...

    Merci

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

Discussions similaires

  1. Impression, comment faire un saut de page ?
    Par Ehjoe dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/04/2011, 02h06
  2. Réponses: 6
    Dernier message: 29/05/2009, 14h59
  3. Etat d’impression. comment faire ?
    Par soufian1364 dans le forum Général Java
    Réponses: 1
    Dernier message: 16/02/2009, 12h29
  4. [Impression] Impression de divers fichiers comment faire
    Par Alec6 dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 11/10/2005, 16h22
  5. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31

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