3

QtアプリケーションでZPLスクリプトをZebraプリンターに出力する必要があります。プリンターは、クライアントコンピューターでrawプリンターとして構成されたsmb共有ネットワーク上にあります。

cupsPrintFile( "printer_name", "./tmp_print_file.zpl", "", 0, NULL )C ++テストプログラムから呼び出すと、すべてうまくいきます。

QTextDocument::print()「./tmp_print_file.zpl」でドキュメントと同じテキストを使用すると、何も印刷されません。ネットワークをスニッフィングしたところ、プリンタサーバーに送信されるデータは生データではなく、追記であることがわかりました。

まったく変更を加えずにデータをプリンターに送信する方法はありますか?

  • テキストをレンダリングしたくないことを明確にしておきますが、印刷の準備ができているラベルスクリプトを、ZPLプロトコルを理解するプリンターに直接送信するだけです。

全てに感謝。


編集:

@Martinが言ったように、私は試しました:

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

しかし、それは機能しませんでした。

4

4 に答える 4

3

始める前に、デイブに感謝しなければなりません。CUPで印刷するときに一時ファイルをバイパスするという彼の提案はうまく機能します。

さて、私の結論:Qtのみを使用して生データを印刷する簡単な方法はありません。たぶん、カスタムを作成QPainterしたり、QPrinterの一部を調べたりすることで解決策が得られるかもしれませんが、時間がかかりすぎます。

最終的な解決策は、Qtアプリケーション内でCUPsAPIを使用することです。残念ながら、それはポータブルではありません。

スニペットは次のとおりです。

#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のみが可能であることを証明する別のソリューションを追加してくれる仲間がいることを願っています。その間、それで十分です。

みんなありがとう。

于 2011-04-08T11:15:47.403 に答える
2

テストプログラムで行ったことを正確に行うことができますか:

  • 一時ファイルを作成します ( QTemporaryFile)。
  • 内容をファイルに送信します。
  • メソッドを呼び出しますcupsPrintFile

または、CUPS API を使用して一時ファイルをバイパスする方法がおそらくあります。免責事項: 私は CUPS API の経験がまったくありません。これは、いくつかのオンライン ドキュメントをざっと見ただけに基づいています。おそらく次のシーケンスのように見えます。

  • cupsCreateJob > cupsStartDocument > cupsWriteRequestData > cupsFinishDocument

QStringそれが機能する場合は、正しいバイトエンコーディングに変換するだけです。

于 2011-04-06T15:05:05.707 に答える
1

fljx のコードをありがとう、それは私にとって非常に便利です。

生のテキストをゼブラプリンターに送信するために少し変更しました。

const char* format = CUPS_FORMAT_RAW ;

于 2014-10-21T12:05:54.513 に答える
0

QPrinter()を見てください、

QTextDocumentは、フォーマットされたテキストをレンダリングするように設計されています。

于 2011-04-05T21:03:54.047 に答える