Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để gửi dữ liệu thô máy in bằng cách sử dụng Visual C# .NET

Hỗ trợ cho Windows XP đã kết thúc

Microsoft đã kết thúc hỗ trợ dành cho Windows XP vào ngày 8 tháng 4 năm 2014. Thay đổi này đã ảnh hưởng đến các bản cập nhật phần mềm và tùy chọn bảo mật của bạn. Tìm hiểu ý nghĩa của điều này với bạn và cách thực hiện để luôn được bảo vệ.

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

322091
Đối với phiên bản Microsoft Visual Basic .NET của bài viết này, hãy xem 322090.
Đối với một phiên bản C++ không được quản lý bài viết này, hãy xem bài viết sau trong cơ sở kiến thức Microsoft:
138594 Làm thế nào để gửi dữ liệu thô máy in bằng cách sử dụng Win32 API
Bài viết này đề cập đến tên thư viện lớp Microsoft Khuôn khổ .NET sau:
  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropServices

TRONG TÁC VỤ NÀY

Tóm tắt
Bài viết từng bước này cho biết cách sử dụng chức năng bộ đệm Win32 từ một chương trình mà bạn tạo bằng cách sử dụng Visual C# .NET.

back to the top

Thông tin

Gửi dữ liệu thô cho máy in từ Microsoft Khuôn khổ .NET, chương trình của bạn phải làm việc với Win32 đệm chức năng. Qua Khuôn khổ .NET, bạn có thể in bằng cách sử dụng PrintDocument, PrintControllervà liên kết lớp. Tuy nhiên, với Khuôn khổ .NET, bạn không thể gửi dữ liệu máy in sẵn sàng preformatted máy in.

Bạn có thể phải gửi dữ liệu thô máy in để làm như sau:
  • Gửi thoát.
  • Tải xuống, và sau đó sử dụng phông chữ mềm.
  • Đệm preprinted tệp.
Gửi các loại và các loại dữ liệu thô cho máy in, mã của bạn phải làm việc với Win32 đệm giao diện lập trình ứng dụng (API). Mã sau đây cho thấy làm thế nào để đọc nội dung của một tập tin preformatted vào bộ nhớ, và sau đó gửi các byte cho máy in bằng cách sử dụng WritePrinter.

Lưu ý: bạn không thể sử dụng phương pháp này trong công việc in tương tự như việc in PrintDocument riêng. Hoặc, bạn phải sử dụng Khuôn khổ .NET để in hoặc gửi cho byte công việc in của riêng bạn.

back to the top

Tạo một dự án in Preformatted dữ liệu

  1. Bắt đầu Visual Studio .NET. Trên menu tệp , bấm mớivà sau đó bấm dự án. Trong Dự án loại, bấm vào mục tin thư thoại Dự án Visual C# . Trong danh sách mẫu , bấm Cửa sổ ứng dụngvà sau đó bấm OK. theo mặc định, Form1 được tạo ra.
  2. Trên menu xem , bấm công cụ để hiển thị công cụ, và sau đó thêm một nút chọn một vào Form1. nút chọn một này được đặt tên Button1.
  3. Thêm một nút chọn một vào Form1. nút chọn một này được đặt tên Button2.
  4. Bấm đúp Button1. Cửa sổ mã cho các hình thức xuất hiện.
  5. Thay thế chương trình con Button1_Click với mã sau đây:
    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. Thay thế chương trình con Button2_Click với mã sau đây:
    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. Chèn thêm mã sau ở đầu tập tin:
    using System;using System.Drawing;using System.Drawing.Printing;using System.Windows.Forms;using System.Runtime.InteropServices;					
  8. Thêm mã sau trong không gian tên ứng dụng chính nhưng ở bất kỳ định nghĩa lớp:
    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. Nhấn F5 để xây dựng, và sau đó chạy chương trình.
  10. Bấm Button1 tải và in nội dung của tệp.
  11. Bấm Button2 in một chuỗi. (Bạn có thể phải để đẩy trang theo cách thủ công vì chuỗi được gửi mà không có lệnh formfeed .)
back to the top
Tham khảo
Để biết thêm thông tin, hãy bấm vào số bài viết sau để xem bài viết trong Cơ sở Kiến thức Microsoft:
138594 Làm thế nào để gửi dữ liệu thô máy in bằng cách sử dụng Win32 API
back to the top
NGUYÊN phông thiết bị cổng tải mềm
Thuộc tính

ID Bài viết: 322091 - Xem lại Lần cuối: 03/15/2015 10:10:00 - Bản sửa đổi: 3.0

  • Microsoft Windows XP Professional
  • kbhowtomaster KB322091 KbMtvi
Phản hồi