代码之家  ›  专栏  ›  技术社区  ›  Aesha

RawPrinter助手:打印机不打印泰米尔语字符

  •  2
  • Aesha  · 技术社区  · 7 年前

    我使用的代码如下。

             Print(eInit + 'நன்றி');
    
             public void Print(string Line)
             {
                 prn.SendStringToPrinter(PrinterName, Line);
             }
    
             public bool SendStringToPrinter(string szPrinterName, string szString)
             {
                 bool functionReturnValue = false;
                 if (PrinterOpen)
                 {
                     IntPtr pBytes = default(IntPtr);
                     Int32 dwCount = default(Int32);
                     Int32 dwWritten = 0;
                     dwCount = szString.Length;
                     pBytes = Marshal.StringToCoTaskMemAnsi(szString);
                     functionReturnValue = WritePrinter(hPrinter, pBytes, dwCount, ref dwWritten);
                     Marshal.FreeCoTaskMem(pBytes);
                 }
                 else
                 {
                     functionReturnValue = false;
                 }
                 return functionReturnValue;
             }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Aesha    7 年前

    Raw printer helper类不会通过sensstringtoprinter()类打印泰米尔字符。 设计一个crystal报告选择您的字段并将字体设置为任何泰米尔文字体(例如,bamini字体),然后调用此报告在按钮单击事件中从应用程序打印。

        2
  •  0
  •   Angelo    5 年前

    我知道这是旧的,但供其他人谁会遇到这个问题的参考,让我张贴可能的解决方案。

    public static bool SendStringToPrinterUTF8(string szPrinterName, string szString)
            {
                byte[] byteArray = Encoding.UTF8.GetBytes(szString);
                MemoryStream stream = new MemoryStream(byteArray); 
                BinaryReader br = new BinaryReader(stream);
                Byte[] bytes = new Byte[stream.Length];
                IntPtr pUnmanagedBytes = new IntPtr(0);
                int nLength;
    
                nLength = Convert.ToInt32(stream.Length);
                bytes = br.ReadBytes(nLength);
                pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
                Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
                SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
                Marshal.FreeCoTaskMem(pUnmanagedBytes);
                return true;
    
            }
    
    
    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 = "Printing UCC Labels";
                di.pDataType = "RAW";
    
                // 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);
                }
                // If you did not succeed, GetLastError may give more information
                // about why not.
                if (bSuccess == false)
                {
                    dwError = Marshal.GetLastWin32Error();
                }
                return bSuccess;
            }