2011-12-14 17 views
4

私はSATO GL408eプリンタに印刷しようとしています。私はUSBインタフェース経由でデータを送信しようとしていますが、そのためのコード例はありません。私はここからサンプルコードを使用しようとしました:http://support.microsoft.com/kb/322091しかし、それはエラーも印刷もなく実行されます。 SATOプリンターにデータを送信する方法を知っている人はいますか?CATのSATO USB印刷

ありがとうございます!

(ここで私が使用しているコードがある)

private void PrintLabels_Click(object sender, EventArgs e) 
{ 
    string PrintCommand = ""; 

    string EmployeeNo = EmployeeList.SelectedRows[0].Cells[0].Value.ToString(); 
    string YearNumber = EmployeeList.SelectedRows[0].Cells[7].Value.ToString(); 
    string FirstTraceCode = (int.Parse(EmployeeList.SelectedRows[0].Cells[5].Value.ToString()) + 1).ToString(); 
    string SecondTraceCode = (int.Parse(EmployeeList.SelectedRows[0].Cells[5].Value.ToString()) + 2).ToString(); 
    string LabelQuantity = "15"; 

    MessageBox.Show(EmployeeNo.Substring(0, 2) + "-" + EmployeeNo.Substring(2, 4) + "-" + YearNumber + "-" + FirstTraceCode); 
    PrintCommand = "\x02\x1bA\x1bIG1\x1bZ\x03\x02\x1bA\x1b#E3\x1bZ\x03\x02\x1bA\x1bCS5\x1bZ\x03\x02\x1bA\x1bEX0\x1bZ\x03\x02\x1bA\x1b*&\x1bZ\x03\x02\x1bA\x1bA3H0001V0001\x1bZ\x03\x02\x1bA\x1bV0000\x1bH0259\x1bF001+002\x1bD202099" + EmployeeNo + YearNumber + FirstTraceCode + "\x1bL0203\x1bH0247\x1bV0114\x1bF001+002\x1bU" + EmployeeNo.Substring(0, 2) + "-" + EmployeeNo.Substring(2, 4) + "-" + YearNumber + "-" + FirstTraceCode + "\x1bV0000\x1bH0589\x1bF001+002\x1bD202099" + EmployeeNo + YearNumber + SecondTraceCode + "\x1bL0203\x1bH0577\x1bV0114\x1bF001+002\x1bU" + EmployeeNo.Substring(0, 2) + "-" + EmployeeNo.Substring(2, 4) + "-" + YearNumber + "-" + SecondTraceCode + "\x1bQ" + LabelQuantity + "\x1b 00\x1bZ\x03 "; 
    // Allow the user to select a printer. 
    PrintDialog pd = new PrintDialog(); 
    pd.PrinterSettings = new PrinterSettings(); 
    if (DialogResult.OK == pd.ShowDialog(this)) 
    { 
     // Print the file to the printer. 
     RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, PrintCommand); 
    } 
} 

public class RawPrinterHelper 
{ 
    // Structure and API declarions: 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public class DOCINFOA 
    { 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pDocName; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pOutputFile; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pDataType; 
    } 

    [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd); 

    [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool ClosePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di); 

    [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool EndDocPrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool StartPagePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool EndPagePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten); 

