Qt:打印原始文本

我需要在Qt应用程序中将ZPL脚本输出到Zebra打印机。 打印机位于客户端计算机中configuration为原始打印机的smb共享networking上。

如果我从C ++testing程序中调用cupsPrintFile( "printer_name", "./tmp_print_file.zpl", "", 0, NULL ) ,一切正常。

如果我使用QTextDocument::print()作为文档“./tmp_print_file.zpl”中的相同文本,则不会打印任何内容。 我嗅探networking,发现发送到打印机服务器的数据不是原始数据,而是一个后记!

有没有办法让数据发送到打印机,根本没有任何修改?

  • 让我清楚,我不想渲染一个文本,而是直接发送标签脚本,准备打印,直接打印机,了解ZPL协议。

感谢所有。


编辑:

正如@马丁所说,我试过了:

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

但它没有工作。

你能不能刚刚做你在测试程序中做的事情:

  • 创建一个临时文件( QTemporaryFile )。
  • 将内容发送到文件。
  • 打电话给cupsPrintFile方法。

或者,CUPS API可能会绕过临时文件。 免责声明:我对CUPS API绝对没有经验; 这只是粗略的看一些在线文档。 看起来可能是以下顺序:

  • cupsCreateJob> cupsStartDocument> cupsWriteRequestData> cupsFinishDocument

如果这样的话,你只需要将你的QString转换成正确的字节编码。

在我开始之前,一定要感谢戴夫。 他建议在使用银联打印时绕过临时文件工作正常。

现在,我的结论是:使用Qt打印原始数据并不容易。 也许创建自定义的QPainter或者下载QPrinter可能会给出一个解决方案,但这需要我太多的时间。

最终的解决方案是在我的Qt应用程序中使用CUPs API。 不幸的是,这不是便携式的。

这是一个片段:

 #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是可能的。 同时,这是足够的。

谢谢大家。

感谢fljx的代码,这对我非常有用。

我改变了发送原始文本斑马打印机的litte。

const char * format = CUPS_FORMAT_RAW ;

看看QPrinter() ,

QTextDocument旨在呈现格式化文本。