Qt:打印原始文本

我需要在Qt应用程序中将ZPL脚本输出到Zebra打印机。 打印机位于客户端计算机中配置为原始打印机的smb共享网络上。 如果我从C ++测试程序中调用
cupsPrintFile( "printer_name", "./tmp_print_file.zpl", "", 0, NULL )
,一切都会好起来的。 如果我使用.1ѭ使用“./tmp_print_file.zpl”中的相同文本作为文档,则不会打印任何内容。 我嗅到网络,发现发送到打印机服务器的数据不是原始数据,但是,后记! 有没有办法将数据发送到打印机而不进行任何修改? 让我明确一点,我不想渲染文本,只是将准备打印的标签脚本直接发送到了解ZPL协议的打印机。 谢谢大家。 编辑: 正如@Martin所说,我试过:
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
转换为正确的字节编码。     
在开始之前,一定要感谢戴夫。他建议在使用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^XZn"
    "^XAn"
    "^MMTn"
    "^LL0600n"
    "^PW900n"
    "^LS0n"
    "^BY2,3,54^FT24,109^BCN,,Y,Nn"
    "^FD>;43210000>773>0000^FSn"
    "^PQ1,0,1,Y^XZn";

    // 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是可能的。同时,这就足够了。 谢谢大家。     
感谢fljx的代码,它对我非常有用。 我改变了将原始文本发送到斑马打印机的过程。 const char * format = CUPS_FORMAT_RAW;     
看看QPrinter(), QTextDocument旨在呈现格式化文本。     

要回复问题请先登录注册