Отправьте команды ESC на принтер в C#

Мое приложение должно распечатать счета, затем получение счета от базы данных, вставить информацию о счете в большой строке (говорящий строку, столбец, и т.д.) после этого у меня есть строка, готовая быть отправленной на принтер.

Моя проблема: Я должен поместить некоторые команды/символы ESC/P в свою большую строку

Я пытался сделать что-то вроде этого:

        char formFeed = (char)12;
        Convert.ToChar(12);

        MyBigString.Insert(10, formFeed);

С этим строка 10 сделает FormFeed, но это не работает

Примечание: Я отправляю MybigString внезапно на принтер.

Для создания моих работ кода я должен отправить данные линию за линией на принтер?

Спасибо за справку.

PS: Извините, для моего английского языка, I'am бразильский разработчик, которые (еще) не говорят на английском языке.

6
задан Jack Frost 9 April 2014 в 18:42
поделиться

2 ответа

Обход драйвера принтера и управление принтером напрямую, используя его родной командный язык, является поддерживаемым сценарием. P/Invoke хорошо объясняется в этой статье KB.

Вы уверены, что хотите это сделать? Это, мягко говоря, необычно, обычно это пытаются сделать только с недорогими термо- или матричными принтерами. Если вам не нравится механика PrintDocument.PrintPage, никому не нравится, вы можете рассмотреть мой код в этой теме. Обратите внимание на метод FormFeed.

5
ответ дан 10 December 2019 в 00:35
поделиться

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

(Я говорю о 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();
    }
}

Удачи!

5
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: