[PF] .NET用のPDFの印刷、ベクトルアプローチ、理論









.NETからPDFドキュメントを印刷するというトピックを続けます。



原則として、ドキュメントの印刷は難しくなく、既製のソリューションもあります。 一部の印刷オプションを管理する必要がある場合、問題が発生します。 私の練習では、ミニ印刷を実装するタスクに直面しました-ドキュメントを印刷するときに、次のシートを取り出すトレイを指定する必要がある場合、つまり テンプレートでドキュメントを印刷します。 既製の解決策を見つけようとして最初に試みたものの、適切なものを見つけることができなかったため、自分で解決策を見つけ始めました。



最初に思いついたのは、ビットマップイメージでドキュメントページをレンダリングし、標準の.NETツールを使用してそれらを印刷することでした。 PrintDocumentクラスを使用すると、プラークでプリンタートレイを変更できます。 以前の記事でこのアプローチについて書いた











最初のアプリケーションが機能し始めるとすぐに、このソリューションの重大な欠点が発見されました。 PDFを画像に変換した後、ファイルが巨大なサイズに膨らんだため、印刷に非常に長い時間がかかりました。 同時に、印刷量は増え続け、私は別の方法を見つけることにしました。



Hewlett-Packard PCLプリンター制御言語は私を助けてくれました。 インターネット上では、Runetはもちろんのこと、その情報は非常に少ないことが判明しました。 わかりやすい説明は、公式仕様のみです。 すぐに言ってやった。 彼はHP JetAsmからHEXエディター+ユーティリティを起動し、PCLの研究を開始しました。 悪魔は描かれているほどひどいものではありません。 言語はバイナリですが、非常にシンプルで論理的です。 その結果、数時間後にテストアプリケーションを作成しました。 そして、それが便利で面白いと思うかもしれない皆のために、PCLについて少しお話しします。











ウィキペディアによると:

「PCL(英語のプリンターコマンド言語)は、Hewlett-Packardが開発したプリンター制御言語です。 最初のバージョンでは、ASCII文字を印刷するための一連のコマンドでしたが、現在、バージョンPCL6およびPCL-Xでは、カラーでの印刷や画像の印刷が可能になりましたが、この言語はMicrosoft WindowsおよびHP-UX以外ではほとんど使用されません ''


これはバイナリ言語とスタック言語であると自分で追加します。着信データはスタックにプッシュされ、演算子が表示されると、データは演算子引数としてスタックから取得されます。



PCLの公式説明はインターネット上にあります。 また、HP JetAsmの無料ユーティリティは、PCLファイルの内容を理解および検証するのに役立ちます。 それと他の有用なファイルは、登録なしで公式サイトから取得できます。 これを行うには、リンクをクリックし、[SDK]-> [公開]をクリックして、目的のファイルを見つけます。



古き良きGhostScript













最初に、どこかでpclファイルを取得する必要があります。 前回の記事で知られている GhostScriptユーティリティは、すぐにPDFをPCLに変換できます。 次のコマンドでこれを行うことができます。



gswin64c.exe -o example.pcl -sDEVICE=pxlmono example.pdf
      
      







したがって、不必要な移動をせずに、RawDataとしてプリンターに送信できるPCLファイルを取得しました。



ただし、ドキュメントを印刷するだけでなく、プリンタトレイに配布する必要がある場合(たとえば、ある種のテンプレートに従って)、生成されたPCLファイルをそれに応じて変更する必要があります。 これを行うには、彼のデバイスに対処する必要があります。



そのため、HEXエディターでPCLファイルを開きます。 WinHexを使用しました











この言語には階層構造があります。 しかし、最初に、デバイスはPCLデータストリームがさらに送信されることを理解する必要があります。これには、初期化ラインが役立ちます。



PCLステートメントの階層は次のとおりです。

 <> <> </> <> </> <> </> </>
      
      







この場合、いくつかのセッションがあり、ページ要素が他の要素にネストされている場合があります。



順番に始めましょう













ストリームの先頭は標準の文字列であると既に述べました。 デバイスは、PXLXL形式のデータがさらに送信されることを決定します。 初期化文字列の長さは99バイトです。











次に、PCLデータストリームが開始されます。 ドキュメントの要素の記述を開始するには、セッションを開く必要があります。これには、コード0x41のBeginSessionコマンドがあります。 これおよび他のコマンドコードは、マニュアルに記載されています。 1つのファイルに1つまたは複数のセッションを含めることができますが、多くの場合1つです。











また、BeginSessionに渡す必要のある引数も調べます。



引数の構造は次のとおりです。[データ型] [データ] [属性型] [属性]



UnitsPerMeasure-ワークスペースxとyの解像度。データ型はuint16_xy-2つのダブルバイトワードの構造です。











測定 -作業する測定単位の列挙{eInch | eMillimeter | eTenthsOfAMillimeter}











ErrorReportは、デバイスがエラーを処理する方法を決定する列挙です。











開始ページ





ページは同じ方法で初期化されます。 両面モードを設定用紙を取り出すトレイを指定できるのは、 BeginPageオペレーターです



BeginPage演算子の引数を調べてみましょう。



向き -ページの向き。値を取ることができます{ePortraitOrientation | eLandscapeOrientation | eReversePortrait | eReverseLandscape}











MediaSize-ページサイズ、列挙、eA4Paperの場合。 タイプMediaSizeの代わりに、CustomMediaSize、CustomMediaSizeUnitsがあります。











MediaSourceはペーパーソースです。

0-eDefaultSource

1-eAutoSelect

2-eManualFeed

3-eMultiPurposeTray

4-eUpperCassette

5-eLowerCassette

6-eEnvelopeTray

7-eThirdCassette

1-248-外部トレイ



MediaSourceの代わりに、ソースの名前を持つMediaTypeが存在する場合があります











SimplexPageMode-単一ページ印刷モード、eSimplexFrontSide = 0に設定する必要があります



SimplexPageModeの代わりに、DuplexPageModeまたはDuplexPageSideを指定できます。



DuplexPageSide -1枚のシートに1ページを印刷しますが、シートのどちら側に{eFrontMediaSide | eBackMediaSide}



DuplexPageMode -2つの連続したページが同じシートの両面に印刷されます。値を設定できますeDuplexHorizo​​ntalBinding = 0およびeDuplexVerticalBinding = 1











そして、これはすべてコード0x43のBeginPageコマンドで終了します











原則が明確であることを願っています。 これは、アプリケーションを開発し、PCLファイルを変更して、両面-シンプレックスモードを変更し、用紙を取り出すトレイを指定するのに十分です。 これを行うには、ファイル内の次のページのアナウンスを見つけて、必要に応じて変更する必要があります。



次の記事では、パターンPDFでのPDF印刷デモアプリケーションの実装について説明します。



不正確な点がある場合、または詳細が必要な場合は、コメントにこれについて書いてください。



一連の記事:

ラスターアプローチ

ベクトルアプローチ理論

ベクトル実践アプローチ



All Articles