Pas de problème (pb), que du PowerBuilder (PB) ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.
  • Index
  •  » Powerscripts
  •  » [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut
  • 1 évaluations, moyenne 91 évaluations, moyenne 91 évaluations, moyenne 91 évaluations, moyenne 91 évaluations, moyenne 9

#1 13-02-2014 16:50:53

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

[RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Bonjour,

J'utilise l'OLE PDF dans lequel je charge un document PDF par l'instruction LoadFile.

Ensuite j'essaye d'imprimer ce PDF avec l’instruction printAll.

Lorsque j’exécute cette instruction en local, le document s'imprime sur l'imprimante par défaut, par contre, en citrix, il s'imprime sur la 1ere imprimante disponible et non pas sur l'imprimante selectionnée.

Auriez vous une solution à mon problème, pour que en mode citrix, le document s'imprime bien sur l'imprimante 'courante' ?  (sans utiliser la méthode printWithDialog)

Merci d’avance pour vos retours,

Pb version 12.1

Hors ligne

 

#2 14-02-2014 08:45:29

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Salut, tu as essayé PrintSetPrinter() ?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 14-02-2014 10:13:29

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

erasorz a écrit:

Salut, tu as essayé PrintSetPrinter() ?

Bonjour,

Oui j'avais fait  PrintSetPrinter  mais sur l'imprimante récupérée par RegistryGet qui me donne en fait l'imprimante par défaut du poste.

Code: pb

IF RegistryGet("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows","Device", ls_printer) = -1 THEN
  RETURN -1
END IF


En fait, il me faudrait l'imprimante 'courante' sélectionnée dans l'application.

Une petite idée pour trouver cette imprimante courante ?

Merci d'avance,

Hors ligne

 

#4 14-02-2014 10:44:15

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Bonjour,

Je ne vais pas répondre précisément à ta question. ça fait maintenant quelques années que j'ai travaillé sur ce problème et je n'ai plus tout en tête.

Il me semble que c'est pour une de ses raisons que j'utilise la librairie PowerPrinter : http://sourceforge.net/projects/powerpr … =directory.

C'est un wrapper sur un certain nombre de fonctions d'impression de l'API Windows (entre autre me permet de lire le format d'étiquettes chargés dans les imprimantes code à barre, ...).

Hors ligne

 

#5 14-02-2014 10:47:03

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

PrintGetPrinter( ) ?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#6 14-02-2014 11:26:01

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

buck a écrit:

Il me semble que c'est pour une de ses raisons que j'utilise la librairie PowerPrinter : http://sourceforge.net/projects/powerpr … =directory.

C'est un wrapper sur un certain nombre de fonctions d'impression de l'API Windows (entre autre me permet de lire le format d'étiquettes chargés dans les imprimantes code à barre, ...).

date de la lib : octobre 2001, date de la doc : juin 1997...   ça fonctionne encore bien avec les systèmes récents ?


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#7 14-02-2014 11:36:30

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

seki a écrit:

ça fonctionne encore bien avec les systèmes récents ?

Je me réponds : je viens de voir qu'il y avait un petit projet PB avec, et ça semble fonctionne (énumérer les imprimantes, lister les travaux en cours,  ...)

Bon, avec un projet PB de 2001 et des dates en 1997 dans le code, j'ai ouvert ça avec PB9 pour minimiser les ennuis possibles. Je ne sais pas encore ce que ça donne avec un PB11.5

Edit: si il y a quand même un hic : une fonction of_getprinterdc fait appel à une fonction interne de pbshr050.dll (PB5) et plante. Je viens de rajouter des dll du runtime pb5 avec le projet et ça ne plante plus. C'est une fonction utilisée par le projet pb de démo, on en a peut-être pas besoin pour les autres fonctionnalités ?

Dernière modification par seki (14-02-2014 15:05:08)


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#8 14-02-2014 11:51:55

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Bonjour,

Je suis sous PB 11.5.1.4897, j'ai des postes en production sous windows 7 : ça fonctionne sans problème.

Hors ligne

 

#9 14-02-2014 14:28:06

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Bon la solution

L'ole PDF imprime par défaut sur l'imprimante par défaut du poste.

donc

1°) RegistryGet : pour récupérer l'imprimante par défaut du poste

2°) PrintGetPrinter : pour récupérer l'imprimante courante du poste

3°) RegistrySet : pour mettre l'imprimante courante dans la base de registre

4°) Imprimer l'OLE

5°) RegistrySet : Pour remettre l'imprimante par défaut du 1°)

Merci à tous,

