Инструкции по отправке необработанных данных на принтер с помощью Visual C#.NET

Переводы статьи Переводы статьи
Код статьи: 322091 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В этой статье показано, как использовать функции Win32 диспетчера очереди печати из программы, создаваемые с помощью Visual C#.NET.

Дополнительные сведения

Чтобы отправить необработанные данные принтера из Microsoft.NET Framework, программа должна работать с функций Win32 диспетчера очереди печати. Через.NET Framework, можно распечатать с помощью PrintDocument, PrintControllerи связанных классов. Однако при использовании.NET Framework, не удается отправить форматированных данных готов к печати на принтере.

Необходимо отправить необработанные данные на принтер, выполните следующее:
  • Отправьте escape-последовательностями.
  • Загрузить, а затем используйте шрифты.
  • Очередь специальные бланки для печати файлов.
Для отправки этих типов и других типов исходных данных на принтер, программный код должен работать с интерфейсов прикладного программирования Win32 диспетчера очереди печати (API). Ниже показано, как прочитать содержимое предварительно отформатированного файла в память, а затем отправить эти байты на принтер с помощью WritePrinter.

ПРИМЕЧАНИЕ: Невозможно использовать этот подход в одном задании печати как машинный код PrintDocument Задание печати. Нужно использовать.NET Framework для печати или отправки байтов собственные задания печати.

Создание проекта, который печатает форматированных данных

  1. Запустите Visual Studio.NET. На Файл меню, нажмите кнопку Новый, а затем нажмите кнопку Проект. В группе Типы проектов, нажмите кнопку Проекты Visual C# папка. На Шаблоны Выберите Приложение Windows, а затем нажмите кнопку ОК. По умолчанию будет создана форма Form1.
  2. На Представление меню, нажмите кнопку Панели инструментов Чтобы отобразить панель инструментов, а затем добавьте Кнопка в форму Form1. Этой кнопке присваивается имя Button1.
  3. Добавить другой Кнопка в форму Form1. Этой кнопке присваивается имя Button2.
  4. Дважды щелкните значок Button1. Откроется окно кода для формы.
  5. Замена Button1_Click Подпрограмма следующим кодом:
    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. Замена Button2_Click Подпрограмма следующим кодом:
    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. Вставьте следующий код в верхней части файла:
    using System;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    					
  8. Добавьте следующий код внутри пространства имен основного приложения, но вне определений классов.
    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. Нажмите клавишу F5, чтобы построить и запустить программу.
  10. Нажмите кнопку Button1 Чтобы загрузить и распечатать содержимое файла.
  11. Нажмите кнопку Button2 Чтобы напечатать строку. (Возможно, потребуется вручную извлечь страницу, поскольку строка отправляется без как прогон страницы команда).

Ссылки

Для получения дополнительных сведений щелкните следующие номера статей базы знаний Майкрософт:
138594Инструкции по отправке необработанных данных на принтер с помощью интерфейса API Win32

Свойства

Код статьи: 322091 - Последний отзыв: 8 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
Ключевые слова: 
kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:322091

Отправить отзыв

 

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