Entwickler-Ecke
Windows API - (Nur) DruckerFonts ermitteln
MeierZwoo - Mi 26.03.14 21:57
Titel: (Nur) DruckerFonts ermitteln
Hallo,
ich möchte die
nur im Drucker(treiber) vorhandenen Fonts des Druckers
direkt ermitteln.
Bisher mache ich dies bisher brutal durch Vergleich der Gesamt-Fonts mit den Screen-Fonts, der auch funktioniert und hier nur zum evtl. Verständnis steht:
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: 38: 39: 40: 41: 42: 43: 44:
| procedure irgendwas; var ScreenFonts, Druckerfonts : TStringList; i, fi, p : integer; FontName : string; begin printer.PrinterIndex:=p:
if GetDeviceCaps(Printer.Handle,NUMFONTS)>0 then begin ScreenFonts := TStringList.Create; Druckerfonts := TStringList.Create;
for i:=0 to Screen.Fonts.Count-1 do begin FontName:=Screen.Fonts[i]; ScreenFonts.add(FontName); end;
for i:=0 to Printer.Fonts.Count-1 do begin FontName:=Printer.Fonts[i]; fi:=ScreenFonts.IndexOf(FontName); if ((fi>=0) and (fi<ScreenFonts.count)) then ScreenFonts.Delete(fi) else Druckerfonts.add.FontName; end; Druckerfonts.free: ScreenFonts.free; end; end; |
Ich suche allerdings nach einer Möglichkeit, die Fonts
direkt vom aktuell gesetzen Drucker(treiber) zu ermitteln - ich hatte das irgendwann mal im Web gelesen, aber nicht vermerkt und finde es auch nicht wieder.
MfG :)
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 26.03.2014 um 22:09
MeierZwoo - Mi 26.03.14 22:53
Perlsau hat folgendes geschrieben : |
Welche Fonts sollte man denn sonst erhalten, wenn man Printer.Fonts abruft?
|
Alle Fonts, die printer.canvas benutzen kann. Das sind alle unter win installierten Fonts sowie die im Drucker (nach Meinung des Treibers) installierten Fonts. Dazu muß der Drucker weder am PC angeschlossen sein noch (zum evtl. antworten) eingeschaltet sein. Diese Information bezieht Win aus dem Treiber.
Win entscheidet beim Ausführen der canvas dann, ob ein Font nur in Win existiert und sendet dann Pixel, oder ob ein Font auf dem Drucker selbst installiert ist, und sendet dann Commands. Bis Win 3x war in den Fontlisten (z.B. für das Schriftsetzen in einem Editor) noch ein Druckersymbol vor dem Schriftnamen (statt TT oder Adobe-Symbol).
Zitat: |
Übrigens glaube ich nicht, daß in Druckertreibern Fonts enthalten sind, lasse mich aber gerne eines Besseren belehren. |
Fonts selber müssen dort auch nicht enthalten sein - wohl aber die Liste der Fonts. Und nur um diese Liste geht es ja hier. Wenn Du die Fontliste printer.fonts ausgeben läßt, wirst Du dort alle Fonts erhalten, incl. der nur im (aktuell gesetzen) Drucker enthaltenen Fonts (Die Nur-Druckerfonts normal am Anfang der Liste (Index 0..n)). Woher soll denn sonst ein Programm zur Runtime in der canvas einen nur im Drucker vorhandenen Font benutzen können, wenn dieser nicht antworten kann?
Und oft kann der Drucker nicht antworten und seine Fonts mitteilen, selbst wenn wollte. Entweder wg. einer uni-directionalen Schnittstelle oder im LAN, wenn der Druckauftrag in Queue geschrieben wird - die Queue kann keine Druckerinformationen zurück übermitteln.
Zitat: |
Meines Wissens nach befinden sich Fontdaten in den Druckern selber, denn viele Drucker können auch komplett ohne PC und Druckertreiber betrieben werden, z.B. beim Drucken der Testseite. |
Natürlich weiß ein Drucker selbst, welche Fonts auf ihm installiert sind (Und kann diese Fontliste auch per Testdruck am Drucker selbst ausgeben - zumindest bei denen, die das Implementiert haben).
MeierZwoo - Do 27.03.14 00:17
Danke Gerd,
hoch interessant, aber die Umsetzung in Quellcode ist wohl etwas aufwendiger als meine zugegebenerweise "primitive" Version, zumal ich die Fontwerte (Fontmatrix, ...) nicht benötige.
:)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!