Hors ligne

 

#10 14-02-2014 15:38:37

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Il me semble qu'il y a un PrintWithDiag dans l'OLE Acrobat ça evite de toucher à la base de registre mais pas bon pour un impression de masse
Sinon un ShellExecuteEx avec le verbe PrintTo on fait avec ça chez nous pour imprimer en masse. Il y a une petit astuce pour les imprimantes partagées dont il faut lire le nom dans la base de registre.
J'ai du code si ça intéresse des gens.

Hors ligne

 

#11 14-02-2014 16:32:04

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

_francois_ a écrit:

Il me semble qu'il y a un PrintWithDiag dans l'OLE Acrobat ça evite de toucher à la base de registre mais pas bon pour un impression de masse
Sinon un ShellExecuteEx avec le verbe PrintTo on fait avec ça chez nous pour imprimer en masse. Il y a une petit astuce pour les imprimantes partagées dont il faut lire le nom dans la base de registre.
J'ai du code si ça intéresse des gens.

Bonjour,

Dans l'OLE il y a un OLECustomControl.object.printWithDialog() , mais qui a pour conséquence d'ouvrir la boite de dialogue pour choisir une imprimante, ce que je voulais éviter.

Et si c'est possible, je veux bien le code qui permet d'imprimer un pdf avec une autre méthode. (en MP si besoin).

Merci d'avance,

Hors ligne

 

#12 17-02-2014 07:52:15

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Bonjour,

Déclaration de la fonction ShellExecuteEx

Code: pb

Function boolean ShellExecuteEx (Ref s_SHELLEXECUTEINFO lpExecInfo ) Library "shell32.dll" Alias For "ShellExecuteExW"


Définition de la structure passée à ShellExecuteEx

Code: pb

global type s_shellexecuteinfo from structure
  long    cbsize
  long    fmask
  long    hwnd
  string    lpverb
  string    lpfile
  string    lpparameters
  string    lpdirectory
  long    nshow
  long    hinstapp
  long    lpidlist
  string    lpclass
  long    hkeyclass
  long    hicon
  long    hmonitor
  long    hprocess
end type


Fonction qui "gère" l'impression
Les valeurs pour le fMask et les retours sont trouvables chez microsoft

Code: pb

global subroutine f_print_file (string as_file, string as_printer);
string    ls_cmd
int      li_ret
s_shellexecuteinfo  lstr_sei

as_printer = '"' + as_printer + '"'
ls_cmd = "printto"
lstr_sei.cbSize = 60
lstr_sei.fMask  = 33554432 + 320
lstr_sei.hWnd   = Handle(this)
lstr_sei.lpVerb = ls_cmd
lstr_sei.lpFile = as_file
lstr_sei.lpParameters = as_printer
lstr_sei.nShow  = 3
gnv_win32.shellExecuteEx(lstr_sei)
li_ret = lstr_sei.hInstApp

