Monitor de impressao - duvida na recolha dos dados

Boa tarde amigos,

Ja avancei bastante depois do ultimo post. Hoje ja pego as informaçoes dos arquivos .spl e .shd com codigo java, trato os acentos, e salvo em banco de dados. Porem ainda nao sei como fazer pra pegar informações como numerador e nivel do toner na multifuncional, exemplo a lexmark x204 e x264. Sei que existem comandos SNMP que fazem isso, só nao sei quais e como utilizar. Outra coisa: na forma que monitoro as filas do windows aparece tudo do job menos a quantidade total impressa por job, ou seja um arquivo de 10 paginas que mando imprimir 5 copias, registra somente 10 paginas e nao 50 como seria o certo. verifico as informaçoes do job atraves do comando cscript prnjobs.vbs -L > teste.txt, ele vai ate os arquivos do spool, le e grava no txt, claro que com isso tenho q manter o registro dos arquivos impressos ate registrar no txt dai posso entrar no diretorio do spool e deletar. Voces sabem uma forma mais pratica ou mais certa de fazer isso ?

Fabiano

Tem como postar o codigo de leitura

e esse vbs

Ler Smnp

 http://support.microsoft.com/kb/946198/pt-br

Process p;
     try {
            p = Runtime.getRuntime().exec("cscript.exe c:\windows\system32\printing_admin_scripts\pt-br\prnjobs.vbs -l");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

Esse modo que eu faço nao é o ideal, pq nao tem a informação mais importante, que é o total de paginas que a impressora imprimiu, taz somente o numero de paginas do arquivo, nao levando em consideração a quantidade de copias.

Na verdade esqueci de falar, se vc olhar na fila de impressão do windows, voce verá que la informa assim tbm como eu falei. Ou seja certeza que tem ou jeito de fazer.

Fabiano

Na realidade eu utilizo o RPM da Winsoft ele capitura tudo que chega na porta 515 e envia para a impressora e respectivamente eu armazeno a log no Banco de Dados. Tem um aplicativo em delphi que se chama monitor de impressão que captura tudo que e impresso, em java eu não vi nada parecido.

Encontrei esse que voce falou, em delphi, vou gerar o projeto e te falo. Vou tentar extrair a ideia do codigo fonte para enteder como funciona.
Assim que descobrir algo posto aqui.

Abraços

Fabiano

Ja utilizou estes metodos de Captura ?



'=======================================================================================================
' NAME: Monitora Impressoes - Verso Excel
'
' AUTHOR: Luana Celeida Rocha (com grande ajuda do site:
' http://www.microsoft.com/technet/scriptcenter/resources/qanda/default.mspx)
' DATE: 26/06/2008
'
' COMMENT: Este script deve ser colocado na inicializao do sistema, ele ira ficar em um loop 
' monitoranto o spool a cada 5 segundos. Se alguma impressao for localizada seus dados sero registrados
' em uma planilha do excel em C:\ com o nome: 
' "Impressoes_<NomedoComputador>_<NomedoDominio>_<yyyymmdd>_<HH>h<mm>m.xls
' Antes de colocar o script para rodar certifique-se que o usurio tenha permisso de gravao no C:\ ou
' altere o script para que o arquivo seja armazenado em um local onde o usurio tenha acesso.
' Todas as sugestes para melhoria deste script so muito bem vindas.
'
'=======================================================================================================

On Error Resume Next
Set WshNetwork = WScript.CreateObject("WScript.Network")

'Vriaveis utilizadas para coletar dados da fila de impressao
Dim strComputer
Dim objWMIService
Dim propValue
Dim objItem
Dim SWBemlocator
Dim UserName
Dim Password
Dim colItems

'Variaveis utilizadas para nomeacao do arquivo com as impressoes

Dim datahj
Dim mes
Dim horario
Dim acertahora
Dim acertamin
Dim nomearquivo

'Pega data e hora do computador local
datahj = Date
horario = Time

'Verificacao para deixar o mes com 2 digitos
If Month(datahj) < 10 Then
 mes = "0" & Month(datahj)
Else
 mes = Month(datahj)
End If

'Verificacao para deixar a hora com 2 digitos
If Hour(horario) < 10 Then
 acertahora = "0" & Hour(horario)
Else
 acertahora = Hour(horario)
End If

'Verificacao para deixar os minutos com 2 digitos
If Minute(horario) < 10 Then
 acertamin = "0" & Minute(horario)
Else
 acertamin = Minute(horario)
End If

nomearquivo = "Impressoes_"&WshNetwork.ComputerName &"_" &WshNetwork.UserDomain &"_" &Year(datahj) &mes &Day(datahj) &"_" &acertahora &"h" &acertamin &"m"

'&WshNetwork.ComputerName & "_" & WshNetwork.UserDomain & "_"& Year(datahj) & mes & Day(datahj) &"_"& acertahora &"h" & acertamin &"m"


'Criando a planilha que ira armazenar os dados
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)

