14

フォーム フィードを発行するようにプリンター ドライバーに指示する必要があります。

私は以下を使用してプリンターに直接印刷しています:

API 呼び出しのセット。

多くのインスピレーションはKB138594 - HOWTO: Send Raw Data to a Printer by Using the Win32 APIから得られました。その KB 記事で注意すべき重要な点は、彼ら (および私のコピーしたコード) が次のRAWモードでドキュメントを開始することです。

// Fill in the structure with info about this "document."
docInfo.pDocName = "My Document";
docInfo.pOutputFile = NULL;
docInfo.pDatatype = "RAW";
StartDocPrinter(hPrinter, 1, docInfo);

注: RAWモード (モードではなくTEXT) は、生のバイトをプリンタードライバーに発行していることを意味します。私たちは、それが理解できる言語で話すことを約束します。

WritePrinter次に、必要なものすべてを記述するために使用できます。

WritePrinter(hPrinter, "Hello, world!"); //note, extra parameters removed for clarity
WritePrinter(hPrinter, 0x0c); //form-feed

ここでの問題は0x0c改ページ文字です。モードでプリンターを開いたので、RAW処理できるプリンター ドライバーのバイトを送信することを約束します。ほとんどのプリンターのドライバーは0x0C、フォーム フィードを発行することを意味します。

問題は、他のプリンター ( PDF プリンターMicrosoft XPS プリンター) がRAW印刷ジョブを独自のプリンター言語で行うことを想定していることです。上記を使用して XPS または PDF プリンターに印刷する場合: 何も起こりません (つまり、保存ダイアログが表示されず、何も印刷されません)。

少し前にこの質問の解決策を尋ねたところRAW、ドキュメント モードを次のように変更する必要があるという回答がありました。

docInfo.pDatatype = "RAW";

TEXT:

docInfo.pDataType = "TEXT";

これはおそらく、「RAW」データをプリンターに直接送信するためであり、RAW は任意の PDL である可能性があります。ただし、XPS ドライバーはおそらく XPS しか認識せず、おそらく "unknown: Hello, world!0xFF" PDL を無視するだけです。XPS ドライバーは、おそらく、XPS データに直接書き込む場合にのみ受け入れます。

XPS ドライバーでテキストをレンダリングする場合は、GDI を使用する必要があります。データ型として「TEXT」を指定すると、プレーンテキストをドライバーに送信できる場合があります。ドライバーに接続されているプリント プロセッサは、GDI を介してドライバーにジョブをレンダリングすることにより、平文を「変換」します。

それでうまくいったので、印刷ドキュメントをTEXT次のように宣言するようにコードを変更しました。

// Fill in the structure with info about this "document."
docInfo.pDocName = "My Document";
docInfo.pOutputFile = NULL;
docInfo.pDatatype = "TEXT";
StartDocPrinter(hPrinter, 1, docInfo);
WritePrinter(hPrinter, "Hello, world!");
WritePrinter(hPrinter, 0x0c); //form-feed

その後、XPS および PDF プリンターの [名前を付けて保存] ダイアログが表示され、正しく保存されます。そして、私はすべてが修正されたと思いました。

数か月後、<quote>実際の</quote> プリンターに印刷しようとしたときを除いて、フォーム フィードが発生しません。おそらく、「生のプリンター コマンド」モードで印刷していないためです。

だから私が必要としているのは、フォーム フィードを発行するWindows 風の方法です。プリンタにフォーム フィードを実行させたいことをプリンタ ドライバに伝える API 呼び出しが必要です。

私の質問:印刷中に Form-Feed を発行するようにプリンタに指示するにはどうすればよいですか?


データ型の背景

プリント プロセッサは、ドキュメントのデータ型に従ってジョブを変更するようにスプーラに指示します。プリンタ ドライバと連携して、スプールされた印刷ジョブをハード ドライブからプリンタに送信します。

ソフトウェア ベンダーは、独自のプリント プロセッサを開発して、カスタム データ型をサポートすることがあります。通常、プリント プロセッサは管理者による設定や介入を必要としません。

データ型

Windows の印刷プロセスでは、通常、5 つのデータ型がサポートされています。拡張メタファイル (EMF) と印刷準備完了 (RAW) という、最も一般的に使用される 2 つのデータ型は、クライアント コンピューターとプリント サーバー コンピューターの両方で、さまざまな方法でパフォーマンスに影響を与えます。

RAWWindows ベースのプログラム以外のクライアントの既定のデータ型です。RAW データ型は、印刷前に印刷ジョブをまったく変更しないようにスプーラーに指示します。このデータ型では、印刷ジョブを準備するプロセス全体がクライアント コンピュータで実行されます。

