private static extern bool OpenPrinter( string pPrinterName, //Probar con "doPDF 8" out IntPtr phPrinter, ref STRUCT_API_PRINTING.PRINTER_DEFAULTS pPrinterDefaults); // Puede ser un valor nulo
//public static void AnalizePrintJob(string IImpresora, uint IJobId) //(PRINTER_ENUM Flags) /** \brief Extrae las propiedades de un Trabajo de Impresión. * \details A través de las APIs proporcionadas a través de la librería winspool.drv * \param Printer string con el nombre de la Impresora * \param IJobId Número del trabajo de impresión * \param PrintJob struct tipo STRUCT_PRINT_JOB en el que se devuelven las propiedades del trabajo de impresión * \return No devuelve nada */ public void Analize(string Printer, uint JobId, ref STRUCT_PRINT_JOB PrintJob) //(PRINTER_ENUM Flags) //public static void Analize(string Printer, uint IJobId, ref STRUCT_PRINT_JOB PrintJob) //(PRINTER_ENUM Flags) { STRUCT_API_PRINTING.JOB_INFO_2 JobInfo2; ///> Estructura en la que GetJob2() devuelve las propiedades de impresión STRUCT_API_PRINTING.DEVMODE DevMode; ///> Estructura contenido en JOB_INFO_2 IntPtr WphPrinter; IntPtr WpPrinterEnum = IntPtr.Zero; IntPtr WpJob = IntPtr.Zero; STRUCT_API_PRINTING.PRINTER_DEFAULTS WpPrinterDefaults = new STRUCT_API_PRINTING.PRINTER_DEFAULTS(); Log.Info("========================================================================="); Log.Info(" API WINSPOOL.drv"); Log.Info("========================================================================="); Log.Info(""); /// Se abre la conexión con la impresora if (OpenPrinter(Printer, out WphPrinter, ref WpPrinterDefaults)) { Log.Info("Este es el contenido de WphPrinter: #" + WphPrinter.ToString() + "."); } else { Log.Info("No se ha podido encontrar la impresora: -" + Printer); } /// Recupera estructura tipo JOB_INFO_2 con las propiedades del trabajo de impresión JobInfo2 = GetJob2(WphPrinter, JobId); DevMode = (STRUCT_API_PRINTING.DEVMODE)Marshal.PtrToStructure(JobInfo2.pDevMode, typeof(STRUCT_API_PRINTING.DEVMODE)); /// Se recuperan los valores del trabajo de impresión en el struct STRUCT_PRINT_JOB //PrintJob.ID_JOBNAME: Se mantiene el valor que tiene. PrintJob.ID_FUENTE = "API"; PrintJob.N_JOB = (int)JobInfo2.JobId; // PrintJob.F_PRINTJOB. Se mantiene la obtenida, debería ser la obtenida antes a través de System.Printing. El campo JobInfo2.Submitted está sin contenido PrintJob.ID_LOGIN = JobInfo2.pUserName; PrintJob.ID_PRINTSERVER = JobInfo2.pMachineName; PrintJob.ID_PRINTER = JobInfo2.pPrinterName; PrintJob.ID_DOCUMENT = JobInfo2.pDocument; PrintJob.N_PAGES = (int)JobInfo2.Size; PrintJob.N_PAGES_PRINTED = PrintJob.N_PAGES; // Se mantiene el valor que tiene PrintJob.N_COLORPAGES = PrintJob.N_PAGES; //Se mantiene el valor que tiene PrintJob.N_LENGTH = DevMode.PaperLength; PrintJob.N_WIDTH = DevMode.PaperWidth; try { PrintJob.ID_MEDIASIZE = DICTIONARY_API_PRINTING.PAPERSIZE[DevMode.PaperSize]; } catch (Exception e) { Log.Error("No se encuentra en el diccionario DICTIONARY_API_PRINTING.PAPERSIZE el valor: " + DevMode.PaperSize.ToString()); PrintJob.ID_MEDIASIZE = ""; } PrintJob.N_MEDIASIZE = DevMode.PaperSize; //Orientación papel try { PrintJob.ID_ORIENTATION = DICTIONARY_API_PRINTING.ORIENTATION[DevMode.Orientation]; } catch (Exception e) { Log.Error("No se encuentra en el diccionario DICTIONARY_API_PRINTING.ORIENTATION el valor: " + DevMode.Orientation.ToString()); PrintJob.ID_ORIENTATION = ""; } PrintJob.N_ORIENTATION = DevMode.Orientation; PrintJob.N_COPIES = DevMode.Copies; // Color try { PrintJob.ID_COLOR = DICTIONARY_API_PRINTING.COLORSPACE[DevMode.Color]; } catch (Exception e) { Log.Error("No se encuentra en el diccionario DICTIONARY_API_PRINTING.COLORSPACE el valor: " + DevMode.Color.ToString()); PrintJob.ID_COLOR = ""; } PrintJob.N_COLOR = DevMode.Color; // duplex try { PrintJob.ID_DUPLEX = DICTIONARY_API_PRINTING.DUPLEX_PAGEMODE[DevMode.Duplex]; } catch (Exception e) { Log.Error("No se encuentra en el diccionario DICTIONARY_API_PRINTING.DUPLEX_PAGEMODE el valor: " + DevMode.Duplex.ToString()); PrintJob.ID_DUPLEX = ""; } PrintJob.N_DUPLEX = DevMode.Duplex; PrintJob.ID_STATUS = JobInfo2.Status.ToString(); PrintJob.N_MEDIATYPE = (int)DevMode.MediaType; /// Se cierra la conexión con la impresora try { ClosePrinter(WphPrinter); } catch (Exception ex) { Log.Error("No se ha podido Cerrar la impresora: -" + Printer + (char)13 + ex); } } //AnalizePrintJob()
} //AnalizePrintJob() /** \brief Almacena documentos después de impresión * \details Comprueba las propiedades de la impresora para ver si se almacenan los documentos después de su impresión. * Si no se almacenan se cambia la propiedad para que se almacen. * \param Printer Nombre de la impresora * http://www.codeproject.com/Articles/6899/Changing-printer-settings-using-C */ public bool KeepSpoolFiles(string Printer) { IntPtr WphPrinter; STRUCT_API_PRINTING.PRINTER_DEFAULTS WpPrinterDefaults = new STRUCT_API_PRINTING.PRINTER_DEFAULTS(); var PrinterInfo5 = new STRUCT_API_PRINTING.PRINTER_INFO_5(); IntPtr pPrinterInfo5 = IntPtr.Zero; bool ConfiguracionCorrecta = false; /// Abrimos la impresora y obtenemos el identificador interno de la impresora if (OpenPrinter(Printer, out WphPrinter, ref WpPrinterDefaults)) { Log.Info("Este es el contenido de WphPrinter: #" + WphPrinter.ToString() + "."); /// Obtenemos las propiedades de la impresora PrinterInfo5 = GetPrinter5(WphPrinter); ///Cerramos la impresora ClosePrinter(WphPrinter); /// Establecemos las propiedades para actualizar la impresora PrinterInfo5.pPrinterName = Printer; PrinterInfo5.pPortName = LocalPrinting.PrinterPortName(Printer); Log.Debug("PrinterInfo5.pPrinterName: " + PrinterInfo5.pPrinterName); Log.Debug("PrinterInfo5.pPortName: " + PrinterInfo5.pPortName); Log.Debug("PrinterInfo5.Attributes: " + PrinterInfo5.Attributes.ToString()); Log.Debug("PrinterInfo5.device_not_selected_timeout: " + PrinterInfo5.device_not_selected_timeout.ToString()); Log.Debug("PrinterInfo5.transmission_retry_timeout: " + PrinterInfo5.transmission_retry_timeout.ToString()); /// Si no se guardan los ficheros del spool de impresión: uint flag = (uint)PrinterInfo5.Attributes & (uint)ENUM_API_PRINTING.ATTRIBUTE_PRINTER_INFO.PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS; if (flag == 0) // No se guardan, No está activo el bit para guardar los trabajos de impresión { Log.Info("La impresora " + Printer + " no guarda los ficheros de Spool de impresión."); /// - Modificamos el atributo de impresora para que guarde los ficheros de Spool PrinterInfo5.Attributes += (uint)ENUM_API_PRINTING.ATTRIBUTE_PRINTER_INFO.PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS; /// - Abrimos la impresora con permiso de administardor para modificar sus propiedades WpPrinterDefaults.DesiredAccess = STRUCT_API_PRINTING.PRINTER_ACCESS_MASK.PRINTER_ACCESS_ADMINISTER; if (!OpenPrinter(Printer, out WphPrinter, ref WpPrinterDefaults)) { Log.Fatal("No se tiene acceso como Administrador a la impresora: -" + Printer); } Log.Info("-- Abrimos la impresora: " + Printer + " en modo Administrador."); // - Asignamos el puntero al struc con las propiedades de la impresora pPrinterInfo5 = Marshal.AllocHGlobal(Marshal.SizeOf(PrinterInfo5)); Marshal.StructureToPtr(PrinterInfo5, pPrinterInfo5, false); /// - Establecemos las propiedades SetPrinter5(WphPrinter, ref pPrinterInfo5); /// - Cerramos la impresora Log.Info("-- Cerramos la impresora: " + Printer + " en modo Administrador."); ClosePrinter(WphPrinter); } // end if ConfiguracionCorrecta = true; } else { Log.Info("No se ha podido encontrar la impresora: -" + Printer); } // end if principal return(ConfiguracionCorrecta); } // KeepSpoolFiles()