Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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
Salut, tu as essayé PrintSetPrinter() ?
Hors ligne
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.
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
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
PrintGetPrinter( ) ?
Hors ligne
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 ?
Hors ligne
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)
Hors ligne
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
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
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
_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
Bonjour,
Déclaration de la fonction ShellExecuteEx
Function boolean ShellExecuteEx (Ref s_SHELLEXECUTEINFO lpExecInfo ) Library "shell32.dll" Alias For "ShellExecuteExW"
Définition de la structure passée à ShellExecuteEx
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
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)
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
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
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
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
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