2012-02-03 9 views
0

私はWindowsドライバを渡さずに、プリンタに直接テキストと画像を印刷しようとしています。このアプリケーションは、シリアル針プリンタ用のものであるので、私は、この方法を印刷しなければならない、と私はグラフィックスメソッドイメージをC#でrawモードで印刷するには?

/*Text Print*/ 
_printPageEventArgs.Graphics.DrawString(
    _printArray.ElementAt(i).Text, 
    _printArray.ElementAt(i).Font, 
    Brushes.Black, 
    ClientRectangle, 
    stringFormat); 

/*Image Print*/ 
printPageEventArgs.Graphics.DrawImage(
    _printArray.ElementAt(i).Image, 
    _printArray.ElementAt(i).StartPosX_100Inch, 
    _printArray.ElementAt(i).FinalStartPosY_100Inch, 
    _printArray.ElementAt(i).ImageWidth_100Inch, 
    _printArray.ElementAt(i).ImageHeight_100Inch); 

を用いて印刷をしようとした場合、プリンタは何を印刷する永遠にかかります。 だから私は直接

public static extern UInt32 PrtWrite(IntPtr hPrt, byte[] pbWriteBuffer, 
    UInt32 nNumberOfBytesToWrite, ref UInt32 lpNumberOfBytesWritten); 

それを書くために、プリンタのDLLを使用しています。しかし、私は正しいバイト形式に画像を変換することができませんでしだ。この変換をしようとしましたが、どれも働いていない、私が得るすべてが文字化けです:

//TEST 1 
UInt32 dwNoOfBytesWritten = 0; 
Image img = Image.FromFile(@"c:\zzz.jpg"); 
ImageConverter converter = new ImageConverter(); 
byte[] imageToPrint = (byte[])converter.ConvertTo(img, typeof(byte[])); 
PrtWrite(_printerPointer, imageToPrint, (UInt32)imageToPrint.Length, 
    ref dwNoOfBytesWritten); 

//TEST 2 
UInt32 dwNoOfBytesWritten = 0; 
Image img = Image.FromFile(@"c:\zzz.jpg"); 
MemoryStream ms = new MemoryStream(); 
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
byte[] imageToPrint = ms.ToArray(); 
PrtWrite(_printerPointer, imageToPrint, (UInt32)imageToPrint.Length, 
    ref dwNoOfBytesWritten); 

これはWINCORニックスドルフプリンタ用のAPIです。彼らのSDKで

、メソッドは次のように定義されます

extern "C" __declspec(dllimport) DWORD PrtWrite (HANDLE hPRT, 
    LPBYTE pbWriteBuffer, DWORD dwLenWriteBuffer, LPDWORD pdwNoOfBytesWritten); 

そして、これは私が彼らのマニュアルからきたすべてです:

PrtWrite機能がpbWriteBufferの 内容のnNumberOfBytesToWriteバイトを書き込みますがプリンタに送信します。この機能を使用して、 のデータ、通常の印刷データ、およびプリンタ制御 シーケンスを送信することができます。

PrtWriteには文字コードマッピングがありません。したがって、 の出力は、ロードされた文字ジェネレータによって異なります。

hPrt - > PrtOpenによって返されたプリンタへのハンドル。

pbWriteBuffer - 変数へ>ポインタ - > lpNumberOfBytesWritten プリンタ

に書き込むバイト数を指定 - プリンタ

nNumberOfBytesToWriteに に書き込まれるデータを含むバッファへ>ポインタ 書き込まれたバイト数を受信する

+0

*非常に良い。非常に高く評価。 – casperOne

答えて

1

jpegデータをプリンタにストリーミングすることは、ほとんど確実に機能しません。多くの古いプリンタは、ASCIIをプリンタに直接ダンプし、それを文字に変換することによって機能しました。たとえば、EPSONは、90年代後半にはまだ古いプロトコルを使っていました。グラフィックスを得るために、「エスケープシーケンス」を送りました。これらは、エスケープ文字で始まり、特別にフォーマットされたデータを含むデータブロックです。これは80年代の厳しいものでした。なぜなら、人々が最初にプリントドライバを書くことが始まった理由のほとんどは、すべての製造業者が異なるシーケンスを使用していたか、プロトコルに違うバグがあったからです。

印刷プロトコルに使用できるドキュメントがあれば実装することができますので、少なくとも1つは保証されているバグやクォークを回避する必要があります。ドキュメントが見つからない場合は、オープンソースのUNIXドライバを見つけてください。

+0

これは質問に対する回答ではありません(「最も確実に機能しません」)。それ以上のコメントです、またはあなたは具体的なDLLの*正しい*データ(ポスターとしてではなく)での呼び出しがうまくいかない理由を具体的に証明する必要があります。 – casperOne

+1

casperOne:シリアルニードルプリンタはjpeg形式より古く、直接サポートを期待するのは無理です。台座:+1 –

+0

BMP画像ファイルで試した結果、同じ結果が得られました –

0

Wincor NixdorfプリンタSDK /ドライバは、CEN/XFSプリンタを実装しており、適切な方法で指示される必要があります。任意のバイナリデータをダンプすることは、残念ながらハードコピーでイメージを与えることはありません。このようなことをしたい場合は、GDIドライバを調べてください。これらはこれらの世界の間の翻訳を行います。

PrintRawを使用すると、バイトのシーケンスをプリンタデバイスに直接送信できます。文字列には、プリンタで知られているエスケープシーケンスまたはマクロを含めることができます。手元にエスケープシーケンスやマクロのマニュアルはありませんが、Wincor Nixdorf HQまたはサプライヤに連絡し、CSCWまたはCSCOのドキュメントを尋ねてください。これはあなたが探している例を含んでいるはずです。

関連する問題