Wątek przeniesiony 2015-07-29 11:06 z Webmastering przez dzek69.

Drukowanie w C#. Kolejkowanie drukowania w drukarce

0

Witajcie!

Próbuję drukować utworzony przez siebie plik w swojej aplikacji napisanej w c#. Korzystam z tego:
https://vishalsbsinha.wordpress.com/2014/05/06/how-to-programmatically-c-net-print-a-pdf-file-directly-to-the-printer/

Aplikacja działa na RDP. Wszystko działa super, drukarka lokalna dostaje wykolejkowane dokumenty, po czym wyskakuje status Printing i dokument znika z kolejki. Nie ma dokumentu, nie ma dukowania.

Ktoś wie co może być powodem, albo jak załatwić ten problem? Bo niestety nie mogę znaleźć rozwiązania..

Pozdrawiam!

0

Właściwie to nie jest problem RDP, ale też z lokalnego komputera to nie działa.. Co pozwala myśleć że prawdopodobnie sterownik

0

Proponuje przetestować program lokalnie.
Wygląda to na problem z drukarką, bo skoro dokumenty trafiają do kolejki to program jest chyba ok.

0

No właśnie zrobiłem to lokalnie ale mam dokładnie taki sam efekt.. Nie mam innej drukarki tymczasowo by to zweryfikować

0

Zainstaluj jakąś wirtualną drukarkę PDF (ja używam CutePDF) i zobacz co się będzie działo.

I fajnie by było jak byś pokazał kod odpowiedzialny za drukowanie.

0
#region dll Wrappers
        [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        private 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)]
        private static extern bool ClosePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        private 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)]
        private static extern bool EndDocPrinter(IntPtr hPrinter);

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

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

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

        [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool GetDefaultPrinter(StringBuilder pszBuffer, ref int size);

        #endregion dll Wrappers

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                PrintDocument pd = new PrintDocument();
                StringBuilder dp = new StringBuilder(256);
                int size = dp.Capacity;

                pd.PrinterSettings.PrinterName = "CutePDF Writer";

                FileStream fs = new FileStream("label1.pdf", FileMode.Open);
                BinaryReader br = new BinaryReader(fs);
                Byte[] bytes = new Byte[fs.Length];
                bool success = false;

                IntPtr ptrUnmanagedBytes = new IntPtr(0);
                int nLength = Convert.ToInt32(fs.Length);

                bytes = br.ReadBytes(nLength);

                ptrUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);

                Marshal.Copy(bytes, 0, ptrUnmanagedBytes, nLength);

                success = SendBytesToPrinter(pd.PrinterSettings.PrinterName, ptrUnmanagedBytes, nLength);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
        {
            try
            {
                Int32 dwError = 0, dwWritten = 0;
                IntPtr hPrinter = new IntPtr(0);

                DOCINFOA di = new DOCINFOA();
                di.pDocName = "PDF Document";
                di.pDataType = "RAW";

                bool success = false;

                if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
                {
                    if (StartDocPrinter(hPrinter, 1, di))
                    {
                        if (StartPagePrinter(hPrinter))
                        {
                            success = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                            EndPagePrinter(hPrinter);
                        }

                        EndDocPrinter(hPrinter);
                    }

                    ClosePrinter(hPrinter);
                }

                if (!success)
                {
                    dwError = Marshal.GetLastWin32Error();
                }

                return success;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        private class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDataType;
        } 

PDF Architect stosuję i się odpala normalnie.

EDIT:

Nie wiem czy to istotne, ale dodam, że drukowanie puszczam na zebre. Drukowanie z ręki działa na niej, więc nie widzę przeszkód by takie drukowanie nie mogło..

1 użytkowników online, w tym zalogowanych: 0, gości: 1