Печать необработанных данных в тепловой принтер с использованием .NET
-
26-09-2019 - |
Вопрос
Я пытаюсь распечатать данные RAW ASCII в тепловой принтер. Я делаю это, используя этот пример кода: http://support.microsoft.com/kb/322091. Но мой принтер печатает всегда только один символ, и это не нажмете кнопку подачи формы. Если я распечатаю что-то с помощью Notepad, принтер будет автоматически выполнять корм формы, но без печати ни одного текста.
Принтер подключен через USB через адаптер LPT2USB и Windows 7 использует драйвер «Generic -> Generic / Text».
Кто-нибудь знает, что идет не так? Как можно распечатать несколько слов и делать некоторые кормы формы? Есть ли какие-то контрольные символы, которые я должен отправить? И если да: как я их отправить?
Редактировать 14.04.2010 21:51.
Мой код (C #) выглядит так:
PrinterSettings s = new PrinterSettings();
s.PrinterName = "Generic / Text Only";
RawPrinterHelper.SendStringToPrinter(s.PrinterName, "Test");
Этот код вернет «T» после того, как я нажал кнопку подачи формы (эта кнопка «Litte Black»: 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», но я ожидаю, что «до н.э.» а также После запуска любого кода я должен подключить USB-кабель, чтобы сделать его работать Agian. Есть идеи?
Решение 2
Хорошо, причина для всех этих вещей - это только тот факт, что я использую адаптер, потому что мой компьютер не имеет старого порта LPT. Я скопировал свое приложение к старому компьютеру под управлением Windows XP и все работает нормально.
Теперь я должен надеяться, что некоторые другие адаверы LPT2USB, которые я купил, делаю их работу правильно.
Редактировать 20.04.2010.
С другим адаптером LPT2USB все работает нормально. Если кто-то находится в интервете во всем коде, я использую сейчас, пожалуйста, свяжитесь со мной или комментировать здесь.
Другие советы
Быстрый шаг за шагом решение
Потому что код не был предоставлен, я делаю его работать с помощью предоставленных ссылок, а вот код:
Код
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);