objExcel.DisplayAlerts = False

intRow = 2 'Usado para informar que os dados comearo a ser armazenados a partir da segunda linha da planilha

'Cria titulo de cada coluna na primeira linha da planilha
objExcel.Cells(1, 1).Value = "Caption"
objExcel.Cells(1, 2).Value = "DataType"
objExcel.Cells(1, 3).Value = "Description"
objExcel.Cells(1, 4).Value = "Document"
objExcel.Cells(1, 5).Value = "DriverName"
objExcel.Cells(1, 6).Value = "ElapsedTime"
objExcel.Cells(1, 7).Value = "HostPrintQueue"
objExcel.Cells(1, 8).Value = "InstallDate"
objExcel.Cells(1, 9).Value = "JobId"
objExcel.Cells(1, 10).Value = "JobStatus"
objExcel.Cells(1, 11).Value = "Name"
objExcel.Cells(1, 12).Value = "Notify"
objExcel.Cells(1, 13).Value = "Owner"
objExcel.Cells(1, 14).Value = "PagesPrinted"
objExcel.Cells(1, 15).Value = "Parameters"
objExcel.Cells(1, 16).Value = "PrintProcessor"
objExcel.Cells(1, 17).Value = "Priority"
objExcel.Cells(1, 18).Value = "Size"
objExcel.Cells(1, 19).Value = "StartTime"
objExcel.Cells(1, 20).Value = "Status"
objExcel.Cells(1, 21).Value = "StatusMask"
objExcel.Cells(1, 22).Value = "TimeSubmitted"
objExcel.Cells(1, 23).Value = "TotalPages"
objExcel.Cells(1, 24).Value = "UntilTime"

'Colunas do Excel que sero utilizadas
Set objRange = objExcel.Range("A1","X1")
objRange.Font.Size = 10
objRange.Interior.ColorIndex = 15

strComputer = "."
UserName = ""
Password = ""

Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2",UserName,Password)

'Informando que ser verificada a fila de impressao a cada 5 segundos
Set colPrintJobs = objWMIService. _ 
    ExecNotificationQuery("Select * From __InstanceCreationEvent " _ 
        & "Within 5 Where TargetInstance ISA 'Win32_PrintJob'")

'Loop infinito, enquanto a maquina estiver ligada a fila de impressao ser monitorada a cada 5 segundos
Do While True
 Set objPrintJob = colPrintJobs.NextEvent
 objExcel.Cells(intRow, 1).Value = objPrintJob.TargetInstance.Caption
 objExcel.Cells(intRow, 2).Value = objPrintJob.TargetInstance.DataType
 objExcel.Cells(intRow, 3).Value = objPrintJob.TargetInstance.Description
 objExcel.Cells(intRow, 4).Value = objPrintJob.TargetInstance.Document
 objExcel.Cells(intRow, 5).Value = objPrintJob.TargetInstance.DriverName
 objExcel.Cells(intRow, 6).Value = objPrintJob.TargetInstance.ElapsedTime
 objExcel.Cells(intRow, 7).Value = objPrintJob.TargetInstance.HostPrintQueue
 objExcel.Cells(intRow, 8).Value = objPrintJob.TargetInstance.InstallDate
 objExcel.Cells(intRow, 9).Value = objPrintJob.TargetInstance.JobId
 objExcel.Cells(intRow, 10).Value = objPrintJob.TargetInstance.JobStatus
 objExcel.Cells(intRow, 11).Value = objPrintJob.TargetInstance.Name
 objExcel.Cells(intRow, 12).Value = objPrintJob.TargetInstance.Notify
 objExcel.Cells(intRow, 13).Value = objPrintJob.TargetInstance.Owner
 objExcel.Cells(intRow, 14).Value = objPrintJob.TargetInstance.PagesPrinted
 objExcel.Cells(intRow, 15).Value = objPrintJob.TargetInstance.Parameters
 objExcel.Cells(intRow, 16).Value = objPrintJob.TargetInstance.PrintProcessor
 objExcel.Cells(intRow, 17).Value = objPrintJob.TargetInstance.Priority
 objExcel.Cells(intRow, 18).Value = objPrintJob.TargetInstance.Size
 objExcel.Cells(intRow, 19).Value = objPrintJob.TargetInstance.StartTime
 objExcel.Cells(intRow, 20).Value = objPrintJob.TargetInstance.Status
 objExcel.Cells(intRow, 21).Value = objPrintJob.TargetInstance.StatusMask
 objExcel.Cells(intRow, 22).Value = objPrintJob.TargetInstance.TimeSubmitted
 objExcel.Cells(intRow, 23).Value = objPrintJob.TargetInstance.TotalPages
 objExcel.Cells(intRow, 24).Value = objPrintJob.TargetInstance.UntilTime
 intRow = intRow + 1
 'Arquivo onde dos dados sero salvos
 objWorkbook.SaveAs "C:\"&nomearquivo
