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.
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;
}
¿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.
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.
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://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 (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)
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-NETPublic Enum Job_Notify_Field_Indexes
'...
JOB_NOTIFY_FIELD_TOTAL_PAGES = &H14
JOB_NOTIFY_FIELD_PAGES_PRINTED = &H15
'...
End Enum
Saludos
Voy a revisarlo, pero GRACIAS ME HAN SALVADO.
Tengo este código con lo que he modificado.
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
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.
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
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!.
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.
¿ Nadie?, al parecer sólo esa solución del winspool hay, y lo peor no sirve, lamentablemente no se como hacerlo, he intentado mucho.