    // SendBytesToPrinter() 
    // When the function is given a printer name and an unmanaged array 
    // of bytes, the function sends those bytes to the print queue. 
    // Returns true on success, false on failure. 
    public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount) 
    { 
     Int32 dwError = 0, dwWritten = 0; 
     IntPtr hPrinter = new IntPtr(0); 
     DOCINFOA di = new DOCINFOA(); 
     bool bSuccess = false; // Assume failure unless you specifically succeed. 

     di.pDocName = "My C#.NET RAW Document"; 
     di.pDataType = "RAW"; 

     try 
     { 
      // Open the printer. 
      if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) 
      { 
       // Start a document. 
       if (StartDocPrinter(hPrinter, 1, di)) 
       { 
        // Start a page. 
        if (StartPagePrinter(hPrinter)) 
        { 
         // Write your bytes. 
         bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten); 
         EndPagePrinter(hPrinter); 
        } 
        EndDocPrinter(hPrinter); 
       } 
       ClosePrinter(hPrinter); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     // If you did not succeed, GetLastError may give more information 
     // about why not. 
     if (bSuccess == false) 
     { 
      dwError = Marshal.GetLastWin32Error(); 
     } 
     return bSuccess; 
    } 

    public static bool SendFileToPrinter(string szPrinterName, string szFileName) 
    { 
     // Open the file. 
     FileStream fs = new FileStream(szFileName, FileMode.Open); 
     // Create a BinaryReader on the file. 
     BinaryReader br = new BinaryReader(fs); 
     // Dim an array of bytes big enough to hold the file's contents. 
     Byte[] bytes = new Byte[fs.Length]; 
     bool bSuccess = false; 
     // Your unmanaged pointer. 
     IntPtr pUnmanagedBytes = new IntPtr(0); 
     int nLength; 

     nLength = Convert.ToInt32(fs.Length); 
     // Read the contents of the file into the array. 
     bytes = br.ReadBytes(nLength); 
     // Allocate some unmanaged memory for those bytes. 
     pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength); 
     // Copy the managed byte array into the unmanaged array. 
     Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength); 
     // Send the unmanaged bytes to the printer. 
     bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength); 
     // Free the unmanaged memory that you allocated earlier. 
     Marshal.FreeCoTaskMem(pUnmanagedBytes); 
     return bSuccess; 
    } 

    public static bool SendStringToPrinter(string szPrinterName, string szString) 
    { 
     IntPtr pBytes; 
     Int32 dwCount; 
     // How many characters are in the string? 
     dwCount = szString.Length; 
     // Assume that the printer is expecting ANSI text, and then convert 
     // the string to ANSI text. 
     pBytes = Marshal.StringToCoTaskMemAnsi(szString); 
     // Send the converted ANSI string to the printer. 
     SendBytesToPrinter(szPrinterName, pBytes, dwCount); 
     Marshal.FreeCoTaskMem(pBytes); 
     return true; 
    } 
} 
+0

おそらく、これが役立ちます。http://stackoverflow.com/questions/5514815/send-escape-character-to-printerを –

+0

残念ながら、私はすでにことを検討しています記事。それは私のプリンタのコマンド文字列を構築するのに役立ちましたが、私はプリンタにコマンドを手伝ってくれません。しかし、試してくれてありがとう! – kereberos

答えて

1

私はこの問題を解決しました。マイクロソフトのコードはうまくいった。問題は、私がプリンタに送っていた文字列でした。エスケープコードは機能しませんでした。代わりに私はエスケープコードをコマンド名に置き換え、文字で置き換えました。助けようとしたすべての人に感謝します!ここで

私が交換のコードは次のとおりです。

PrintCommand = "<STX><ESC>A<ESC>IG1<ESC>Z<ETX><STX><ESC>A<ESC>#E3<ESC>Z<ETX><STX><ESC>A<ESC>CS5<ESC>Z<ETX><STX><ESC>A<ESC>EX0<ESC>Z<ETX><STX><ESC>A<ESC>*&<ESC>Z<ETX><STX><ESC>A<ESC>A3H0001V0001<ESC>Z<ETX><STX><ESC>A<ESC>V0000<ESC>H0259<ESC>F001+002<ESC>D202099" + EmployeeNo + YearNumber + FirstTraceCode + "<ESC>L0203<ESC>H0247<ESC>V0114<ESC>F001+002<ESC>U" + EmployeeNo.Substring(0, 2) + "-" + EmployeeNo.Substring(2, 4) + "-" + YearNumber + "-" + FirstTraceCode + "<ESC>V0000<ESC>H0589<ESC>F001+002<ESC>D202099" + EmployeeNo + YearNumber + SecondTraceCode + "<ESC>L0203<ESC>H0577<ESC>V0114<ESC>F001+002<ESC>U" + EmployeeNo.Substring(0, 2) + "-" + EmployeeNo.Substring(2, 4) + "-" + YearNumber + "-" + SecondTraceCode + "<ESC>Q" + LabelQuantity + "<ESC>00<ESC>Z<ETX>"; 
PrintCommand = PrintCommand.Replace("<STX>", ((char)02).ToString()); 
PrintCommand = PrintCommand.Replace("<ETX>", ((char)03).ToString()); 
PrintCommand = PrintCommand.Replace("<ESC>", ((char)27).ToString()); 
+0

私は上記のコードを試しました。コードはエラーなしで実行されます。しかし、プリンタは印刷しません。このコード以外で何が必要なのか教えてください。 –

+0

それは私がやったすべてでした。他には何もなかった。 – kereberos

+0

プリンタに送信する文字列の形式が正しくない可能性があります。私の問題と同じように、私は\ codeを送っていました。上記のコードに変更して動作させる必要がありました。 – kereberos