Qt: печатать необработанный текст - PullRequest
3 голосов
/ 06 апреля 2011

Мне нужно вывести скрипт ZPL на принтер Zebra в приложении Qt.Принтер находится в общей сети smb, настроенной на клиентском компьютере как raw printer .

Все идет хорошо, если я вызываю cupsPrintFile( "printer_name", "./tmp_print_file.zpl", "", 0, NULL ) из тестовой программы C ++.

Если я использую QTextDocument::print(), используя тот же текст в «./tmp_print_file.zpl», что и документ, ничего не печатается.Я понюхал сеть и обнаружил, что данные, отправляемые на сервер принтера , - это не необработанные данные, а постскриптум!

Есть ли способ получить данные, отправленные на принтер сникаких изменений вообще?

  • Позвольте мне прояснить, что я не хочу визуализировать текст, а просто отправить скрипт метки, который готов к печати, непосредственно впринтер, который понимает протокол ZPL.

Спасибо за все.


РЕДАКТИРОВАТЬ:

Как сказал @Martin, я попытался:

printer.setOutputFormat( QPrinter::NativeFormat );
QTextDocument   *doc = new QTextDocument( QString( label ), this );
doc->print( &printer );

но это не сработало.

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

Не могли бы вы сделать именно то, что сделали в своей тестовой программе:

  • Создать временный файл (QTemporaryFile).
  • Отправить содержимое в файл.
  • Вызовите свой метод cupsPrintFile.

Или, возможно, с помощью CUPS API можно обойти временный файл. Отказ от ответственности: у меня нет абсолютно никакого опыта работы с CUPS API;это просто основано на беглом взгляде на некоторую онлайн-документацию. Возможно, выглядит следующая последовательность:

  • cupsCreateJob> cupsStartDocument> cupsWriteRequestData> cupsFinishDocument

Если этоработает, вам просто нужно преобразовать QString в правильную кодировку байтов.

2 голосов
/ 08 апреля 2011

Прежде чем начать, должен поблагодарить ДэйваЕго предложение обойти временный файл во время печати с помощью CUP работает нормально.

Теперь мой вывод: не существует простого способа распечатать необработанные данные, используя только Qt.Возможно, создание пользовательского QPainter или переход к битам QPrinter может дать решение, но это займет у меня слишком много времени.

Окончательное решение - просто использовать API CUPs внутри моего приложения Qt.К сожалению, он не переносимый.

Вот фрагмент:

#include    <cups/cups.h>

//...

int print_label( const char *text, const char *printer_name, const char *job_name )
{
    int jobId = 0;

    jobId = cupsCreateJob( CUPS_HTTP_DEFAULT, printer_name, job_name, 0, NULL );

    if ( jobId > 0 )
    {
        qDebug( ) << "Printing job #" << jobId << " (\"" << job_name << "\").";

        const char* format = CUPS_FORMAT_TEXT;  // CUPS_FORMAT_POSTSCRIPT;

        cupsStartDocument( CUPS_HTTP_DEFAULT, printer_name, jobId, text, format, true );
        cupsWriteRequestData( CUPS_HTTP_DEFAULT, text, strlen( text ) );

        cupsFinishDocument( CUPS_HTTP_DEFAULT, printer_name );
    }

    return jobId;
}

//...

// Now, inside any Qt function (may be a slot):

QPrinter printer;

QPrintDialog *dialog = new QPrintDialog( &printer, this );
dialog->setWindowTitle( tr( "Zebra label" ) );
if ( dialog->exec( ) != QDialog::Accepted )
    return;

    // This is the sample label. Can be anything.
const char  label[] =
    "^XA~TA000~JSN^LT0^MNW^MTD^PON^PMN^LH0,0^JMA^PR4,4^MD0^JUS^LRN^CI0^XZ\n"
    "^XA\n"
    "^MMT\n"
    "^LL0600\n"
    "^PW900\n"
    "^LS0\n"
    "^BY2,3,54^FT24,109^BCN,,Y,N\n"
    "^FD>;43210000>773>0000^FS\n"
    "^PQ1,0,1,Y^XZ\n";

    // Informative only.
ui->txtLabelScript->setPlainText( label );

    // Call the printing function.
if ( print_label( label, printer.printerName( ).toAscii( ), "Zebra_Label" ) == 0 )
    qDebug( ) << "CUPS Error: " << ippErrorString( cupsLastError( ) );

И все готово.

Не забудьте связать libcups (-lcups).

Я все еще надеюсь, что любой собеседник добавит другое решение, доказывающее, что возможен только Qt.Между тем этого достаточно.

Спасибо всем.

1 голос
/ 21 октября 2014

Спасибо за код fljx, он очень полезен для меня.

Я изменил формат для отправки необработанного текста на принтер Zebra.

const char * format = CUPS_FORMAT_RAW ;

0 голосов
/ 06 апреля 2011

Посмотрите на QPrinter () ,

QTextDocument предназначен для визуализации форматированного текста.

...