choose case li_ret
  case n_const.SE_ERR_FNF
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car il n~'a pu être trouvé',StopSign!,OK!)
    
  case n_const.SE_ERR_PNF
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car le répertoire courant n~'a pu être trouvé',StopSign!,OK!)
    
  case n_const.SE_ERR_ACCESSDENIED
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car le système a refusé l~'accès au fichier',StopSign!,OK!)
    
  case n_const.SE_ERR_OOM
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car le système ne dispose pas d~'assez de mémoire pour l~'ouvrir',StopSign!,OK!)
    
  case n_const.SE_ERR_DLLNOTFOUND
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car une dll n~'a pu être trouvée',StopSign!,OK!)
    
  case n_const.SE_ERR_SHARE
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car le système a rencontré une violation de partage',StopSign!,OK!)
    
  case n_const.SE_ERR_ASSOCINCOMPLETE
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car il existe une erreur dans le paramétrage de l~'association de ce type de fichier à un programme',StopSign!,OK!)
    
  case n_const.SE_ERR_DDETIMEOUT, n_unit_const.SE_ERR_DDEFAIL, n_unit_const.SE_ERR_DDEBUSY
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car le système a rencontré une erreur DDE',StopSign!,OK!)    
    
  case n_const.SE_ERR_NOASSOC
    messageBox('Erreur d~'impression du fichier','Impossible d~'imprimer le fichier car aucun programme n~'est associé à ce type de fichier',StopSign!,OK!)
    
end choose

end subroutine


Bout de code pour récupérer le nom de l'imprimante (si besoin)

Code: pb

ls_printer = printGetPrinter()
li_pos = pos(ls_printer,char(9))
if li_pos > 0 then ls_printer = left(ls_printer,li_pos - 1)

if left(ls_printer,1) = '\' then
  // Si c'est une imprimante partagée depuis un autre ordinateur
  // Il va falloir aller chercher dans la base de registre son nom de partage
  string    ls_machine, ls_partage, ls_tmp, ls_nom, ls_key, ls_win_ver
  integer  li_ret
  
  ls_key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
  li_ret = RegistryGet(ls_key,  "CurrentVersion", RegString!, ls_win_ver)

  ls_tmp = mid(ls_printer,3)
  li_pos = pos(ls_tmp,'\')
  if li_pos > 0 then
    ls_machine = left(ls_tmp,li_pos - 1)
    ls_nom = mid(ls_tmp,li_pos + 1)
  end if

  // Win 2K / XP / 2003
  if left(ls_win_ver,1) = '5' then
    ls_key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\LanMan Print Services\Servers\" + ls_machine + "\Printers\" + ls_nom
    li_ret = RegistryGet(ls_key,  "Share Name", RegString!, ls_partage)
  // VISTA / 7 / 2008
  else
    // d'abord récupérer l'ID de l'imprimante...
    string    ls_printer_id
    
    ls_key = "HKEY_CURRENT_USER\Printers\Connections\,," + ls_machine + ',' + ls_nom
    li_ret = RegistryGet(ls_key,  "GuidPrinter", RegString!, ls_printer_id)
    
    ls_key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers\" + ls_machine + "\Printers\" + ls_printer_id + '\DsSpooler'
    li_ret = RegistryGet(ls_key,  "PrintShareName", RegString!, ls_partage)
  end if
  ls_printer = '\\' + ls_machine + '\' + ls_partage
end if


Pour imprimer il suffit d'appeler le f_print_file("x:\chemin\du\fichier.pdf","nom de l imprimante")
Nous nous en servons chez nous pour demander une fois l'imprimante au départ d'une impression en masse.

Hors ligne

 

#13 27-02-2014 14:24:56

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Bonjour,

Pour faire fonctionner ce script, j'aurais également besoin de la définition de gnv_win32 et n_const et de n_unit_const

C'est possible de rajouter ces objets ?

Et il manque également la définition de ls_win_ver

Merci

Hors ligne

 

#14 28-02-2014 18:49:51

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

hum le gnv_win32 est juste un objet qui contient les déclarations des fonctions externes de l'API Windows tu peux t'en passer
n_const et n_unit_const servent juste à déclarer des constantes globales au niveau application
tu peux trouver les valeurs ici Site de Microsoft

Désolé je n'ai pas fait attention en postant le code à la nettoyer à ce niveau là ni poster les valeurs des constantes.

Hors ligne

 

#15 03-03-2014 07:57:09

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

constant int SE_ERR_FNF = 2       // file not found
constant int SE_ERR_PNF = 3       // path not found
constant int SE_ERR_ACCESSDENIED = 5       // access denied
constant int SE_ERR_OOM = 8       // out of memory
constant int SE_ERR_DLLNOTFOUND = 32
constant int SE_ERR_SHARE = 26
constant int SE_ERR_ASSOCINCOMPLETE = 27
constant int SE_ERR_DDETIMEOUT = 28
constant int SE_ERR_DDEFAIL = 29
constant int SE_ERR_DDEBUSY = 30
constant int SE_ERR_NOASSOC = 31

Hors ligne

 

#16 02-08-2016 08:33:24

Sylvie de hannut  
Membre completement Geek
Lieu: Hannut (Belgique)
Date d'inscription: 10-06-2011
Messages: 123
Pépites: 499
Banque: 0

Re: [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut

Bonjour je viens vers vous car je dois imprimer, via Pb, un fichiers PDF existant.
J'ai essayé de coder le code trouvé ci-dessus, mais je n'y arrive pas.

Comment créé t'on une sous-routine globale ?
Elle est rattachée à quel objet ?

Déjà que je n'arrive pas a créer la fonction "ShellExecuteEx", powerbuilder plante à chaque fois que je la sauve.

Quelqu'un peut-il m'expliquer comment je dois faire ?
Merci beaucoup

Hors ligne

 
  • Index
  •  » Powerscripts
  •  » [RESOLU] Imprimer fichier pdf avec l'ole sur imprimante par défaut
  • 1 évaluations, moyenne 91 évaluations, moyenne 91 évaluations, moyenne 91 évaluations, moyenne 91 évaluations, moyenne 9

Pied de page des forums

Propulsé par FluxBB 1.2.22