كيفية إرسال البيانات الأولية إلى طابعة باستخدام Visual C#.NET

للحصول على إصدار Microsoft Visual Basic.NET من هذه المقالة، راجع 322090 .

لإصدار + + C غير مدارة من هذه المقالة، راجع المقالة التالية في "قاعدة المعارف ل Microsoft":
كيفية إرسال البيانات الأولية إلى طابعة باستخدام واجهة برمجة تطبيقات Win32 138594

تشير هذه المقالة إلى مكتبة فئات Microsoft.NET Framework مساحات الأسماء التالية:

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

في هذه المهمة

ملخص

يوضح هذا المقال خطوة بخطوة كيفية استخدام وظائف التخزين المؤقت Win32 من أحد برامج التي تم إنشاؤها باستخدام Visual C#.NET.


مزيد من المعلومات

لإرسال البيانات الأولية إلى طابعة من Microsoft.NET Framework، أن يعمل البرنامج مع وظائف Win32 التخزين المؤقت. من خلال.NET Framework، يمكنك طباعة باستخدام برينتدوكومينتو برينتكونتروليروالفئات المرتبطة بها. ومع ذلك، مع.NET Framework، لا يمكن إرسال بيانات الطابعة جاهزة المنسقة إلى طابعة.


قد تضطر لإرسال البيانات الخام إلى طابعة للقيام بما يلي:
  • إرسال تسلسل الهروب.
  • تحميل، واستخدام خطوط النظام.
  • ملفات التخزين المؤقت قبل الطباعة.
لإرسال هذه الأنواع والأنواع الأخرى من البيانات الخام إلى طابعة، أن تعمل التعليمات البرمجية الخاصة بك مع "واجهات مبرمج التطبيق Win32 التخزين المؤقت" (APIs). التعليمة البرمجية التالية يوضح كيفية قراءة محتويات ملف المنسقة مسبقاً في الذاكرة، وقم بإرسال وحدات البايت تلك إلى الطابعة باستخدام ريتيبرينتير.


ملاحظة: لا يمكنك استخدام هذا الأسلوب في مهمة الطباعة نفس كمهمة طباعة 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 لطباعة سلسلة. (قد تضطر لإخراج الصفحة يدوياً لأن السلسلة التي يتم إرسالها دون أمر formfeed ).

المراجع

لمزيد من المعلومات، انقر فوق أرقام المقالات التالية لعرضها في "قاعدة معارف Microsoft":

كيفية إرسال البيانات الأولية إلى طابعة باستخدام واجهة برمجة تطبيقات Win32 138594

خصائص

رقم الموضوع: 322091 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات