File.Copy vs cmd copy vs lpt
От: pumpurumer  
Дата: 23.11.15 09:56
Оценка:
задача: печатать на принтере этикеток зебра через epl.
Проблема: кодировка текста и наличие шрифтов.
т.е. вариант решения 1: При печати русского текста нужен русский шрифт, которого нет в принтере. Заливаем шрифт и проблема решена.
вариант решения 2: использовать cmd copy. Вот тут начинается непонятное.
берем файл epl (кодировка cp1251, лежит на диске), пишем в cmd
copy file_epl_1251.epl lpt1
// как в прочем и:
copy file_epl_1251.epl \\computer\zebra1

и волшебным образом получаем нормальный русский текст.
Если из c# делать:
File.Copy(@"file_epl_1251.epl", @"\\computer\zebra1");
//или 
var f = CreateFileW(@"\\computer\zebra-epl", 0x40000000, 0, IntPtr.Zero, 0x4, 0x8000080, IntPtr.Zero);

        if (f.ToInt32() == -1)
        {
            /* ask the framework to marshall the win32 error code to an exception */
            Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
        }
        else
        {
            using (FileStream sw = new FileStream(f, FileAccess.Write))
            {
                var txt = File.ReadAllText(@"D:\repo\cas\epl_1251.epl", enc);
                //var b = File.ReadAllBytes(@"D:\repo\cas\epl_1251.epl");
                var b = System.Text.Encoding.GetEncoding(866).GetBytes(txt);
                sw.Write(b, 0, b.Length);
                sw.Close();
            }
        }
//или
int dwWritten = 0;
        IntPtr hPrinter = new IntPtr(0);
        RawPrinterHelper.DOCINFOA di = new RawPrinterHelper.DOCINFOA();
        bool bSuccess = false;
        di.pDocName = "raw epl2 document";
        di.pDataType = "RAW";

        byte[] managedArray = new byte[dwCount];
        Marshal.Copy(pBytes, managedArray, 0, dwCount);
        if (RawPrinterHelper.OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
        {
            if (RawPrinterHelper.StartDocPrinter(hPrinter, 1, di))
            {
                if (RawPrinterHelper.StartPagePrinter(hPrinter))
                {
                    bSuccess = RawPrinterHelper.WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                    RawPrinterHelper.EndPagePrinter(hPrinter);
                }
                RawPrinterHelper.EndDocPrinter(hPrinter);
            }
            RawPrinterHelper.ClosePrinter(hPrinter);
        }
        if (!bSuccess)
        {
            int dwError = Marshal.GetLastWin32Error();
        }
        return bSuccess;

получаем каказябры.
Побывал играть с кодировками (utf (bom, not bom), cp1251, cp866)
Пробовал трэйсить вызовы cmd при выполнении copy (ничего не нашел странного)
можете подсказать в каком направлении копать?
Re: File.Copy vs cmd copy vs lpt
От: DarthSidius  
Дата: 07.12.15 03:01
Оценка:
Здравствуйте, pumpurumer, Вы писали:

P> var txt = File.ReadAllText(@"D:\repo\cas\epl_1251.epl", enc);


Где создается enc?
txt как выглядит в отладчике — читабельный текст или кракозябры?
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 58>>
♠♠♥♠♠♦♥
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.