Envoyer séquence escape PCL pour imprimer

gar6more Messages postés 19 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 28 août 2014 - 28 août 2014 à 10:43
gar6more Messages postés 19 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 28 août 2014 - 28 août 2014 à 17:43
Bonjour,


Je fais appel à vous car je suis bloqué sur un problème.
Je veux envoyer des séquences escape à une imprimante.
J'essaye de définir une macro pcl et de l'appeler ensuite pour faire une impression.
Malheureusement rien ne se passe.
Savez vous comment faire.

Voici mon code :

IDMacro est le no de la macro et OKIBAC2 le nom de l'imprimante.


'Chargement Macro IDMacro sur Printer OKIBAC2

'Assign ID Number
RawPrinterHelper.SendStringToPrinter("OKIBAC2", Chr(27) & "&f" & IDMacro & "Y")

'Start Definition
RawPrinterHelper.SendStringToPrinter("OKIBAC2", Chr(27) & "&f0X")

'Definition
RawPrinterHelper.SendStringToPrinter("OKIBAC2", "TEST")

'Stop Definition
RawPrinterHelper.SendStringToPrinter("OKIBAC2", Chr(27) & "&f1X")

'Call Macro
RawPrinterHelper.SendStringToPrinter("OKIBAC2", Chr(27) & "&f3x")


Merci pour votre aide.

Gar6more

5 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 août 2014 à 11:26
Bonjour,
On ne voit pas l'essentiel de ce que l'on devrait voir :
le code de RawPrinterHelper, qui semble être une classe !
On ne sait par ailleurs pas sous quoi tu développes (VB6 ou VB.Net ?)
0
gar6more Messages postés 19 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 28 août 2014
28 août 2014 à 11:40
Je developpe en VB.net.

J'ai trouvé cette fonction ici : http://support.microsoft.com/kb/322090
Je pensais pouvoir faire cela avec.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 28/08/2014 à 11:57
1) Je déplace donc vers VB.Net (que je ne connais pas) . Et te quitte donc.
2) il ne s'agit pas d'une "fonction", mais bel et bien d'une classe (à écrire)
3) il n'est pas très élégant (c'est un euphémisme) de demander d'ouvrir un autre site pour y découvrir le code que tu as utilisé !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
gar6more Messages postés 19 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 28 août 2014
28 août 2014 à 12:04
Merci de tes remarques.
Je ne voulais pas surcharger de code...

Voici la classe en question :

Public Class RawPrinterHelper
' Structure and API declarions:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Structure DOCINFOW
<MarshalAs(UnmanagedType.LPWStr)> Public pDocName As String
<MarshalAs(UnmanagedType.LPWStr)> Public pOutputFile As String
<MarshalAs(UnmanagedType.LPWStr)> Public pDataType As String
End Structure

<DllImport("winspool.Drv", EntryPoint:="OpenPrinterW", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function OpenPrinter(ByVal src As String, ByRef hPrinter As IntPtr, ByVal pd As Long) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="ClosePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartDocPrinterW", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, ByRef pDI As DOCINFOW) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="WritePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function WritePrinter(ByVal hPrinter As IntPtr, ByVal pBytes As IntPtr, ByVal dwCount As Int32, ByRef dwWritten As Int32) As Boolean
End Function

' SendBytesToPrinter()
' When the function is given a printer name and an unmanaged array of
' bytes, the function sends those bytes to the print queue.
' Returns True on success or False on failure.
Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32) As Boolean
Dim hPrinter As IntPtr ' The printer handle.
Dim dwError As Int32 ' Last error - in case there was trouble.
Dim di As DOCINFOW ' Describes your document (name, port, data type).
Dim dwWritten As Int32 ' The number of bytes written by WritePrinter().
Dim bSuccess As Boolean ' Your success code.

