} //GetPrinter5() /** \brief Establece las propiedades de la impresora. * \param WphPrinter Identificador interno de la impresora * \param pPrinterInfo5 entre las propiedades de la estructura está que la impresora guarde los ficheros de Spool * \remarks http://xomalli.blogspot.com.es/2011/01/operadores-nivel-de-bits-en-c-bitwise.html -> Operaciones nivel bit atributos */ private void SetPrinter5(IntPtr WphPrinter, ref IntPtr pPrinterInfo5) { /// Se genera información para el log Log.Info("-- Dentro de SetPrinter5"); STRUCT_API_PRINTING.PRINTER_INFO_5 PrinterInfo5 = new STRUCT_API_PRINTING.PRINTER_INFO_5(); PrinterInfo5 = (STRUCT_API_PRINTING.PRINTER_INFO_5)Marshal.PtrToStructure(pPrinterInfo5, typeof(STRUCT_API_PRINTING.PRINTER_INFO_5)); Log.Info("PrinterInfo5.pPrinterName: " + PrinterInfo5.pPrinterName); Log.Info("PrinterInfo5.pPortName: " + PrinterInfo5.pPortName); Log.Info("PrinterInfo5.Attributes: " + PrinterInfo5.Attributes.ToString()); Log.Info("PrinterInfo5.device_not_selected_timeout: " + PrinterInfo5.device_not_selected_timeout.ToString()); Log.Info("PrinterInfo5.transmission_retry_timeout: " + PrinterInfo5.transmission_retry_timeout.ToString()); try { if (SetPrinter(WphPrinter, 5, pPrinterInfo5, 0)) { /// Se modifican las propiedades de la impresora y se genera información en el log Log.Info("Se han modificado las propiedades de la impresora '" + PrinterInfo5.pPrinterName + "' para que se guarden los trabajos de impresión."); } else { /// Si no se pueden actualizar las propiedades de la impesora se genera una excepción y se guarda registro del error en el log. int lastError = Marshal.GetLastWin32Error(); Log.Error("Codigo de error: " + Marshal.GetLastWin32Error()); Log.Error("No se han podido modificar las propiedades de la Impresora."); throw new Win32Exception(Marshal.GetLastWin32Error()); } } catch (Exception e) { Log.Error("No se han podido actualizar las propiedades de la Impresora: '" + PrinterInfo5.pPrinterName + "'", e); } } //SetPrinter5()
} //Fin GetJob2() /** \brief recupera Información de una impresora * \param WphPrinter Nombre de la impresora * \return Estructura tipo PRINTER_INFO_5 con información de la impresora * \remarks http://xomalli.blogspot.com.es/2011/01/operadores-nivel-de-bits-en-c-bitwise.html -> Operaciones nivel bit atributos */ private STRUCT_API_PRINTING.PRINTER_INFO_5 GetPrinter5(IntPtr WphPrinter) { var PrinterInfo5 = new STRUCT_API_PRINTING.PRINTER_INFO_5(); var size = Marshal.SizeOf(typeof(STRUCT_API_PRINTING.PRINTER_INFO_5)); uint pcbNeeded = 0; uint cbBuf = 0; // Llamamos a GetPrinter con un puntero sin tamaño definido InPtr.Zero. // Indicamos nivel 5 para estructura de tipo PRINTER_INFO_5 // para que nos devuelva en pcbNeeded el tamaño con el que tenemos que inicializar if (GetPrinter(WphPrinter, 5, IntPtr.Zero, cbBuf, out pcbNeeded)) { Log.Error("No se ha obtenido correctamente pcbNeeded después de GetPrinter: " + pcbNeeded.ToString()); } cbBuf = pcbNeeded; Log.Debug("Tamaño de pcbNeeded después de GetPrinter: " + pcbNeeded.ToString()); int UltimoError = Marshal.GetLastWin32Error(); Log.Debug(" El ultimo error Win32: " + UltimoError.ToString()); // Obtenemos los propiedades de la impresora if (Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER) // Error 122 { var pPrinterInfo5 = Marshal.AllocHGlobal((int)cbBuf); //if (GetPrinter(WphPrinter, 5, pPrinterInfo5, pcbNeeded, ref pcbNeeded)) if (GetPrinter(WphPrinter, 5, pPrinterInfo5, cbBuf, out pcbNeeded)) { Log.Info("cbBuf: " + cbBuf.ToString() + " pcbNeeded: " + pcbNeeded.ToString()); PrinterInfo5 = (STRUCT_API_PRINTING.PRINTER_INFO_5)Marshal.PtrToStructure(pPrinterInfo5, typeof(STRUCT_API_PRINTING.PRINTER_INFO_5)); } Log.Info("cbBuf: " + cbBuf.ToString() + " pcbNeeded: " + pcbNeeded.ToString()); } return(PrinterInfo5); } //GetPrinter5()
} //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()