Page 1 sur 2

Imprimer direct sans choisir l'imprimante

Publié : sam. 22/févr./2025 19:58
par Cubitus98
Voila dans le titre, y a tout.

Je ne désire pas devoir choisir l'imprimante, je connais son nom et désire tout envoyer avec juste un "open print" (terme arbitraire que j'ai choisi" et envoyer les données, sachant que c'est que du text ^^.

On peux faire ou pas ?

Merci a vous ^^

Re: Imprimer direct sans choisir l'imprimante

Publié : sam. 22/févr./2025 21:43
par Mindphazer
Peut-être ici ? :
https://www.purebasic.fr/english/viewto ... 82#p519982

(pas testé, je suis pas sous Windows à la maison)

Re: Imprimer direct sans choisir l'imprimante

Publié : sam. 22/févr./2025 21:53
par Cubitus98
Ca semblerait bien être ça, mais j'ai ce message d'erreur :

[21 :48 :53] [ERREUR] Accès mémoire invalide. (erreur de lecture à l'adresse 18446744071637306972)

Mais merci m'en même ;)

Re: Imprimer direct sans choisir l'imprimante

Publié : sam. 22/févr./2025 23:06
par Mindphazer
Sinon tu peux essayer ça :
https://www.purebasic.fr/english/viewtopic.php?t=77057

(toujours pas testé bien sûr)

Re: Imprimer direct sans choisir l'imprimante

Publié : dim. 23/févr./2025 23:45
par case
pourtant bien décrit dans la doc...

Code : Tout sélectionner

  Resultat = DefaultPrinter()
  If Resultat <> 0
    If StartPrinting("") 
      ; les trucs a imprimer se mettent ici 
      StopPrinting()
      EndIf
  Else
    MessageRequester("Info","Pas d'imprimante par défaut.") 
  EndIf

Re: Imprimer direct sans choisir l'imprimante

Publié : mar. 25/févr./2025 16:45
par Cubitus98
@case

Non tu utilise l'imprimante par défaut.

Ce que je cherche, c'est outrepassé l'imprimante et de donner le nom de l'imprimante à laquelle je veux imprimer.

Ex: Par défaut j'ai ma laser et je désire imprimer sur mon imprimante ticket " non de l'imprimant" et lancer sans devoir la choisir. :)

les exemple au-dessus ne fonctionne m'malheureusement pas :?

Re: Imprimer direct sans choisir l'imprimante

Publié : mar. 25/févr./2025 17:34
par falsam
Petite question. Tu envoies ton ticket ligne par ligne vers l'imprimante ou envoies tu un fichier texte dans un seul flux ?

Re: Imprimer direct sans choisir l'imprimante

Publié : mar. 25/févr./2025 18:10
par falsam
Petit code Windows uniquement : Imprimer sur une imprimante qui peut ne pas être celle par défaut.
Pour mon test, j'imprime sur une imprimante PDF

1 Mémoriser le nom de l'imprimante par défaut
2 Définir une nouvelle imprimante avec son nom windows
3 Lancer l'impression
4 Redéfinir l'imprimante par défaut initial.

Code : Tout sélectionner

EnableExplicit

; OBtenir le nom de l'imprimante par défaut
Procedure.s GetDefaultPrinter()
  Protected name.s = Space(255)
  GetProfileString_("Windows","Device", "", @name, 255)
  ProcedureReturn StringField(name,1,",")
EndProcedure

; Sélectionner une imprimante (API)
Procedure SetPrinter(Name.s)  
  WriteProfileString_("windows", "Device", Name)
EndProcedure


; Pour l'exemple, test d'impression dans un fichier PDF

; Mémoriser l'imprimante par défaut
Define DefaultPrinter.s = GetDefaultPrinter()

; Définir une nouvelle imprimante par défaut
SetPrinter("Microsoft Print To PDF")

; Lance l'impression sur l'imprimante selectionné
If DefaultPrinter()  
  ; Nom du job qui apparaitra dans la file d'attente
  If StartPrinting("Test d'impression")
    
    ;Prépare la page à imprimer
    LoadFont(0, "Arial", 100)

    If StartDrawing(PrinterOutput())
      BackColor(RGB(255, 255, 255)) 
      FrontColor(RGB(0, 0, 0))      
      DrawingFont(FontID(0))
      DrawText(100, 300, "Quelle belle ligne d'impression")
      StopDrawing()
    EndIf
    StopPrinting()
  Else
    Debug "Oops : Souci d'impression. Vérifier le nom de l'imprimante"
  EndIf  
EndIf

; Ne pas oublier de revenir à l'ancien nom d'imprimante par défaut
SetPrinter(DefaultPrinter)[/code]

Re: Imprimer direct sans choisir l'imprimante

Publié : mar. 25/févr./2025 18:48
par falsam
Un autre code basé sur le précèdent code pour Imprimer un fichier texte sur une imprimante qui peut ne pas être celle par défaut..

Code : Tout sélectionner

EnableExplicit

; Obtenir le nom de l'imprimante par défaut
Procedure.s GetDefaultPrinter()
  Protected name.s = Space(255)
  GetProfileString_("Windows","Device", "", @name, 255)
  ProcedureReturn StringField(name,1,",")
EndProcedure

; Sélectionner une imprimante
Procedure SetPrinter(Name.s)  
  WriteProfileString_("windows", "Device", Name)
EndProcedure


; Pour l'exemple, test d'impression dans un fichier PDF

; Mémoriser l'imprimante par défaut
Define DefaultPrinter.s = GetDefaultPrinter()
Define Format.i, CurrentLine.s, LineY.i, CountLine

; Définir une nouvelle imprimante par défaut
SetPrinter("Microsoft Print To PDF")

; Lance l'impression sur l'imprimante selectionné
If DefaultPrinter()  
  ; Nom du job qui apparaitra dans la file d'attente
  If StartPrinting("Test d'impression")
    
    ;Prépare la page à imprimer
    LoadFont(0, "Arial", 20)
    
    If StartDrawing(PrinterOutput())
      BackColor(RGB(255, 255, 255)) 
      FrontColor(RGB(0, 0, 0))      
      DrawingFont(FontID(0))
      
      If ReadFile(0, "c:\test.txt")
        ; Détection du format (UTF8, ASCII, Unicode)
        Format = ReadStringFormat(0)
        
        ; Lecture de chaque ligne du fichier texte
        While Eof(0) = 0
          CurrentLine = ReadString(0, Format)
          
          ; Ajouter un espace quand on rencontre une ligne vide
          If Len(CurrentLine) = 0
            CurrentLine = " "
          EndIf
          
          ; Dessiner la ligne
          DrawText(10, LineY, CurrentLine)
          
          ; Calculer l'emplacement Y de la ligne suivante
          LineY + TextHeight(CurrentLine)
        Wend
       
        CloseFile(0)                
        EndIf  
        StopDrawing()
      EndIf
      StopPrinting()
      
      Debug "Impression terminée"
    Else
      Debug "Oops : Souci d'impression. Vérifier le nom de l'imprimante"
    EndIf  
  EndIf
  
  ; Ne pas oublier de revenir à l'ancien nom d'imprimante par défaut
  SetPrinter(DefaultPrinter)[/code]

Re: Imprimer direct sans choisir l'imprimante

Publié : mer. 26/févr./2025 9:34
par Marc56
Merci Falsam pour ces exemples clairs comme d'habitude :P ça va aussi m'être utile.

J'avais trouvé sur le forum us un exemple (compliqué) qui listait toutes les imprimantes installées mais il était pour les anciennes version de PB en mode ascii donc donnait un affichage bizarre.

J'ai modifié le tien pour juste afficher l'imprimante par défaut et comprendre)
(Bizarrement, la première fois, sans StringField, ça n'affichait rien? (et pas de ',' dans ShowVariableViewer()) ?)

Code : Tout sélectionner

Printers_Names$ = Space(255)
GetProfileString_("Windows","Device", "", @Printers_Names$, 255)
Debug "Imprimante par défaut : " + Printers_Names$
(J'essaye maintenant de le modifier pour afficher toutes les imprimantes dans une ComboBox pour l'intégrer à un programme et que l'utilisateur puisse choisir directement (et garder cette imprimante dans ses prefs))
:wink:

Re: Imprimer direct sans choisir l'imprimante

Publié : mer. 26/févr./2025 21:59
par falsam
Marc56 a écrit : mer. 26/févr./2025 9:34 (J'essaye maintenant de le modifier pour afficher toutes les imprimantes dans une ComboBox
J'ai un code qui t'appartient pour obtenir la liste de toutes les imprimantes

Code : Tout sélectionner

EnableExplicit

Enumeration    
     #Win
     #Rpt
EndEnumeration

SetGadgetFont(#PB_Any, FontID(LoadFont(#PB_Any, "Verdana", 8)))

OpenWindow(#Win, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#Rpt, 5, 5, WindowWidth(#win) - 10, WindowHeight(#Win) - 10)

Define Run = RunProgram("wmic", "printer get name", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

If Run 
     While ProgramRunning(Run)
          If AvailableProgramOutput(Run)
               AddGadgetItem(#Rpt, -1, ReadProgramString(Run))
          EndIf
     Wend
     CloseProgram(Run)
     RemoveGadgetItem(#Rpt, 0) ; (enlever la première ligne de titre 'name')
Else
     AddGadgetItem(#Rpt, -1, "Erreur")
EndIf

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
Tu peux récupérer l'imprimante choisi par l'utilisateur.
Marc56 a écrit : mer. 26/févr./2025 9:34 l'utilisateur puisse choisir directement (et garder cette imprimante dans ses prefs))
Avec cette procédure, l'imprimante sélectionnée deviendra l'imprimante par défaut.

Code : Tout sélectionner

Procedure SetPrinter(Name.s)  
  WriteProfileString_("windows", "Device", Name)
EndProcedure

Re: Imprimer direct sans choisir l'imprimante

Publié : jeu. 27/févr./2025 9:11
par Marc56
aaahhhh, "wmic" je l'avais oublié.
Merci

Re: Imprimer direct sans choisir l'imprimante

Publié : sam. 01/mars/2025 14:09
par venom
wmic ne fonctionne plus normalement au dessus de windows 10 (21H1) ! Si ?






@++

Re: Imprimer direct sans choisir l'imprimante

Publié : sam. 01/mars/2025 18:30
par falsam
venom a écrit : sam. 01/mars/2025 14:09 wmic ne fonctionne plus normalement au dessus de windows 10 (21H1) !
Je suis en version 24H2 et wmic fonctionne encore ....

Re: Imprimer direct sans choisir l'imprimante

Publié : sam. 01/mars/2025 20:04
par falsam
Lister les imprimantes installées avec PowerShell et la fonction Get-Printer

Code : Tout sélectionner

EnableExplicit

Enumeration    
  #Win
  #Rpt
EndEnumeration

Define Buffer.s

SetGadgetFont(#PB_Any, FontID(LoadFont(#PB_Any, "Verdana", 8)))

OpenWindow(#Win, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#Rpt, 5, 5, WindowWidth(#win) - 10, WindowHeight(#Win) - 10)

Define Run = RunProgram("powershell.exe", "Get-Printer | Select-Object -Property Name", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

If Run 
  While ProgramRunning(Run)
    If AvailableProgramOutput(Run)
      Buffer = ReadProgramString(Run)
      If Len(Trim(Buffer)) > 0
        AddGadgetItem(#Rpt, -1, Buffer)
      EndIf
    EndIf
  Wend
  CloseProgram(Run)
  
  ; Enlever entete de colonne
  RemoveGadgetItem(#Rpt, 0) : RemoveGadgetItem(#Rpt, 0) : RemoveGadgetItem(#Rpt, 0)  
Else
  AddGadgetItem(#Rpt, -1, "Erreur")
EndIf

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend[/code]