Почему я печатаю XPS-файл на чековом принтере, но вместо этого получаю необработанное содержимое файла на бумаге? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь распечатать файл XPS на своем чековом принтере (квитанция EPSON TM-T88IV). Я использую PrintQueue для печати документа, который читается из потока памяти. В большинстве случаев он работает хорошо, но иногда он печатает необработанное содержимое файла вместо того, каким оно должно быть.

Вот мой код для печати XPS:

public class XpsPrinterHelper
    {
        public bool Print(byte[] documentImage, string printerName, string tempXpsFilename = "report.xps")
        {
            var success = false;
            var thread = new Thread(() =>
            {
                using (var printerQueue = GetPrintQueueFromPrinterName(printerName))
                {
                    try
                    {
                        //save file temporary
                        var filename = Path.Combine(Directory.GetCurrentDirectory(), tempXpsFilename);
                        File.WriteAllBytes(filename, documentImage);
                        using (var printSystemJobInfo = printerQueue.AddJob())
                        {
                            printSystemJobInfo.JobStream.Write(documentImage, 0, documentImage.Length);
                        }
                        success = true;
                    }
                    catch (PrintJobException)
                    {
                        printerQueue.Dispose();
                    }
                }
            });
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join(); //Wait until finished
            return success;
        }

        private static PrintQueue GetPrintQueueFromPrinterName(string printerName)
        {
            if (printerName.StartsWith(@"\\")) //If it is a shared printer
            {
                var serverPath = printerName.Substring(0, printerName.LastIndexOf('\\'));
                var sharedPrinterName = printerName.Replace(serverPath, "");
                var printServer = new PrintServer(serverPath.TrimEnd('\\'));
                return printServer.GetPrintQueue(sharedPrinterName.Trim('\\'));
            }

            var localPrintServer = new LocalPrintServer();
            return localPrintServer.GetPrintQueue(printerName);
        }
    }

Но иногда результат любит мусор enter image description here

Я действительно ценю, что кто-то указал на то, что произошло, или дал мне предложение решить эту проблему.

...