طباعة البيانات الأولية إلى طبقة حرارية باستخدام .NET

StackOverflow https://stackoverflow.com/questions/2638988

  •  26-09-2019
  •  | 
  •  

سؤال

أحاول طباعة بيانات ASCII الخام إلى طابعة حرارية. أفعل هذا باستخدام مثال الرمز هذا: http://support.microsoft.com/kb/322091 لكن طابعتي تطبع دائمًا حرفًا واحدًا فقط وهذا ليس حتى أضغط على زر تغذية النموذج. إذا قمت بطباعة شيء ما باستخدام Notepad ، فستقوم الطابعة بتغذية النموذج تلقائيًا ولكن دون طباعة أي نص.

يتم توصيل الطابعة عبر USB عبر محول LPT2USB ويستخدم Windows 7 برنامج تشغيل "عام -> عام / نص" فقط ".

أي شخص يعرف ما الذي يحدث؟ كيف يمكن طباعة بعض الكلمات والقيام ببعض الأعلاف؟ هل هناك بعض أحرف التحكم التي يجب أن أرسلها؟ وإذا كانت الإجابة بنعم: كيف أرسلهم؟

تحرير 14.04.2010 21:51

رمزتي (C#) يبدو هكذا:

PrinterSettings s =  new PrinterSettings();
s.PrinterName = "Generic / Text Only";

RawPrinterHelper.SendStringToPrinter(s.PrinterName, "Test");

سيعود هذا الرمز "T" بعد الضغط على زر تغذية النموذج (هذا الزر الأسود Litte هنا: Swissmania.ch/Images/935-151.jpg - آسف ، لا تكفي سمعة لارتينات التشعبية)

تحرير 15.04.2010 16:56

أنا الآن أستخدم نموذج الكود هنا: c-sharpcorner.com/uploadfile/johnodonell/printdirectlytotheprinter11222005001207am/printdirectlytotheprinter.aspx

لقد قمت بتعديله قليلاً بحيث يمكنني استخدام الكود التالي:

byte[] toSend;
// 10 = line feed
// 13 carriage return/form feed
toSend = new byte[1] { 13 };
PrintDirect.WritePrinter(lhPrinter, toSend, toSend.Length, ref pcWritten);

تشغيل هذا الرمز له نفس effekt مثل الضغط على زر تغذية النموذج ، فهو يعمل بشكل جيد!

لكن كود مثل هذا لا يزال لا يعمل:

byte[] toSend;
// 10 = line feed
// 13 carriage return/form feed
toSend = new byte[2] { 66, 67 };
PrintDirect.WritePrinter(lhPrinter, toSend, toSend.Length, ref pcWritten);

سيطبع هذا مجرد "ب" لكني أتوقع "قبل الميلاد" و بعد تشغيل أي رمز ، يجب علي إعادة توصيل كابل USB لجعله يعمل Agian. أيه أفكار؟

هل كانت مفيدة؟

المحلول 2

حسنًا ، السبب في كل هذه الأشياء هو مجرد حقيقة أنني أستخدم محولًا لأن جهاز الكمبيوتر الخاص بي ليس لديه منفذ LPT قديم. قمت بنسخ طلبي إلى جهاز كمبيوتر قديم يعمل Windows XP وكل شيء يعمل بشكل جيد.

الآن يجب أن آمل أن يقوم بعض LPT2USB ADATERS بشراءهم بعملهم بشكل صحيح.

تحرير 20.04.2010

مع محول LPT2USB آخر يعمل كل شيء بشكل جيد الآن. إذا كان أي شخص intersted في جميع التعليمات البرمجية التي أستخدمها الآن ، فيرجى الاتصال بي أو التعليق هنا.

نصائح أخرى

حل سريع خطوة بخطوة

نظرًا لعدم توفير الكود ، أجعله يعمل بمساعدة روابط متوفرة ، وهنا الرمز:

شفرة

using System;
using System.Runtime.InteropServices;
using System.Windows;

[StructLayout(LayoutKind.Sequential)]
public struct DOCINFO {
    [MarshalAs(UnmanagedType.LPWStr)]
    public string pDocName;
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string pOutputFile;
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string pDataType;
}

public class PrintDirect {
    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
    public static extern long OpenPrinter(string pPrinterName, ref IntPtr phPrinter, int pDefault);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
    public static extern long StartDocPrinter(IntPtr hPrinter, int Level, ref DOCINFO pDocInfo);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long StartPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long WritePrinter(IntPtr hPrinter, string data, int buf, ref int pcWritten);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long EndPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long EndDocPrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long ClosePrinter(IntPtr hPrinter);
}

private void Print(String printerAddress, String text, String documentName) {
    IntPtr printer = new IntPtr();

    // A pointer to a value that receives the number of bytes of data that were written to the printer.
    int pcWritten = 0;

    DOCINFO docInfo = new DOCINFO();
    docInfo.pDocName = documentName;
    docInfo.pDataType = "RAW";

    PrintDirect.OpenPrinter(printerAddress, ref printer, 0);
    PrintDirect.StartDocPrinter(printer, 1, ref docInfo);
    PrintDirect.StartPagePrinter(printer);

    try {
    PrintDirect.WritePrinter(printer, text, text.Length, ref pcWritten);
    } catch (Exception e) {
        Console.WriteLine(e.Message);
    }

    PrintDirect.EndPagePrinter(printer);
    PrintDirect.EndDocPrinter(printer);
    PrintDirect.ClosePrinter(printer);
}

الاستخدام

String printerAddress = "\\\\ComputerName\\PrinterName";
String documentName = "My document";
String documentText = "This is an example of printing directly to a printer.";

this.print (printerddress ، documentText ، documentName) ؛

مصادر:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top