ドットプリンターに直接印刷するには?

解決


どら  2006-12-18 08:05:28  No: 134622

VB6.0  WinXP sp2

行単位  でESC/Pのドットプリンターに直接印刷するべく奮闘しております。

英数字での印刷はできるようになったのですが、
コントロールコードの送信と漢字の印刷方法がわかりません。

色々試行錯誤をしていますが、漢字を直接送っても英数字でしか
印刷されませんし、16進で送ってもまたしても英数字でしか印刷されません。

ESC/Pで漢字の印刷やコントロールコードの送信方法を教えてくださいませ。
よろしくお願いします。


魔界の仮面弁士  2006-12-18 18:59:44  No: 134623

# プリンタ言語には詳しくないので、細かい話になると分かりませんが…。

> コントロールコードの送信と漢字の印刷方法がわかりません。
基本部分は同じとはいえ、ESC/Pコマンドにはプリンタ固有の方言がありますので、
まずはプリンタメーカから、ESC/Pコマンドリファレンスを入手しましょう。
(開発者向けサイトにて仕様書を公開しているメーカもあります)

> 色々試行錯誤をしていますが
その試行錯誤した内容も掲載してもらえれば、修正案が出せるかも。

> 漢字を直接送っても英数字でしか印刷されませんし
まず、漢字ROMを搭載したプリンタであるかを確認してください。その上で、
プリンタ内蔵漢字フォントでの出力という意味であれば、漢字文字列が現れるたびに、
  漢字の開始… [file separator(&H1C)][ampersand(&H26)]
  漢字データ… JIS漢字文字列
  漢字の解除… [file separator(&H1C)][ampersand(&H2E)]
という形式のバイナリを送る必要があるかと思います。

また、もしも外字が必要な場合には、プリンタに外字フォントを持たせるか、
内蔵フォントを使わず、VBでラスタイメージを生成して送るなどの対応も
考える必要があるかと思います。


魔界の仮面弁士  2006-12-18 19:04:36  No: 134624

間違い。漢字モードの解除は、[FS][.] です。m(_ _)m

誤>  漢字の解除… [file separator(&H1C)][ampersand(&H2E)]
正>  漢字の解除… [file separator(&H1C)][period(&H2E)]


どら  2006-12-18 23:15:30  No: 134625

魔界の仮面弁士様  ありがとうございます。

プリンタ内蔵漢字フォントでの出力ではなく。
内蔵フォントを使わず、VBでラスタイメージを生成して送る方法を
検討しております。
(内蔵フォントに無い漢字の印刷(人名)と、レイアウトの都合)

しかしながら、手始めにプリンタ内蔵漢字フォントでの出力を成功して
ラスタイメージを生成して送る方法に移行したいと思っております。

出先からのアクセスの為、ソースは後日掲載いたします。
プリンター  VP-700  VP-880  共にエプソン
漢字ロム搭載
エプソンのESC/Pコマンドリファレンスは入手いたしました。

よろしくお願いします。


どら  2006-12-19 03:40:47  No: 134626

ソースです。

