Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:打印原始文本_C++_Linux_Qt_Printing_Zebra Printers - Fatal编程技术网

C++ Qt:打印原始文本

C++ Qt:打印原始文本,c++,linux,qt,printing,zebra-printers,C++,Linux,Qt,Printing,Zebra Printers,我需要在Qt应用程序中将ZPL脚本输出到Zebra打印机。 打印机位于smb共享网络上,该网络在客户端计算机中配置为原始打印机 P> >从C++测试程序调用 CuPSPrimtFrm(“PRTITENYNE”,“./TMPApRelpTy.Fr.ZPL”,“0,NULL”< /COD> > 如果使用“/tmp\u print\u file.zpl”中与文档相同的文本,则不会打印任何内容。 我嗅探了一下网络,发现发送到打印机服务器的数据不是原始数据,而是postscript 是否有任何方法可以

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

<> P> >从C++测试程序调用<代码> CuPSPrimtFrm(“PRTITENYNE”,“./TMPApRelpTy.Fr.ZPL”,“0,NULL”< /COD> >

如果使用“/tmp\u print\u file.zpl”中与文档相同的文本,则不会打印任何内容。 我嗅探了一下网络,发现发送到打印机服务器的数据不是原始数据,而是postscript

是否有任何方法可以将数据发送到打印机而不进行任何修改

  • 让我明确一点,我不想呈现文本,只需将准备好打印的标签脚本直接发送到理解ZPL协议的打印机即可
谢谢大家


编辑:

正如@Martin所说,我试着:

printer.setOutputFormat( QPrinter::NativeFormat );
QTextDocument   *doc = new QTextDocument( QString( label ), this );
doc->print( &printer );
但它不起作用。

看看


QTextDocument设计用于呈现格式化文本。

您能否完全按照您在测试程序中所做的操作:

  • 创建临时文件(
    QTemporaryFile
  • 将内容发送到文件
  • 调用您的
    cupsPrintFile
    方法
或者CUPS API可能有一种绕过临时文件的方法。免责声明:我绝对没有使用CUPS API的经验;这只是基于对一些在线文档的粗略浏览。看起来可能是以下顺序:

  • cupsCreateJob>cupsStartDocument>cupsWriteRequestData>cupsFinishDocument

如果这样做有效,您只需将
QString
转换为正确的字节编码。

在我开始之前,必须感谢Dave。他建议在使用纸杯打印时绕过临时文件,效果很好

现在,我的结论是:没有简单的方法只使用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( ) );
#包括
//...
int打印标签(常量字符*文本,常量字符*打印机名称,常量字符*作业名称)
{
int-jobId=0;
jobId=cupsCreateJob(CUPS\u HTTP\u默认值,打印机名称,作业名称,0,空);
如果(作业ID>0)
{
qDebug()txtLabelScript->setPlainText(标签);
//调用打印函数。
如果(打印标签(标签,打印机.printerName().toAscii(),“斑马标签”)==0)

qDebug()感谢fljx的代码,它对我非常有用

我对发送原始文本到zebra打印机做了一些修改


const char*format=CUPS\u format\u RAW

好的。我应该在QPrinter中查找什么?我看到通过QPrinter向打印机发送数据的唯一方法是使用QPaint,它将呈现我的文本,而不是发送原始数据。我缺少什么?你不只是设置outputformat=NativeFormat,然后直接发送到打印机吗de>outputformat=NativeFormat
不起作用。我已经尝试过了,并且相信这一定是正确的方法。除非我做得非常错误,否则这不是一个解决方案。无论如何,谢谢。
NativeFormat
在QPrinter的上下文中意味着使用了本机打印系统的方法,即在Windows上这将是GDI。确实如此当然,这并不意味着打印机本身的本地方法。当然,这应该是可行的,但不会回答我的问题:如何在QT中这样做。我将调查您如何绕过临时文件的建议。真的谢谢。对不起,我不理解您的问题。我用QT的方式,它只是一个C++框架——一个完整的应用程序可以使用。不仅是Qt,还有许多其他第三方库(Boost等)如果你已经可以在C++中完成它,就不需要经过QT。你需要通过QT API来做这件事而不是直接在C++中吗?它是有效的。我必须从内存中打印出来,没有任何临时文件,正如戴夫建议的。我会为QT唯一的解决方案多搜索一点(希望是便携式的)。。如果失败,这将是响应。取决于您如何定义可移植。它肯定不是纯QT。在我看来,这并不一定意味着不可移植。这不使用操作系统/设备特定的api调用。它使用两个多平台框架工作QT和CUPS。