フォーム フィードを発行するようにプリンター ドライバーに指示する必要があります。
私は以下を使用してプリンターに直接印刷しています:
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 つのデータ型は、クライアント コンピューターとプリント サーバー コンピューターの両方で、さまざまな方法でパフォーマンスに影響を与えます。
RAW
Windows ベースのプログラム以外のクライアントの既定のデータ型です。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 : これは、印刷ジョブが単純なテキストであり、対象の印刷デバイスが単純なテキストを解釈できない場合に役立ちます。
コントロール パネルのプリンタのプロパティを使用して、プリンタで使用できるプリント プロセッサと、各プロセッサがサポートするデータ タイプを確認できます。