' Set up the DOCINFO structure.
With di
.pDocName = "My Visual Basic .NET RAW Document"
.pDataType = "RAW"
End With
' Assume failure unless you specifically succeed.
bSuccess = False
If OpenPrinter(szPrinterName, hPrinter, 0) Then
If StartDocPrinter(hPrinter, 1, di) Then
If StartPagePrinter(hPrinter) Then
' Write your printer-specific bytes to the printer.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, dwWritten)
EndPagePrinter(hPrinter)
End If
EndDocPrinter(hPrinter)
End If
ClosePrinter(hPrinter)
End If
' If you did not succeed, GetLastError may give more information
' about why not.
If bSuccess = False Then
dwError = Marshal.GetLastWin32Error()
End If
Return bSuccess
End Function ' SendBytesToPrinter()

' SendFileToPrinter()
' When the function is given a file name and a printer name,
' the function reads the contents of the file and sends the
' contents to the printer.
' Presumes that the file contains printer-ready data.
' Shows how to use the SendBytesToPrinter function.
' Returns True on success or False on failure.
Public Shared Function SendFileToPrinter(ByVal szPrinterName As String, ByVal szFileName As String) As Boolean
' Open the file.
Dim fs As New FileStream(szFileName, FileMode.Open)
' Create a BinaryReader on the file.
Dim br As New BinaryReader(fs)
' Dim an array of bytes large enough to hold the file's contents.
Dim bytes(fs.Length) As Byte
Dim bSuccess As Boolean
' Your unmanaged pointer.
Dim pUnmanagedBytes As IntPtr

' Read the contents of the file into the array.
bytes = br.ReadBytes(fs.Length)
' Allocate some unmanaged memory for those bytes.
pUnmanagedBytes = Marshal.AllocCoTaskMem(fs.Length)
' Copy the managed byte array into the unmanaged array.
Marshal.Copy(bytes, 0, pUnmanagedBytes, fs.Length)
' Send the unmanaged bytes to the printer.
bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, fs.Length)
' Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnmanagedBytes)
Return bSuccess
End Function ' SendFileToPrinter()

' When the function is given a string and a printer name,
' the function sends the string to the printer as raw bytes.
Public Shared Function SendStringToPrinter(ByVal szPrinterName As String, ByVal szString As String)
Dim pBytes As IntPtr
Dim dwCount As Int32
' How many characters are in the string?
dwCount = szString.Length()
' Assume that the printer is expecting ANSI text, and then convert
' the string to ANSI text.
pBytes = Marshal.StringToCoTaskMemAnsi(szString)
' Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrinterName, pBytes, dwCount)
Marshal.FreeCoTaskMem(pBytes)
End Function
End Class


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gar6more Messages postés 19 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 28 août 2014
28 août 2014 à 17:43
Pour faire avancer le débat, voici les premiers résultats.
J'arrive à envoyer des caractères à l'imprimante :

s2 = Chr(27) + "&l3X" + "Hello, this is a test 2"
RawPrinterHelper.SendStringToPrinter(OKIBAC2, s2)


Chr(27) + "&l3X" sert à imprimer deux fois le texte "Hello, this is a test 2"

J'aimerais maintenant créer une macro pcl et lancer cette macro (via la commande CALL)

Voici ce que j'ai donc essayé :

---------------------chargement de la macro----------------
'Attribution Macro
s1 = Chr(27) + "&f" + IDMacro + "Y"

'Debut definition
s2 = Chr(27) + "&f0X"

'Testé en direct (voir plus haut)
s3 = Chr(27) + "&l3X" + "Hello, this is a testof Macro"

'Fin definition
s4 = Chr(27) + "&f1X"
RawPrinterHelper.SendStringToPrinter("OKIBAC2", s1 + s2 + s3 + s4)


-----------------------lancement de la macro -----------------

'Call Macro
s5 = Chr(27) + "&f" + IDMacro + "1X"
RawPrinterHelper.SendStringToPrinter("OKIBAC2", s5)

Malheureusement rien ne s'imprime.
0
Rejoignez-nous