コード例 #1
0
 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
コード例 #2
0
        //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()
コード例 #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()