Comment faire pour envoyer des données brutes à une imprimante à l'aide de Visual C# .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 322091 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article pas à pas montre comment utiliser les fonctions de spouleur Win32 à partir d'un programme que vous créez à l'aide de Visual C# .NET.

Plus d'informations

Pour envoyer des données brutes à une imprimante à partir du Microsoft.NET Framework, votre programme doit travailler avec des fonctions Win32 du spouleur. Dans le.NET Framework, vous pouvez imprimer à l'aide de PrintDocument, PrintControlleret les classes associées. Cependant, avec le.NET Framework, vous ne peut pas envoyer des données d'imprimante prêts à l'emploi déjà mises en forme à une imprimante.

Il se peut que vous deviez envoyer des données brutes à une imprimante pour effectuer les opérations suivantes :
  • Envoyer les séquences d'échappement.
  • Téléchargez et utilisez polices logicielles.
  • Fichiers de spoule préimprimé.
Pour envoyer ces types et autres types de données brutes à une imprimante, votre code doit fonctionner avec des Interfaces de programmation d'Application (API) Win32 du spouleur. Le code suivant montre comment lire le contenu d'un fichier déjà mises en forme dans la mémoire, puis envoyer ces octets à l'imprimante à l'aide de WritePrinter.

Remarque: vous ne pouvez pas utiliser cette approche dans le travail d'impression même sous la forme d'un travail d'impression PrintDocument natif. Vous devez utiliser le.NET Framework pour imprimer ou envoyer votre propre octets du travail d'impression.

Créez un projet qui imprime les données déjà mises en forme

  1. Démarrez Visual Studio .NET. Dans le menu fichier , cliquez sur Nouveau, puis cliquez sur projet. Sous Types de projets, cliquez sur le dossier Projets Visual C# . Dans la liste modèles , cliquez sur Application Windows, puis cliquez sur OK. Par défaut, Form1 est créé.
  2. Dans le menu affichage , cliquez sur boîte à outils pour afficher la boîte à outils et ajoutez un bouton à Form1. Ce bouton est nommé Button1.
  3. Ajoutez un autre bouton à Form1. Ce bouton est nommé Button2.
  4. Double-cliquez sur Button1. La fenêtre de code pour le formulaire s'affiche.
  5. Remplacez la sous-routine Button1_Click par le code suivant :
    private void button1_Click(object sender, System.EventArgs e)
    {
        // Allow the user to select a file.
        OpenFileDialog ofd = new OpenFileDialog();
        if( DialogResult.OK == ofd.ShowDialog(this) )
        {
            // Allow the user to select a printer.
            PrintDialog pd  = new PrintDialog();
            pd.PrinterSettings = new PrinterSettings();
            if( DialogResult.OK == pd.ShowDialog(this) )
            {
                // Print the file to the printer.
                RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName);
            }
        }
    }
    					
  6. Remplacez la sous-routine Button2_Click par le code suivant :
    private void button2_Click(object sender, System.EventArgs e)
    {
        string s = "Hello"; // device-dependent string, need a FormFeed?
        
        // Allow the user to select a printer.
        PrintDialog pd  = new PrintDialog();
        pd.PrinterSettings = new PrinterSettings();
        if( DialogResult.OK == pd.ShowDialog(this) )
        {
            // Send a printer-specific to the printer.
            RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);
        }
    }
    					
  7. Insérez le code suivant en haut du fichier :
    using System;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    					
  8. Ajoutez le code suivant à l'intérieur de l'espace de noms d'application principale, mais en dehors de toutes les définitions de classe :
    public class RawPrinterHelper
    {
        // Structure and API declarions:
        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)] public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)] public string pDataType;
        }
        [DllImport("winspool.Drv", EntryPoint="OpenPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
    
        [DllImport("winspool.Drv", EntryPoint="ClosePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool ClosePrinter(IntPtr hPrinter);
    
        [DllImport("winspool.Drv", EntryPoint="StartDocPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool StartDocPrinter( IntPtr hPrinter, Int32 level,  [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
    
        [DllImport("winspool.Drv", EntryPoint="EndDocPrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool EndDocPrinter(IntPtr hPrinter);
    
        [DllImport("winspool.Drv", EntryPoint="StartPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool StartPagePrinter(IntPtr hPrinter);
    
        [DllImport("winspool.Drv", EntryPoint="EndPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool EndPagePrinter(IntPtr hPrinter);
    
        [DllImport("winspool.Drv", EntryPoint="WritePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
        public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten );
    
        // 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, false on failure.
        public static bool SendBytesToPrinter( string szPrinterName, IntPtr pBytes, Int32 dwCount)
        {
            Int32    dwError = 0, dwWritten = 0;
            IntPtr    hPrinter = new IntPtr(0);
            DOCINFOA    di = new DOCINFOA();
            bool    bSuccess = false; // Assume failure unless you specifically succeed.
    
            di.pDocName = "My C#.NET RAW Document";
            di.pDataType = "RAW";
    
            // Open the printer.
            if( OpenPrinter( szPrinterName.Normalize(), out hPrinter, IntPtr.Zero ) )
            {
                // Start a document.
                if( StartDocPrinter(hPrinter, 1, di) )
                {
                    // Start a page.
                    if( StartPagePrinter(hPrinter) )
                    {
                        // Write your bytes.
                        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            // If you did not succeed, GetLastError may give more information
            // about why not.
            if( bSuccess == false )
            {
                    dwError = Marshal.GetLastWin32Error();
            }
            return bSuccess;
        }
    
        public static bool SendFileToPrinter( string szPrinterName, string szFileName )
        {
            // Open the file.
            FileStream fs = new FileStream(szFileName, FileMode.Open);
            // Create a BinaryReader on the file.
            BinaryReader br = new BinaryReader(fs);
            // Dim an array of bytes big enough to hold the file's contents.
            Byte []bytes = new Byte[fs.Length];
            bool bSuccess = false;
            // Your unmanaged pointer.
            IntPtr pUnmanagedBytes = new IntPtr(0);
            int nLength;
    
            nLength = Convert.ToInt32(fs.Length);
            // Read the contents of the file into the array.
            bytes = br.ReadBytes( nLength );
            // Allocate some unmanaged memory for those bytes.
            pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
            // Copy the managed byte array into the unmanaged array.
            Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
            // Send the unmanaged bytes to the printer.
            bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
            // Free the unmanaged memory that you allocated earlier.
            Marshal.FreeCoTaskMem(pUnmanagedBytes);
            return bSuccess;
        }
        public static bool SendStringToPrinter( string szPrinterName, string szString )
        {
            IntPtr pBytes;
            Int32 dwCount;
            // 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);
            return true;
        }
    }
    					
  9. Appuyez sur F5 pour générer et exécuter le programme.
  10. Cliquez sur Button1 pour charger et imprimer le contenu d'un fichier.
  11. Cliquez sur Button2 pour afficher une chaîne. (Vous devrez peut-être éjectez manuellement la page car la chaîne est envoyée sans la commande saut de page .)

Références

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants de la Base de connaissances Microsoft.
138594 Comment faire pour envoyer des données brutes à une imprimante à l'aide de l'API Win32

Propriétés

Numéro d'article: 322091 - Dernière mise à jour: lundi 14 octobre 2013 - Version: 6.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows XP Professional
Mots-clés : 
kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d?une traduction incorrecte du contenu ou de son utilisation par les clients.
La version anglaise de cet article est la suivante: 322091
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com