Option Explicit

      Private Type DOCINFO
          pDocName As String
          pOutputFile As String
          pDatatype As String
      End Type

      Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long) As Long
      Private Declare Function EndDocPrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long) As Long
      Private Declare Function EndPagePrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long) As Long
      Private Declare Function OpenPrinter Lib "winspool.drv" Alias _
         "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
          ByVal pDefault As Long) As Long
      Private Declare Function StartDocPrinter Lib "winspool.drv" Alias _
         "StartDocPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
         pDocInfo As DOCINFO) As Long
      Private Declare Function StartPagePrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long) As Long
      Private Declare Function WritePrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long, pBuf As Any, ByVal cdBuf As Long, _
         pcWritten As Long) As Long

      Dim lhPrinter As Long

      Private Sub Command1_Click()
             Dim lReturn As Long
             Dim lpcWritten As Long
             Dim sWrittenData As String
             sWrittenData = "IUYGEUIYGWOFUI" & vbCrLf
             lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, _
                Len(sWrittenData), lpcWritten)
                
          lReturn = EndPagePrinter(lhPrinter)
          lReturn = EndDocPrinter(lhPrinter)
          lReturn = ClosePrinter(lhPrinter)
                
          Dim lDoc As Long
          Dim MyDocInfo As DOCINFO

          lReturn = OpenPrinter(Printer.DeviceName, lhPrinter, 0)
          If lReturn = 0 Then
              MsgBox "The Printer Name you typed wasn't recognized."
              Exit Sub
          End If
          MyDocInfo.pDocName = "AAAAAA"
          MyDocInfo.pOutputFile = vbNullString
          MyDocInfo.pDatatype = vbNullString
          lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo)
          Call StartPagePrinter(lhPrinter)
                
      End Sub

      
      Private Sub Form_Load()
          Dim lReturn As Long
          Dim lDoc As Long
          Dim MyDocInfo As DOCINFO

          lReturn = OpenPrinter(Printer.DeviceName, lhPrinter, 0)
          If lReturn = 0 Then
              MsgBox "The Printer Name you typed wasn't recognized."
              Exit Sub
          End If
          MyDocInfo.pDocName = "AAAAAA"
          MyDocInfo.pOutputFile = vbNullString
          MyDocInfo.pDatatype = vbNullString
          lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo)
          Call StartPagePrinter(lhPrinter)
      End Sub

      Private Sub Form_Unload(Cancel As Integer)
          Dim lReturn As Long

          lReturn = EndPagePrinter(lhPrinter)
          lReturn = EndDocPrinter(lhPrinter)
          lReturn = ClosePrinter(lhPrinter)
      End Sub

Private Sub Command2_Click()
          Dim lReturn As Long

          lReturn = EndPagePrinter(lhPrinter)
          lReturn = EndDocPrinter(lhPrinter)
          lReturn = ClosePrinter(lhPrinter)
    End
End Sub


魔界の仮面弁士  2006-12-19 07:03:17  No: 134627

ボタン2 の方の処理は、
  Private Sub Command2_Click()
    Unload Me
  End Sub
のようにすべきかと。サンプルとはいえ、End の使用は避けましょう。

で、さしあたっての修正箇所としては、
  lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, ……)
の部分を、
  Dim buf() As Byte
  buf = ConverToRawData(sWrittenData)
  lReturn = WritePrinter(lhPrinter, buf(0), ……)
のようにすることかと思います。

  
なお、上記の ConverToRawData というのが、どらさんが実際に
自作すべき箇所で、その処理内容としては、先に記述した
> 漢字文字列が現れるたびに、
>   漢字の開始… [file separator(&H1C)][ampersand(&H26)]
>   漢字データ… JIS漢字文字列
>   漢字の解除… [file separator(&H1C)][period(&H2E)]
> という形式のバイナリを送る
を実装するための部分となります。


どら  2006-12-19 08:34:50  No: 134628

魔界の仮面弁士様  ありがとうございます。

自作すべき箇所の書き方がわかりません
ConverToRawData  = [file separator(&H1C)][ampersand(&H26)] & "ああ試験" & [file separator(&H1C)][period(&H2E)]
では翻訳エラーになります

根本的に何かが間違っているような。
この辺りのひらがなや漢字の記述方法をお教えくださいませ。

超初心者で申し訳ありません。  よろしくお願いします。

     Private Sub Command1_Click()
             Dim lReturn As Long
             Dim lpcWritten As Long
             Dim sWrittenData As String

         Dim buf() As Byte
         ConverToRawData(sWrittenData) = [file 
separator(&H1C)][ampersand(&H26)] & "あああ" & [file 
separator(&H1C)][period(&H2E)]
         buf = ConverToRawData(sWrittenData)
         lReturn = WritePrinter(lhPrinter, buf(0), Len(sWrittenData), 
lpcWritten)

          lReturn = EndPagePrinter(lhPrinter)
          lReturn = EndDocPrinter(lhPrinter)
          lReturn = ClosePrinter(lhPrinter)

          Dim lDoc As Long
          Dim MyDocInfo As DOCINFO

          lReturn = OpenPrinter(Printer.DeviceName, lhPrinter, 0)
          If lReturn = 0 Then
              MsgBox "The Printer Name you typed wasn't recognized."
              Exit Sub
          End If
          MyDocInfo.pDocName = "AAAAAA"
          MyDocInfo.pOutputFile = vbNullString
          MyDocInfo.pDatatype = vbNullString
          lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo)
          Call StartPagePrinter(lhPrinter)

      End Sub


