Ejemplo n.º 1
0
        } //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()
Ejemplo n.º 2
0
        }     //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()
Ejemplo n.º 3
0
        } //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()