задача: печатать на принтере этикеток зебра через 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 (ничего не нашел странного)
можете подсказать в каком направлении копать?
Здравствуйте, 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>>