Duda con "Win32_PrintJob"

Iniciado por Yaldabaot, 1 Febrero 2014, 16:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Yaldabaot

Buenas,

He estado haciendo un tipo de monitoreo de impresoras, cuando el usuario imprime la cola de impresión me da las datos.

Pasa que cuando los pido, los datos de nombre, fecha y nombre del documento me dan lo que necesito, pero cuando trato de averiguar cuántas páginas tiene el documento el programa sólo me retorna 1 y en el caso de las páginas totales 0.

El programa lo estoy haciendo con Visual Studio 2010 y con C#.


Es importante aclarar que he probado con word y notepad, los cuáles se generan con más de 1 página.

Les agradecería si me pudieran ayudar con esto.


Código (csharp) [Seleccionar]


System.Collections.ArrayList printJobCollection = new System.Collections.ArrayList();

       //Obtiene los trabajos que contiene en memoria.

       public System.Collections.ArrayList obtenerimpresiones(string PrinterName)
       {

           string PrinterJobs = "SELECT * FROM Win32_PrintJob";
           string hora;

           ManagementObjectSearcher FindPrintJobs = new ManagementObjectSearcher(PrinterJobs);
           ManagementObjectCollection prntJobCollection = FindPrintJobs.Get();
 
           foreach (ManagementObject prntJob in prntJobCollection)
           {


               System.String jobName = prntJob.Properties["Name"].Value.ToString();
               System.String pages = prntJob.Properties["PagesPrinted"].Value.ToString();
               System.String print = prntJob.Properties["DriverName"].Value.ToString();
               System.String totalpages = prntJob.Properties["TotalPages"].Value.ToString();
               
               

               hora = DateTime.Now.ToString();


               char[] JobSplit = new char[1];

               JobSplit[0] = Convert.ToChar(",");

               string prnterName = jobName.Split(JobSplit)[0];
           
               string documentName = "Nombre del documento->" + prntJob.Properties["Document"].Value.ToString() + " Usuario->" + prntJob.Properties["owner"].Value.ToString() + " - Fecha->" + hora + " - Páginas del documento->" + pages + "- Impresora ->" + print + "Total páginas impresas->" + totalpages + "\n";

               if (String.Compare(prnterName, PrinterName, true) == 0)
               {

                   printJobCollection.Add(documentName);
                 

               }


           }


           return printJobCollection;            
           
                     

           }






Nunca me contestan -_-

Yaldabaot

¿Nadie sabe?, he estado buscando y hay varias personas con el mismo problema que yo y que no han podido solventarlo, les agradecería que si saben algo me ayuden.
Nunca me contestan -_-

Yaldabaot

Bueno trataré de plantearlo de otra manera,

Alguno sabe cómo contar o cómo obtener la cantidad de páginas que se han impreso en un documento, he tenido muchos dolores de cabeza por lo mismo y no he podido lograrlo.

Necesito saber si por ejemplo tengo un documento llamado "hola.txt" el usuario dijo que imprimió 5 hojas y lo despliegue.
Nunca me contestan -_-

Devdox

No estoy muy seguro ya que nunca he probado eso que dices, pero mira a ver si te sirven estos enlaces:

http://stackoverflow.com/questions/12934063/counting-printed-pages-by-clients-with-c-sharp-and-wmi

http://www.codeproject.com/Articles/3313/Monitoring-a-Printer-Queue-from-VB-NET

Posiblemente tengas que adaptar el código un poco, pero es posible que te sirve (especialmente el segundo enlace)
Mi nuevo blog [en construcción]: http://misternauta.wordpress.com

Eleкtro

#4
Que buena info @Devdox, para que no se escape el dato importante ...esto lo dice todo:

Cita de: http://www.codeproject.com/Articles/3313/Monitoring-a-Printer-Queue-from-VB-NET
Código (vbnet,3,4) [Seleccionar]
Public Enum Job_Notify_Field_Indexes
   '...
   JOB_NOTIFY_FIELD_TOTAL_PAGES = &H14
   JOB_NOTIFY_FIELD_PAGES_PRINTED = &H15
   '...
End Enum

Saludos








Yaldabaot

Voy a revisarlo, pero GRACIAS ME HAN SALVADO.
Nunca me contestan -_-

Yaldabaot

Tengo este código con lo que he modificado.

Código (csharp) [Seleccionar]


  Watcher = new ManagementEventWatcher();


                    WqlEventQuery query = new WqlEventQuery("Select * From __InstanceOperationEvent Within 1 " +   "Where TargetInstance ISA 'Win32_PrintJob'");
                    Watcher.Query = query;

                    dato = Convert.ToInt32(lblcola.Text); // Me indica si hay colas

                    if ( dato>= 1)
                    {
                    Watcher.EventArrived += new EventArrivedEventHandler(this.WmiEventHandler);
                   Watcher.Start();
                    //Watcher.Stop();

               
                 
               
                   lblNombreArchivo.Text = "";

                    }



Y tengo el método del evento

Código (csharp) [Seleccionar]



public void WmiEventHandler(object sender, EventArrivedEventArgs e)
        {

           // int contar;
         

            string prueba =
((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["PagesPrinted"].ToString();

                   
            MessageBox.Show(prueba.ToString());



        }



Pero sólo me retorna el valor 1, y me salen varios dialogos, pero no la cantidad exacta de las hojas tampoco.


Nunca me contestan -_-

Eleкtro

Creo que la query de WMI que estás usando no te puede facilitar el valor correcto para las páginas imprimidas, lee la respuesta de @Anonimista en esta duda ~> http://stackoverflow.com/questions/12934063/counting-printed-pages-by-clients-with-c-sharp-and-wmi intenta adaptarlo a tu code.

Saludos








Yaldabaot

#8
Código (csharp) [Seleccionar]


WqlEventQuery query = new WqlEventQuery("Select * From __InstanceModificationEvent Within 1 Where TargetInstance Isa \"Win32_PrintJob\" And TargetInstance.PagesPrinted > PreviousInstance.PagesPrinted");







La acabo de cambiar pero es peor , porque ahora no me retorna nada. Saludos.

Lo único que necesito es obtener el valor o la cantidad de páginas que se imprimieron, no necesito el nombre del documento,ni la hora, ni el nombre de la impresora, puesto que esos datos ya los saco fácilmente, lamentablemente con esto de las páginas se me ha complicado enormemente!.

Nunca me contestan -_-

Yaldabaot

#9
No le llego :(, estoy con esta pero me sigue dando error las clases.

http://www.codeproject.com/Articles/3313/Monitoring-a-Printer-Queue-from-VB-NET

he encontrado gran cantidad de artículos, pero todos son lo mismo que este

http://archive.devnewz.com/devnewz-3-20030622MonitoringaprintqueuefromVisualBasicNet.html

No he encontrado manera de hacerlo.
Nunca me contestan -_-