Как изменить настройки печати и распечатать документы
От: Valerich Германия  
Дата: 17.06.12 21:30
Оценка:
Доброго всем времени суток!

Подобный вопрос уже задавался здесь
http://rsdn.ru/forum/dotnet/2646754.aspx
Автор: Хэлкар
Дата: 06.09.07


но остался к сожалению без ответа.

Естъ простое WPF-приложение, имеет ComboBox "Выбор принтера" и 2 кнопки "свойства принтера" и "печать".
Цель приложения, как видно, проста, распечатать разные документы (doc, txt, pdf) из одной папки.
К сожалению имеющийся код не работает, т.е. я могу выбрать принтер, изменяю его настройки, но печать идет со стандартными настройками.
Как я понимаю, вариант с
Process p = new Process();...

не самый лучший

Функции выводятся в следующем порядке:
OpenPrinterPropertiesDialog(...)
SetAsDefaultPrinter(...)
PrintDoc(...)



Буду рад любой помощи, заранее спасибо!

Вот мои функции, пожалуйста сильно не пинать, делаю первые, не легкие шаги


        
        // Выбираю нужные настройки
        private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings, PageSettings pageSettings)
        {
            try
            {
                PrintQueue printQueue = null;
                PrintQueue printDefaultQueue = null;

                LocalPrintServer localPrintServer = new LocalPrintServer();

                // Retrieving collection of local printer on user machine
                PrintQueueCollection localPrinterCollection = localPrintServer.GetPrintQueues();

                System.Collections.IEnumerator localPrinterEnumerator =
                    localPrinterCollection.GetEnumerator();

                while (localPrinterEnumerator.MoveNext())
                {
                    // Get PrintQueue from available printer
                    printQueue = (PrintQueue)localPrinterEnumerator.Current;
                    if (printQueue.FullName.CompareTo(printerSettings.PrinterName) == 0)
                        printDefaultQueue = (PrintQueue)localPrinterEnumerator.Current;
                }
                

                //PrintTicket selectedPrintTicket = printDefaultQueue.DefaultPrintTicket;

                PrintTicketConverter ptc = new PrintTicketConverter(printDefaultQueue.FullName, printDefaultQueue.ClientPrintSchemaVersion);
                IntPtr mainWindowPtr = new WindowInteropHelper(App.Current.MainWindow).Handle;

                byte[] PrintDevMode = ptc.ConvertPrintTicketToDevMode(printDefaultQueue.UserPrintTicket, BaseDevModeType.UserDefault);
                GCHandle pinnedDevMode = GCHandle.Alloc(PrintDevMode, GCHandleType.Pinned);
                //IntPtr pDevMode = pinnedDevMode.AddrOfPinnedObject();
                pDevMode = pinnedDevMode.AddrOfPinnedObject();
                int result = DocumentProperties(mainWindowPtr, IntPtr.Zero, printDefaultQueue.FullName, pDevMode, pDevMode, 14);

                if (result == 1)
                {
                    printDefaultQueue.UserPrintTicket = ptc.ConvertDevModeToPrintTicket(PrintDevMode);
                    printerSettings.SetHdevmode(pDevMode);
                    printerSettings.DefaultPageSettings.SetHdevmode(pDevMode);
                    if (pageSettings != null)
                        pageSettings.SetHdevmode(pDevMode);
                }
                
                pinnedDevMode.Free(); 
            }
            catch (Exception ex)
            {
                string.Format("{0}", ex.Message);
            }
        }
        
        //Указываю принтер с моими настройками по умолчанию
        int SetAsDefaultPrinter(PrinterSettings printerDevice)
        {
            int ret = 0;
            if (SetDefaultPrinter(printerDevice.PrinterName))
            {
                printerDevice.SetHdevmode(pDevMode);
                System.Windows.Forms.PageSetupDialog psd = new System.Windows.Forms.PageSetupDialog();
                psd.PrinterSettings = printerDevice;
                psd.PageSettings = printerDevice.DefaultPageSettings;
                
                //Set other default properties
                PrinterSettings settings = new PrinterSettings();
                PageSettings pgSettings = printerDevice.DefaultPageSettings;

                psd.ShowDialog();
                ret = 1;
            }
            else
            {
                
                string path = "win32_printer.DeviceId='" + printerDevice.PrinterName + "'";
                using (ManagementObject printer = new ManagementObject(path))
                {
                    ManagementBaseObject outParams =
                    printer.InvokeMethod("SetDefaultPrinter", null, null);
                    ret = (int)(uint)outParams.Properties["ReturnValue"].Value;
                }
            }
            return ret;
        }

        // Печатаю
        public void PrintDoc(FileInfo value)
        {

            Process p = new Process();
            try
            {
                if (!value.Exists)
                    throw new FileNotFoundException("File doesn't exist");
                

                p.StartInfo.FileName = value.FullName;
                //Hide the window.
                p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                //p.StartInfo.UseShellExecute = true;
                p.StartInfo.Verb = "Print";
                //p.StartInfo.CreateNoWindow = true;
                p.Start();

                p.WaitForExit(10000);
                if (!p.HasExited)
                {
                    p.CloseMainWindow();
                    p.Close();
                }
            }
            catch (Exception ex)
            { 
                #if DEBUG
                    MessageBox.Show(ex.Message);
                #endif
            }
        }
настройки печати распечатать документы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.