Мое приложение должно распечатать счета, затем получение счета от базы данных, вставить информацию о счете в большой строке (говорящий строку, столбец, и т.д.) после этого у меня есть строка, готовая быть отправленной на принтер.
Моя проблема: Я должен поместить некоторые команды/символы ESC/P в свою большую строку
Я пытался сделать что-то вроде этого:
char formFeed = (char)12;
Convert.ToChar(12);
MyBigString.Insert(10, formFeed);
С этим строка 10 сделает FormFeed, но это не работает
Примечание: Я отправляю MybigString внезапно на принтер.
Для создания моих работ кода я должен отправить данные линию за линией на принтер?
Спасибо за справку.
PS: Извините, для моего английского языка, I'am бразильский разработчик, которые (еще) не говорят на английском языке.
Обход драйвера принтера и управление принтером напрямую, используя его родной командный язык, является поддерживаемым сценарием. P/Invoke хорошо объясняется в этой статье KB.
Вы уверены, что хотите это сделать? Это, мягко говоря, необычно, обычно это пытаются сделать только с недорогими термо- или матричными принтерами. Если вам не нравится механика PrintDocument.PrintPage, никому не нравится, вы можете рассмотреть мой код в этой теме. Обратите внимание на метод FormFeed.
Я уже писал об этом в блоге, после того как мне пришлось делать это самому. Чтобы не гудеть слишком громко, но я рекомендую вам прочитать эту запись, поскольку я говорю о сложной команде изображения с принтером. Если ты это понимаешь, ты можешь печатать все, что угодно!
(Я говорю о ESC / POS, используемых в принтерах розничных чеков, но семантика обсуждения применима и к ESC / P, более старому языку точечной матрицы).
Короче говоря, используйте BinaryWriter
вместо строки
, иначе вы безнадежно запутаетесь (как я), поскольку определенные символы «запекаются» в неправильной кодировке на пути к принтеру. (Поверьте мне! Не используйте StringBuilder
при попытке говорить в ESC / POS.)
Будьте осторожны, чтобы не использовать перегрузку Write (string)
для BinaryWriter
, поскольку он добавит длину строки в виде байта в поток, а это не то, что вам нужно. ( Я также писал об этом после того, как узнал, что трудный путь тоже в том же проекте.)
Затем я использую некоторый код для отправки массива байтов
, полученного из BinaryWriter
, прямо на принтер с помощью P / Invoking:
private static void Print(string printerName, byte[] document)
{
NativeMethods.DOC_INFO_1 documentInfo;
IntPtr printerHandle;
documentInfo = new NativeMethods.DOC_INFO_1();
documentInfo.pDataType = "RAW";
documentInfo.pDocName = "Bit Image Test";
printerHandle = new IntPtr(0);
if (NativeMethods.OpenPrinter(printerName.Normalize(), out printerHandle, IntPtr.Zero))
{
if (NativeMethods.StartDocPrinter(printerHandle, 1, documentInfo))
{
int bytesWritten;
byte[] managedData;
IntPtr unmanagedData;
managedData = document;
unmanagedData = Marshal.AllocCoTaskMem(managedData.Length);
Marshal.Copy(managedData, 0, unmanagedData, managedData.Length);
if (NativeMethods.StartPagePrinter(printerHandle))
{
NativeMethods.WritePrinter(
printerHandle,
unmanagedData,
managedData.Length,
out bytesWritten);
NativeMethods.EndPagePrinter(printerHandle);
}
else
{
throw new Win32Exception();
}
Marshal.FreeCoTaskMem(unmanagedData);
NativeMethods.EndDocPrinter(printerHandle);
}
else
{
throw new Win32Exception();
}
NativeMethods.ClosePrinter(printerHandle);
}
else
{
throw new Win32Exception();
}
}
Удачи!