我需要在Qt应用程序中将ZPL脚本输出到Zebra打印机。 打印机位于客户端计算机中configuration为原始打印机的smb共享networking上。
如果我从C ++testing程序中调用cupsPrintFile( "printer_name", "./tmp_print_file.zpl", "", 0, NULL )
,一切正常。
如果我使用QTextDocument::print()
作为文档“./tmp_print_file.zpl”中的相同文本,则不会打印任何内容。 我嗅探networking,发现发送到打印机服务器的数据不是原始数据,而是一个后记!
有没有办法让数据发送到打印机,根本没有任何修改?
感谢所有。
编辑:
正如@马丁所说,我试过了:
printer.setOutputFormat( QPrinter::NativeFormat ); QTextDocument *doc = new QTextDocument( QString( label ), this ); doc->print( &printer );
但它没有工作。
你能不能刚刚做你在测试程序中做的事情:
QTemporaryFile
)。 cupsPrintFile
方法。 或者,CUPS API可能会绕过临时文件。 免责声明:我对CUPS API绝对没有经验; 这只是粗略的看一些在线文档。 看起来可能是以下顺序:
如果这样的话,你只需要将你的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旨在呈现格式化文本。