Loop


'=======================================================================================================
' NAME: Monitora Impressoes - Verso Txt
'
' AUTHOR: Luana Celeida Rocha (com grande ajuda do site:
' http://www.microsoft.com/technet/scriptcenter/resources/qanda/default.mspx)
' DATE: 26/06/2008
'
' COMMENT: Este script deve ser colocado na inicializao do sistema, ele ira ficar em um loop 
' monitoranto o spool a cada 5 segundos. Se alguma impressao for localizada seus dados sero registrados
' em um arquivo de texto, com valores separados por ; em C:\ com o nome: 
' "Impressoes_<NomedoComputador>_<NomedoDominio>_<yyyymmdd>_<HH>h<mm>m.txt
' Antes de colocar o script para rodar certifique-se que o usurio tenha permisso de gravao no C:\ ou
' altere o script para que o arquivo seja armazenado em um local onde o usurio tenha acesso.
' Todas as sugestes para melhoria deste script so muito bem vindas.
'
'=======================================================================================================

On Error Resume Next
Set WshNetwork = WScript.CreateObject("WScript.Network")

'Vriaveis utilizadas para coletar dados da fila de impressao
Dim strComputer
Dim objWMIService
Dim propValue
Dim objItem
Dim SWBemlocator
Dim UserName
Dim Password
Dim colItems

'Variaveis utilizadas para nomeacao do arquivo com as impressoes

Dim datahj
Dim mes
Dim horario
Dim acertahora
Dim acertamin
Dim nomearquivo

'Pega data e hora do computador local
datahj = Date
horario = Time

'Verificacao para deixar o mes com 2 digitos
If Month(datahj) < 10 Then
 mes = "0" & Month(datahj)
Else
 mes = Month(datahj)
End If

'Verificacao para deixar a hora com 2 digitos
If Hour(horario) < 10 Then
 acertahora = "0" & Hour(horario)
Else
 acertahora = Hour(horario)
End If

'Verificacao para deixar os minutos com 2 digitos
If Minute(horario) < 10 Then
 acertamin = "0" & Minute(horario)
Else
 acertamin = Minute(horario)
End If

nomearquivo = "Impressoes_"&WshNetwork.ComputerName &"_" &WshNetwork.UserDomain &"_" &Year(datahj) &mes &Day(datahj) &"_" &acertahora &"h" &acertamin &"m"

'&WshNetwork.ComputerName & "_" & WshNetwork.UserDomain & "_"& Year(datahj) & mes & Day(datahj) &"_"& acertahora &"h" & acertamin &"m"


'Criando o arquivo de texto que ira armazenar os dados