魔界の仮面弁士  2006-12-19 18:36:58  No: 134629

> 自作すべき箇所の書き方がわかりません
うーん。あれだけの API コードを理解するだけの力があるのに?

> では翻訳エラーになります
これはまぁ、私の説明不足だったかも知れませんが、具体例でいうと、

  Dim buf() As Byte
  sWrittenData = "abcどら123" & vbCrLf
  buf = ConverToRawData(sWrittenData)  '★←実装すべき処理
  lReturn = WritePrinter(lhPrinter, buf(0), UBound(buf) + 1, lpcWritten)

という、「abcあいう123 (改行)」という文字列を印字するコードに対して、★の
  Public Function ConverToRawData(ByVal text As String) As Byte()
という 自作関数 に、「abcあいう123 (改行)」の文字列を、下記の 16 バイト長の
バイナリに変換するための処理を実装する必要がある……ということです。
(Unicode → JIS への変換などは、説明不要ですよね)

  Dim buf() As Byte
  ReDim buf(17)

  ' 英数文字列「123」
  buf(0) = &H61     ' ASCII の "a" に相当
  buf(1) = &H62     ' ASCII の "b" に相当
  buf(2) = &H63     ' ASCII の "c" に相当

  ' 漢字モードを開始する制御コード [FS] + [@]
  buf(3) = &H1C     ' file separator 制御記号
  buf(4) = &H26     ' ASCII の "@" に相当

  ' JISかな文字列「どら」
  buf(5) = &H24     ' "ど" の先導バイト
  buf(6) = &H49     ' "ど" の後続バイト
  buf(7) = &H24     ' "ら" の先導バイト
  buf(8) = &H69     ' "ら" の後続バイト

  ' 漢字モードを解除する制御コード  [FS] + [.]
  buf(9) = &H1C     ' file separator 制御記号
  buf(10) = &H2E    ' ASCII の "." に相当

  '英数文字列「abc」
  buf(11) = &H31    ' ASCII の "1" に相当
  buf(12) = &H32    ' ASCII の "2" に相当
  buf(13) = &H33    ' ASCII の "3" に相当

  ' 改行コード  [CR] + [LF]
  buf(14) = &HD     ' carriage return (vbCr) に相当
  buf(15) = &HA     ' line feed (vbLf) に相当

# なお、手元に「漢字ROMを持ったプリンタ」が無いため、
# 動作確認はしていません。あしからず。


魔界の仮面弁士  2006-12-19 18:39:54  No: 134630

うぅ、また間違えた。

>  ReDim buf(17)
この場合は ReDim buf(15) ですね。m(_ _;)m


どら  2006-12-19 20:57:09  No: 134631

魔界の仮面弁士様  本当にありがとうございます。
色々と試してみます。

&H1C&H26&H24&H49  ←"ど"
1バイトずつ分解しなければいけない、という理解でよかったでしょうか?


魔界の仮面弁士  2006-12-19 22:45:14  No: 134632

> 「abcあいう123 (改行)」という文字列を印字するコードに対して、
# そういえば、投稿前に「abcどら123 (改行)」に変更したんだっけ…。
# 今回、ミスばっかりだなぁ。(泣)

> &H1C&H26&H24&H49  ←"ど"
> 1バイトずつ分解しなければいけない、という理解でよかったでしょうか?
文字単位の処理になるので、1バイトずつというと少々語弊がありますが、
生データをプリンタに送信するのですから、いずれにしてもバイナリ送信と
いう事にはなるかと思います。

で、日本語文字列に対する漢字モードの切り替えを、1文字ずつ行うのか、
それとも、連続した漢字をひとまとまりにすべきかは、実際に試した上で
判断してみてください。


どら  2006-12-20 18:34:09  No: 134633

魔界の仮面弁士様、ありがとうございます。
試行錯誤しながら、やってみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加