EMF、または拡張メタファイルは、ほとんどの Windows ベースのプログラムで既定のデータ型です。EMF を使用すると、印刷されたドキュメントは、RAW ファイルよりも移植性が高く、通常はどのプリンターでも印刷できるメタファイル形式に変更されます。EMF ファイルは、同じ印刷ジョブを含む RAW ファイルよりも小さくなる傾向があります。パフォーマンスに関しては、印刷ジョブの最初の部分のみがクライアント コンピューター上で変更またはレンダリングされますが、ほとんどの影響はプリント サーバー コンピューター上にあるため、クライアント コンピューター上のアプリケーションがより迅速にユーザーに制御を返すのにも役立ちます。

次の表 ( MSDN から取得) は、既定の Windows プリント プロセッサでサポートされている 5 つの異なるデータ型を示しています。

データ型:RAW
スプーラへの指示: ドキュメントをそのまま印刷します。
使用: これは、Windows に基づいていないすべてのクライアントのデータ型です。

データ型:RAW [FF appended]
スプーラへの指示: フォーム フィード文字 (0x0C) を追加しますが、それ以外は変更しません。(後続の用紙送りがない場合、PCL プリンターはドキュメントの最後のページを省略します。)
用途: 一部のアプリケーションで必要です。Windows では割り当てられませんが、[プリント プロセッサ] ダイアログ ボックスでデフォルトとして設定できます。

データ型:RAW [FF auto]
スプーラへの指示: 後続のフォーム フィードを確認し、まだ存在しない場合は追加しますが、他の変更は行いません。
用途: 一部のアプリケーションで必要です。Windows では割り当てられませんが、[プリント プロセッサ] ダイアログ ボックスでデフォルトとして設定できます。

データの種類:NT EMF 1.00x
スプーラへの指示 : ドキュメントを、プリンタ ドライバが出力する RAW データではなく、拡張メタファイル (EMF) として扱います。
用途: EMF ドキュメントは Windows によって作成されます。

データ型:TEXT
スプーラへの指示: ジョブ全体を ANSI テキストとして扱い、印刷デバイスの工場出荷時のデフォルトを使用して印刷仕様を追加します。 Use : これは、印刷ジョブが単純なテキストであり、対象の印刷デバイスが単純なテキストを解釈できない場合に役立ちます。

コントロール パネルのプリンタのプロパティを使用して、プリンタで使用できるプリント プロセッサと、各プロセッサがサポートするデータ タイプを確認できます。

代替テキスト

こちらもご覧ください

4

3 に答える 3

4

ええ、それはうまくいきません。任意のプリンターにユニバーサル インターフェイスを提供するコードの塊であるプリンター ドライバーを意図的にバイパスしています。そのため、特定の各プリンター モデルの特性に対処する必要があります。

いくつかの一般的なインターフェイスがあります。コードで使用したものは、古いドット マトリックス プリンターで使用されていたものです。PCL は Hewlett Packard レーザー プリンターで一般的です。Postscript はハイエンド プリンタで一般的です。後者の 2 つは、フォーム フィードを取得するための独自の呪文を持っています。

次に、安価なレーザー プリンターとインクジェット プリンターの海があります。多くの場合、明確に定義されたインターフェイスがまったくありません。プリンタ コマンドを紙上のドットに変換するプロセッサをプリンタ内に持つ代わりに、プリンタ ドライバにすべての難しい作業を任せます。インターフェイスは独自のものであり、文書化されていません。

ここでは、プリンタードライバーがあなたの味方です。 それを使用するクラスをPrintDocumentします。フォーム フィードの取得は簡単です。PrintPageイベント ハンドラを設定e.HasMorePages = trueして終了するだけです。リンクした StreamPrinter クラスは既に見ました。

于 2010-12-30T19:59:02.727 に答える
0

私の最後の答えは役に立たなかったので、明白なことを試してみましょう。改ページが必要なときはいつでも、EndPagePrinter続いて試してみましたか?StartPagePrinter

それでもうまくいかない場合は、GDI を使用して難しい方法で行う必要があるかもしれません。スタックは、使用しているものとは少し異なります。

  • CreateDC
  • CreateFont
  • SelectObject
  • StartDoc
    • StartPage
      • TextOut
    • EndPage
  • EndDoc
  • DeleteDC

フォントを管理し、ページの各行位置に自分でテキストを配置する必要があります。

于 2010-12-30T22:01:02.663 に答える
0

私はTEXTドキュメントの種類に慣れていませんが、それは最小公分母の「ダムプリンター」表現にすぎないと思います。その場合、間違った文字を使用していない限り、フォーム フィード文字を認識する可能性があります。それは0x12または0xFFではなく、0x0cです。http://en.wikipedia.org/wiki/Asciiを参照

于 2010-12-30T20:09:38.217 に答える