Qt:打印原始文本

时间:2011-04-05 20:41:11

标签: c++ linux qt printing zebra-printers

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

如果我从C ++测试程序中调用cupsPrintFile( "printer_name", "./tmp_print_file.zpl", "", 0, NULL ),一切都会好起来的。

如果我使用{。1}}使用“./tmp_print_file.zpl”中的相同文本作为文档,则不会打印任何内容。 我嗅到网络,发现发送到打印机服务器的数据不是原始数据,但是,后记!

有没有办法将数据发送到打印机而根本没有修改?

  • 让我明确一点,我不想呈现文本,而只是将准备打印的标签脚本直接发送到了解ZPL协议的打印机。 / LI>

谢谢大家。


编辑:

正如@Martin所说,我试过了:

QTextDocument::print()

但它不起作用。

4 个答案:

答案 0 :(得分:2)

你能完全按照你在测试程序中所做的那样做:

  • 创建临时文件(QTemporaryFile)。
  • 将内容发送到文件。
  • 调用cupsPrintFile方法。

或者可能有一种方法可以使CUPS API绕过临时文件。 免责声明:我绝对没有使用CUPS API的经验;这只是基于对一些在线文档的粗略看法。看起来可能是以下序列:

  • cupsCreateJob> cupsStartDocument> cupsWriteRequestData> cupsFinishDocument

如果可行,您只需将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旨在呈现格式化文本。