Autor Beitrag
COMMANDER86
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 167

Win XP, Win Vista
D3 Prof., D7 Pers., Lazarus
BeitragVerfasst: So 11.11.07 21:51 
Hallo zusammen,

ich habe folgende Problemstellung:

Ich habe einige Netzwerkdrucker laufen, die vom gesamten Haus genutzt werden. Bisher wurden Kosten für Papier und Farben anteilsmäßig verrechnet. Aber nicht, so viel gedruckte Seiten = soviel €, sondern Kosten durch Anzahl der User, was nicht gerade zu einer harmonischen Beziehung zwischen Papierjunkies und Wenigdruckern führt.

Folgende Informationen beziehen sich auf den Hintergrund:

Im Netzwerk befindet sich beispielsweise ein HP PhotoSmart 5180. Geladen mit Normalpapier und 10*15 Photokarton. Das Papier ist das kleinste Übel, aber die Patronen kosten bekanntermaßen einen Batzen Bares. Der Drucker ist auf sämtlichen Rechnern drei mal installiert, damit die... unerfahrenen Benutzer bequemer entscheiden können, was sie drucken möchten

HP PSC 5180 --> S/W - DIN A4
HP PSC 5180 COLOR --> Farbe - DIN A4
HP PSC 5180 PHOTO --> Farbe - 10*15 Photokarton

was sich, so denke ich, als Vorteil herausstellen wird, denn:

Ich möchte die Anzahl der Seiten haben, die an den Drucker gesendet werden; ermittelt von einem Tool, dass quasi mit am Druckertreiber hängt. Dabei lässt sich dann ja auf dem Client bereits feststellen, ob Farbe, S/W oder Photo. Diese Daten sollten zunächst lokal in einer Textdatei abgelegt werden.

Zusatzinfo:

Alle Client sind mit einer von mir gefertigten Serversoftware verbunden und erhalten von dieser auch Updates, neue Programme und gewünschte Einzelinstallationen, um die 1000er Leitung nicht mit Downloads glühen zu lassen, weil mir sonst die Dauer eBay und AutoScout Nutzer aufs Dach steigen. ;) Die Daten auf den Server zu transferieren und dort auszuwerten ist also das kleinste Problem. Lediglich Folgendes:

Wie bekomme ich eine "Seitenzählung" an den Druckertreiber und wie könnte die aussehen?

Mit Dank im Voraus

Fabian

PS: Ich weiß... die Geräte erhalten schon Nachfülltinten, um Kosten einzusparen und Produkte wie KYOcount oder JetAdmin sind zu sehr auf Riesennetzwerke getrimmt, als das sie hier Abhilfe schaffen könnten. Zum Anderen sind sie kostenpflichtig und dienen damit nicht unbedingt der fairen Kostenverteilung. ;)

PPS: Sorry, für den großen Text, aber ich möchte Missverständnissen vorbeugen und direkt Klarheit schaffen.

_________________
Streichen Sie bitte sämtlichen Sarkasmus aus vorhergehender Nachricht. Dann wissen Sie, was ich sagen möchte. Meine Lösungen sind die vermutlich Umständlichsten, aber sie funktionieren (bei mir). ;)
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: So 11.11.07 23:51 
vielleicht könnte dir das hier helfen, um ein solches Tool zu erstellen:
cc.codegear.com/Item.aspx?id=20307

_________________
In the beginning was the word.
And the word was content-type: text/plain.
COMMANDER86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 167

Win XP, Win Vista
D3 Prof., D7 Pers., Lazarus
BeitragVerfasst: Mo 12.11.07 00:18 
Was ich bis jetzt sehen konnte: Sieht sehr gut aus. Danke! Ich musste nur gerade wieder schmerzhaft den Umstieg auf Lazarus bemerken. ;)

Werde ich morgen mal mit Delphi testen. Nochmals Danke!

Für weitere Ideen bin ich dankbar!

_________________
Streichen Sie bitte sämtlichen Sarkasmus aus vorhergehender Nachricht. Dann wissen Sie, was ich sagen möchte. Meine Lösungen sind die vermutlich Umständlichsten, aber sie funktionieren (bei mir). ;)
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 12.11.07 03:18 
user profile iconmatze hat folgendes geschrieben:
vielleicht könnte dir das hier helfen, um ein solches Tool zu erstellen:
cc.codegear.com/Item.aspx?id=20307


Hallo,

