Qt:打印原始文本

Qt: Print raw text

本文关键字:文本 原始 打印 Qt      更新时间:2023-10-16

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

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

如果我使用QTextDocument::print()使用相同的文本在"。/tmp_print_file。作为文档,没有打印出来。我嗅探了一下网络,发现发送到打印机服务器的数据不是原始数据,而是后记!

有没有办法让数据发送到打印机没有修改吗?

  • 让我明确一下,我不想渲染文本,而只是发送标签脚本,准备打印,直接到打印机,这理解ZPL协议。

谢谢大家。


编辑:

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

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

在我开始之前,我必须感谢Dave。他的建议是在使用CUPs打印时绕过临时文件。

现在,我的结论是:没有简单的方法可以只使用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是可能的。同时,这也足够了。

谢谢大家。

你能完全按照你在测试程序中所做的做吗?

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

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

  • cupsCreateJob> cupsStartDocument> cupsWriteRequestData> cupsFinishDocument

如果可以,您只需要将QString转换为正确的字节编码。

感谢fljx的代码,它对我来说非常有用。

我对将原始文本发送到zebra打印机进行了一些更改。

const char *格式= CUPS_FORMAT_RAW ,

看看QPrinter(),

QTextDocument是用来呈现格式化文本的。