Qt:打印原始文本
Qt: Print raw text
我需要在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(),
- 文本文件中的单词链表
- 从命令行c++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 将以 null 结尾的字节字符串转换为原始字符串文本
- 用户定义的文本运算符(在原始模式下)存在问题
- 是否可以在原始字符串文本中插入转义序列?
- 试图打开并读取一个.txt文件,但它从原始文件中删除了实际文本(Qt GUI C++
- 编码大于原始文本:如何获取零和一的字符串并将它们作为实际字节写入文件
- std::string 参数是如何从原始字符数组文本传递的
- 有没有一种方法可以使用预处理器将文本资源拉入原始字符串
- 文件的解密显示原始文本和密文
- 在编译时将文本文件导入原始字符串文本
- 如何将XML文件拆分为多个XML,以便每个新文件只包含原始文件中的一个文本节点
- 在编译/运行时将字符串文本的原始字节流入/流出Windows(非宽)执行字符集,以及ANSI代码页与UTF-8
- 在C++中创建原始文本字符串,类似于 C# 的"@ string"
- 使用crypto++解密时,原始文本末尾的垃圾冗余字符
- 存储数组的地址列表,以解析原始的非终止文本
- 在Qt的q明文小部件中可视化原始文本的问题
- 在原始字符串文本中包含 )"而不终止所述文本
- Qt:打印原始文本