mal abgesehen von den gemeldeten Bugs: da steht was von EventOnJob - das sagt nichts aus über Seiten, denn die Seiten sind im Druckercode enthalten, in PCL anders als in PS oder ESC-P usw., man bräuchte also einen PCL+Postscript+allesMöglichesonst-Interpreter.

Da wäre es noch eher möglich, nur Postscript zuzulassen und das mit Ghostscript dann an den Drucker zu schicken (nach Herausfinden der Seitenanzahl).

Ich weiss durchaus, wovon ich rede, ich habe schon Druck-Übersetzer geschrieben. Ein Problem als Beispiel: bei ESC-P erzeugt Windows garkeinen Seitenbefehl (auch nicht FormFeed), sondern nur soviele Zeilenvorschübe, dass die Seite genau voll ist - und nu?

Gruss Reinhard
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 12.11.07 11:27 
PagesPrinted

msdn.microsoft.com/l...i/Win32_PrintJob.asp

Geht auch mit WMI:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
strServer = "."

Set objWMI = GetObject("winmgmts://" & strServer & "/root\cimv2")
Set objInstances = objWMI.InstancesOf("Win32_PrintJob",48)

On Error Resume Next
For Each objInstance in objInstances
    With objInstance
        WScript.Echo .Caption
        WScript.Echo .DataType
        WScript.Echo .Description
        WScript.Echo .Document
        WScript.Echo .DriverName
        WScript.Echo .ElapsedTime
        WScript.Echo .HostPrintQueue
        WScript.Echo .InstallDate
        WScript.Echo .JobId
        WScript.Echo .JobStatus
        WScript.Echo .Name
        WScript.Echo .Notify
        WScript.Echo .Owner
        WScript.Echo .PagesPrinted
        WScript.Echo .Parameters
        WScript.Echo .PrintProcessor
        WScript.Echo .Priority
        WScript.Echo .Size
        WScript.Echo .StartTime
        WScript.Echo .Status
        WScript.Echo .StatusMask
        WScript.Echo .TimeSubmitted
        WScript.Echo .TotalPages
        WScript.Echo .UntilTime
    End With
On Error Goto 0
Next


Wie man DELPHI und WMI "zusammenbringt" findest Du hier im Forum.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 12.11.07 14:02 
user profile iconhathor hat folgendes geschrieben:
PagesPrinted

msdn.microsoft.com/l...i/Win32_PrintJob.asp

Geht auch mit WMI:
...
Wie man DELPHI und WMI "zusammenbringt" findest Du hier im Forum.


Hallo,

das sieht als Ansatzpunkt viel besser aus, könnte aber auch schiefgehen, Zitat:

PagesPrinted
Data type: uint32
Access type: Read-only

Number of pages that are printed. This value may be 0 (zero) if the print job does not contain page-delimiting information.

Was immer page-delimiting information heissen soll. Wahrscheinlich muss man das einfach praktisch ausprobieren.

Gruss Reinhard
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 12.11.07 15:01 
user profile iconReinhard Kern hat folgendes geschrieben:
Hallo,

das sieht als Ansatzpunkt viel besser aus, könnte aber auch schiefgehen, Zitat:

PagesPrinted
Data type: uint32
Access type: Read-only

Number of pages that are printed. This value may be 0 (zero) if the print job does not contain page-delimiting information.

Was immer page-delimiting information heissen soll. Wahrscheinlich muss man das einfach praktisch ausprobieren.

Gruss Reinhard


page-delimiting information = FF = Formfeed = Chr(12), wenn ich nicht irre.

The form feed character code is defined as 12 in decimal and 0xC in hexadecimal.

en.wikipedia.org/wiki/Form_feed

Form feed

Form feed is one of control characters in ASCII. It forces the printer to eject the current page and to continue printing at the top of another. Often, it will also cause a carriage return. The form feed character code is defined as 12 in decimal and 0xC in hexadecimal. In the C programming language (and other languages derived from C), the form feed character may be represented as '\f'

Form feed is seldom used when programming with modern printers in modern operating environments like Windows, Unix, or Mac OS. Instead, form feeds are generated by having the printing program call a form feed API function. For example, when printing using the .NET Framework, the PrintPageEventArgs.HasMorePages property is used to indicate a form feed is desired.

The form feed character is sometimes used in plain text files of source code as a delimiter for a page break, or as marker for sections of code. Some editors, in particular emacs, have built-in commands to page up/down on the form feed character. This convention is predominantly used in lisp code, and is also seen in Python source code.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 12.11.07 16:26 
Ich habe hier was Erweiterungsfähiges gefunden mit Source Code:

