我需要在Qt应用程序中将ZPL脚本输出到Zebra打印机。 打印机位于客户端计算机中配置为原始打印机的smb共享网络上。
如果我从C ++测试程序中调用cupsPrintFile( "printer_name", "./tmp_print_file.zpl", "", 0, NULL )
,一切都会好起来的。
如果我使用{。1}}使用“./tmp_print_file.zpl”中的相同文本作为文档,则不会打印任何内容。 我嗅到网络,发现发送到打印机服务器的数据不是原始数据,但是,后记!
有没有办法将数据发送到打印机而根本没有修改?
谢谢大家。
编辑:
正如@Martin所说,我试过了:
QTextDocument::print()
但它不起作用。
答案 0 :(得分:2)
你能完全按照你在测试程序中所做的那样做:
QTemporaryFile
)。cupsPrintFile
方法。或者可能有一种方法可以使CUPS API绕过临时文件。 免责声明:我绝对没有使用CUPS API的经验;这只是基于对一些在线文档的粗略看法。看起来可能是以下序列:
如果可行,您只需将QString
转换为正确的字节编码。
答案 1 :(得分:2)
在开始之前,一定要感谢戴夫。他建议在使用CUP打印时绕过临时文件可以正常工作。
现在,我的结论是:没有简单的方法只使用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-only是可能的。同时,这就够了。
谢谢大家。
答案 2 :(得分:1)
感谢fljx的代码,这对我来说非常有用。
我改变了将原始文本发送到斑马打印机的小事。
const char * format = CUPS_FORMAT_RAW ;
答案 3 :(得分:0)
看看QPrinter(),
QTextDocument旨在呈现格式化文本。