Печать необработанных данных на термопринтер с использованием .NET - PullRequest
6 голосов
/ 14 апреля 2010

Я пытаюсь распечатать сырые данные ascii на термопринтер. Я делаю это, используя этот пример кода: http://support.microsoft.com/kb/322091, но мой принтер печатает всегда только один символ, и это не так, пока я не нажму кнопку подачи формы. Если я что-то распечатаю с помощью блокнота, принтер автоматически выполнит подачу формы, но без печати текста.

Принтер подключен через 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" после того, как я нажал кнопку подачи формы (эта маленькая черная кнопка здесь: swissmania.ch/images/935-151.jpg - извините, недостаточно репутации для двух гиперссылок)

Изменить 15.04.2010 16: 56

Я сейчас использую форму кода здесь: c-sharpcorner.com/UploadFile/johnodonell/PrintingDirectlytothePrinter11222005001207AM/PrintingDirectlytothePrinter.aspx

Я немного изменил его, чтобы использовать следующий код:

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

Запуск этого кода имеет тот же эффект, что и нажатие кнопки подачи формы, он работает отлично!

Но такой код все еще не работает:

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

Это выведет только «B», но я ожидаю, что «BC» и после запуска любого кода, я должен повторно подключить кабель USB, чтобы заставить его работать agian. Есть идеи?

Ответы [ 2 ]

6 голосов
/ 01 декабря 2013

Быстрое пошаговое решение

Поскольку код не был предоставлен, я заставляю его работать с помощью предоставленных ссылок, и вот код:

код

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 (printerAddress, documentText, documentName);

Источники:

5 голосов
/ 16 апреля 2010

Хорошо, причина всего этого заключается в том, что я использую адаптер, потому что мой компьютер не имеет старого порта lpt. Я скопировал свое приложение на старый компьютер под управлением Windows XP и все работает нормально.

Теперь я должен надеяться, что некоторые другие adaters lpt2usb, которые я купил, работают правильно.

Изменить 20.04.2010

С другим адаптером lpt2usb теперь все работает нормально. Если кто-то вписал весь код, который я сейчас использую, свяжитесь со мной или оставьте комментарий здесь.

...