www.programmersheave.../16360/download.aspx

EXE ist dabei, Source Code lässt sich ohne Fehler compilieren...
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 12.11.07 19:04 
user profile iconhathor hat folgendes geschrieben:


page-delimiting information = FF = Formfeed = Chr(12), wenn ich nicht irre.

...


Hallo,

das kann es nicht (allein) sein. Postscriptdateien enthalten kein FormFeed. Beispiel:

/#copies 3 def
showpage

wirft 3 leere Seiten aus.

Gruss Reinhard
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 12.11.07 20:35 
Deshalb funktioniert die Abfrage von "PagesPrinted" nicht immer - bleibt auf "0".
Besser wäre es, den Drucker direkt zu fragen über das Webinterface, wieviel er gedruckt hat.

Ist es jemand gelungen <ID: 20307, SpyPrinter for Delphi> zu compilieren?
Bei mir geht es mit DELPHI 2007 nicht.

codecentral.borland.com/Item.aspx?id=20307
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 16.11.07 20:50 
Mit WMI : Win32_PerfFormattedData_Spooler_PrintQueue : TotalPagesPrinted
kann man sich auch die gedruckten Seiten anzeigen lassen.
COMMANDER86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 167

Win XP, Win Vista
D3 Prof., D7 Pers., Lazarus
BeitragVerfasst: Mo 03.12.07 23:15 
Hallo,

sorry, dass ich Euch so lange hab' warten lassen. Ich habe bis dato eine Vorab-Lösung gefunden:

www.delphipraxis.net/post750625.html

Da steht das Orginal, dass ich nun abgewandelt einsetze. Der Code sieht wie folgt aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TForm1.Button1Click(Sender: TObject);
type
  PJobs = ^TJobs;
  TJobs = array[0..0]of TJobInfo2;
var
  Needed, JobCounter : DWORD;
  i : Integer;
  Device, Driver, Port : array[0..255of char;
  hPrinter, hDeviceMode : THandle;
  Buffer : Pointer;
  Job : PJobs;
const
  NoJobs = 100;
begin
//TEIL1
  Printer.PrinterIndex := -1;
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if WinSpool.OpenPrinter(@Device, hPrinter, nilthen
  begin
    EnumJobs(hPrinter, 0, NoJobs, 2nil0, Needed, JobCounter);
    GetMem(Buffer, Needed);
    try
      Job := Buffer;
      if EnumJobs(hPrinter, 0, NoJobs, 2, Buffer, Needed, Needed, JobCounter) then
        begin
        Edit1.Text := IntToStr(JobCounter);
          for i := 0 to JobCounter - 1 do
            begin
            if Job[i].pDocument <> nil then
              Edit2.Text := IntToStr(Job[i].TotalPages);
            end;
        end;
    finally
      FreeMem(Buffer, Needed);
    end;
    WinSpool.ClosePrinter(hPrinter);
  end;


Momentan hapert es noch an der Zählung bei mehreren Aufträgen in der Warteschlange... so wird nur der letzte Auftrag gezählt. Das lässt sich jedoch sicherlich in der Schleife beheben... ich arbeite dran.

ausblenden Delphi-Quelltext
1:
Printer.PrinterIndex := -1;					


...setzt den Standarddrucker. Mit ein bisschen Experimentierfreude habe ich herausgefunden, dass man die weiteren Drucker mit 0 - X auslesen kann. Ich denke, dass lässt sich aber auch über "Device" oder "Driver" irgendwie lösen, nur fehlte mir bis dato die Zeit dafür.

Die Prozedur wird alle 5 Sekunden von einem Timer angestoßen. Ich kann mir vorstellen, dass dadurch so ein 2kb großer Ausdruck flöten gehen kann, weil er schneller wieder aus dem Spool ist, als 5 Sekunden vergangen sind, aber bei den Seiten kann es sich quasi nur um eine einzelne S/W-Seite handeln... da will ich mal nicht so kleinlich sein. Die Timerzeit runterzustellen schien nicht gut zu sein, es sei denn man hat keine Probleme mit einem Ruckelsystem. ;)

Ich danke für Eure Hilfe... ich halte Euch auf dem Laufenden.

_________________
Streichen Sie bitte sämtlichen Sarkasmus aus vorhergehender Nachricht. Dann wissen Sie, was ich sagen möchte. Meine Lösungen sind die vermutlich Umständlichsten, aber sie funktionieren (bei mir). ;)