Set Fso = CreateObject("Scripting.FileSystemObject")
Set OFile = Fso.CreateTextFile("C:\"&nomearquivo&".txt", 2)

'Cria titulo de cada coluna na primeira linha da planilha
OFile.WriteLine("Caption; DataType; Description; Document; DriverName; ElapsedTime; HostPrintQueue; InstallDate; " _
 & "JobId; JobStatus; Name; Notify; Owner; PagesPrinted; Parameters; PrintProcessor; Priority; Size; StartTime; " _
 & "Status; StatusMask; TimeSubmitted; TotalPages; UntilTime")

strComputer = "."
UserName = ""
Password = ""

Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2",UserName,Password)

'Informando que ser verificada a fila de impressao a cada 5 segundos
Set colPrintJobs = objWMIService. _ 
    ExecNotificationQuery("Select * From __InstanceCreationEvent " _ 
        & "Within 5 Where TargetInstance ISA 'Win32_PrintJob'")

'Loop infinito, enquanto a maquina estiver ligada a fila de impressao ser monitorada a cada 5 segundos
Do While True
 Set objPrintJob = colPrintJobs.NextEvent
 OFile.WriteLine(objPrintJob.TargetInstance.Caption &";" _ 
 &objPrintJob.TargetInstance.DataType &";" _
 &objPrintJob.TargetInstance.Description &";" _
 &objPrintJob.TargetInstance.Document &";" _
 &objPrintJob.TargetInstance.DriverName &";" _
 &objPrintJob.TargetInstance.ElapsedTime &";" _
 &objPrintJob.TargetInstance.HostPrintQueue &";" _
 &objPrintJob.TargetInstance.InstallDate &";" _
 &objPrintJob.TargetInstance.JobId &";" _
 &objPrintJob.TargetInstance.JobStatus &";" _
 &objPrintJob.TargetInstance.Name &";" _ 
 &objPrintJob.TargetInstance.Notify &";" _
 &objPrintJob.TargetInstance.Owner &";" _
 &objPrintJob.TargetInstance.PagesPrinted &";" _
 &objPrintJob.TargetInstance.Parameters &";" _
 &objPrintJob.TargetInstance.PrintProcessor &";" _
 &objPrintJob.TargetInstance.Priority &";" _
 &objPrintJob.TargetInstance.Size &";" _
 &objPrintJob.TargetInstance.StartTime &";" _
 &objPrintJob.TargetInstance.Status &";" _
 &objPrintJob.TargetInstance.StatusMask &";" _
 &objPrintJob.TargetInstance.TimeSubmitted &";" _
 &objPrintJob.TargetInstance.TotalPages &";" _
 &objPrintJob.TargetInstance.UntilTime)
Loop

Se funcionar avise e .vbs

cardosao…

estou prescisando criar uma ferramenta que monitore as impressoes… Tem algumas dicas que vc possa me dar, pois nao estou achando muita coisa na web…

valew…

Olá.

Vi sua publicação a algum temp.o e fiquei curioso, pois trabalho com isso e quero desenvolver algo parecido.

Tem uma forma de pegar estas informações sobre a impressora, basta pegar o código html da página web dela e procurar a substring.

O que não rola é este vbs, no meu pc simplismente não funciona (Win 7 64Bits).

Abraço.

Ok

Uma vez precisei implementar algo parecido pegando determina informação direto no link da impressora mais desta forma acho que tem que ficar em loop ou ler informações a cada x minutos.

Não tinha realizado os teste no Win7 porem o interessante deste script e colocar para rodar dentro do servidor e não no desktop do usuario. testes realizados Win2003 server Win 2000 server e Win2008 Server, XP 98 vista ok.

Pessoal,

Este funciona em todas as versões do Windows Server apartir do 2000, e no meu 7 64 Bits também.

Poém o número de páginas impressas ainda não deu…

Se alguém souber como fazer, especialmente em Java e não em VB, posta aí pelo menos alguma informação sobre a API.

Neste site http://social.msdn.microsoft.com/Forums/en-AU/csf/thread/db24d345-b51e-4a2d-8b57-d79633c7de35 tem uma galera tirando informações parecidas apenas com Java.

Set SWBemlocator = CreateObject(“WbemScripting.SWbemLocator”)
Set objWMIService = SWBemlocator.ConnectServer(strComputer,“root\CIMV2”)

Set colPrintJobs = objWMIService. _
ExecNotificationQuery("Select * From __InstanceCreationEvent " _
& “Within 0.1 Where TargetInstance ISA ‘Win32_PrintJob’”)

Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objLogFile = objFSO.OpenTextFile(“D:\Ipressoes.csv”, 8, True, 0) ----> Edite o caminho para armazenar o log.

Do While True

Set objPrintJob = colPrintJobs.NextEvent()

WScript.Echo “Impressão Capturada”

objLogFile.WriteLine _
objPrintJob.TargetInstance.Caption & “;” _
& objPrintJob.TargetInstance.DataType & “;” _
& objPrintJob.TargetInstance.Description & “;” _
& objPrintJob.TargetInstance.Document & “;” _
& objPrintJob.TargetInstance.DriverName & “;” _
& objPrintJob.TargetInstance.ElapsedTime & “;” _
& objPrintJob.TargetInstance.HostPrintQueue & “;” _
& objPrintJob.TargetInstance.InstallDate & “;” _
& objPrintJob.TargetInstance.JobId & “;” _
& objPrintJob.TargetInstance.JobStatus & “;” _
& objPrintJob.TargetInstance.Name & “;” _
& objPrintJob.TargetInstance.Notify & “;” _
& objPrintJob.TargetInstance.Owner & “;” _
& objPrintJob.TargetInstance.PagesPrinted & “;” _
& objPrintJob.TargetInstance.Parameters & “;” _
& objPrintJob.TargetInstance.PrintProcessor & “;” _
& objPrintJob.TargetInstance.Priority & “;” _
& objPrintJob.TargetInstance.Size & “;” _
& objPrintJob.TargetInstance.StartTime & “;” _
& objPrintJob.TargetInstance.Status & “;” _
& objPrintJob.TargetInstance.StatusMask & “;” _
& objPrintJob.TargetInstance.TimeSubmitted & “;” _
& objPrintJob.TargetInstance.TotalPages & “;” _
& objPrintJob.TargetInstance.UntilTime & “;” _
& objPrintJob.TargetInstance.PaperLength & “;” _
& now

intRow = intRow + 1

loop

Ola alguem conseguiu capturar o numero de impressões em java ou vbs?