Τρόπος αποστολής μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή χρησιμοποιώντας το Visual C# .NET

Για την Microsoft Visual Basic .NET έκδοση αυτού του άρθρου, ανατρέξτε στην ενότητα 322090 .

Για μια μια μη διαχειριζόμενη C++ έκδοση αυτού του άρθρου, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
138594 ΔΙΑΔΙΚΑΣΙΕΣ: Αποστολή μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή χρησιμοποιώντας το API του Win32

Αυτό το άρθρο αναφέρεται από τα παρακάτω πεδία ονομάτων βιβλιοθήκη κλάσης του Microsoft .NET Framework:

  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropServices

ΣΕ ΑΥΤΉΝ ΤΗΝ ΕΡΓΑΣΊΑ

Σύνοψη

Αυτό το άρθρο βήμα προς βήμα δείχνει πώς να χρησιμοποιήσετε λειτουργίες ουράς εκτύπωσης Win32 από ένα πρόγραμμα που δημιουργείτε χρησιμοποιώντας το Visual C# .NET.


Περισσότερες πληροφορίες

Για την αποστολή μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή από το Microsoft .NET Framework, το πρόγραμμα πρέπει να εργαστείτε με τις συναρτήσεις ουρά εκτύπωσης Win32. Μέσω του .NET Framework, μπορείτε να εκτυπώσετε χρησιμοποιώντας PrintDocument, PrintControllerκαι σχετικές κατηγορίες. Ωστόσο, με το .NET Framework, δεν μπορείτε να στείλετε προ-μορφοποιημένων δεδομένων έτοιμο εκτυπωτή σε εκτυπωτή.


Ίσως χρειαστεί να στείλετε μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή για να κάνετε τα εξής:
  • Στείλτε τις ακολουθίες χαρακτήρων escape.
  • Κάντε λήψη και στη συνέχεια χρησιμοποιήστε γραμματοσειρές που φορτώνονται.
  • Τα αρχεία εκτύπωσης σε ουρά εκ των προτέρων τυπωμένο.
Για την αποστολή αυτών των τύπων και άλλους τύπους από μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή, ο κώδικάς σας πρέπει να λειτουργούν με διασυνδέσεις προγραμματιστή εφαρμογών Win32 ουράς (API). Ο ακόλουθος κώδικας δείχνει τον τρόπο για να διαβάζει τα περιεχόμενα ενός προ-μορφοποιημένου αρχείου στη μνήμη και, στη συνέχεια, αποστολή των byte στον εκτυπωτή, χρησιμοποιώντας WritePrinter.


ΣΗΜΕΊΩΣΗ: δεν μπορείτε να χρησιμοποιήσετε αυτή την προσέγγιση στην ίδια εργασία εκτύπωσης ως μια εγγενή εργασία εκτύπωσης PrintDocument . Πρέπει είτε να χρησιμοποιήσετε το .NET Framework για να εκτυπώσετε ή να στείλετε τη δική σας εργασία εκτύπωσης bytes.


Δημιουργήστε ένα έργο που εκτυπώνει προ-μορφοποιημένων δεδομένων

  1. Ξεκινήστε το Visual Studio .NET. Στο μενού αρχείο , κάντε κλικ στην επιλογή Δημιουργίακαι, στη συνέχεια, κάντε κλικ στο έργο. Στην περιοχή Τύπους έργων, κάντε κλικ στο φάκελο Visual C# έργα . Στη λίστα " πρότυπα ", κάντε κλικ στο κουμπί Εφαρμογή των Windowsκαι, στη συνέχεια, κάντε κλικ στο κουμπί OK. Από προεπιλογή, δημιουργείται η φόρμα 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 για να εκτυπώσετε μια συμβολοσειρά. (Ίσως χρειαστεί να αφαιρέσετε με μη αυτόματο τρόπο τη σελίδα επειδή η ακολουθία χαρακτήρων αποστέλλεται χωρίς την εντολή αλλαγής σελίδας ).

Αναφορές

Για περισσότερες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft:

138594 ΔΙΑΔΙΚΑΣΙΕΣ: Αποστολή μη επεξεργασμένα δεδομένα σε έναν εκτυπωτή χρησιμοποιώντας το API του Win32

Ιδιότητες

Αναγνωριστικό άρθρου: 322091 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια