Eigenschaften des Druckers ermitteln

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Eigenschaften des Druckers ermitteln

    Hallo,

    ich möchte beim Drucken eines NSViews ermitteln, ob das Ausgabegerät gerade in Farbe druckt oder nicht um die Ausgabe (Graustufen anstatt Farben) zu optimieren. Allerdings finde ich in der Doku nix. Eigentlich müsste die Info ja irgendwie an CGContext hängen, aber da ist nix. Die einzige Funktion, die ich gefunden habe (in Core Printing) ist Deprecated und nicht mehr für 64Bit-Anwendungen verfügbar.

    Hat jemand einen Tip? Nicht mal Google spuckt was aus...

    ciao

    gandhi
  • Du kannst den NSPrinter danach fragen. Das folgende Beispiel liefert bei mir die Farbinformationen zu allen Druckern.

    Quellcode

    1. for (NSString* name in [NSPrinter printerNames]) {
    2. NSPrinter* printer = [NSPrinter printerWithName:name];
    3. BOOL hasColor = [printer booleanForKey:@"ColorDevice" inTable:@"PPD"];
    4. NSString* colorSpace = [printer stringForKey:@"DefaultColorSpace" inTable:@"PPD"];
    5. NSLog(@"Printer %@ has color: %i color space: %@",name,hasColor,colorSpace);
    6. }
    Multigrad - 360°-Produktfotografie für den Mac
  • Danke, das ist schonmal nicht schlecht. Trifft's aber auch nicht richtig. Ich muss wissen, ob der aktuelle Druckvorgang in Farbe abläuft oder nicht. Obiges liefert auch "Farbe", wenn es zwar ein Farbdrucker ist, der aber in S/W bzw. Graustufen druckt. M.E. müsste das irgendwie über den Graphics-Context gehen. So ein Property wie "rendert in Farbe" "rendert in Graustaufen" oder "rendert in S/W". Aber das gibt's irgendwie nicht. Kann ich mir aber nicht vorstellen, Apple ist ja stark im DTP-Bereich bzw. der Druckvorstufe.

    ciao

    gandhi
  • gandhi schrieb:

    Hallo,
    ich möchte beim Drucken eines NSViews ermitteln, ob das Ausgabegerät gerade in Farbe druckt oder nicht um die Ausgabe (Graustufen anstatt Farben) zu optimieren.

    Verstehe ich dich richtig, dass du die Anpassungen vornehmen willst, wenn der Druck bereits läuft?
    Falls ja klingt mir das doch nach einer sehr seltsamen Vorgehensweise. Normalerweise drucken die doch erst, wenn sie die Daten bereits haben...
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    gandhi schrieb:

    Hallo,
    ich möchte beim Drucken eines NSViews ermitteln, ob das Ausgabegerät gerade in Farbe druckt oder nicht um die Ausgabe (Graustufen anstatt Farben) zu optimieren.

    Verstehe ich dich richtig, dass du die Anpassungen vornehmen willst, wenn der Druck bereits läuft?
    Falls ja klingt mir das doch nach einer sehr seltsamen Vorgehensweise. Normalerweise drucken die doch erst, wenn sie die Daten bereits haben...


    ich kanns schon verstehen. man zeigt auf dem bildschirm etwas in farbe an, wird es aber gedruckt und man stellt fest dass die ausgabe S/W sein soll dann kann man es dafür optimieren (zb eine optimierte version vom logo verwenden etc)
  • Richtig!

    Nehme zum Beispiel die drei Farben (angegeben in RGB): (1,0,0), (0,1,0) sowie (0,0,1). Die kannst Du auf einem Farbdisplay bzw. Drucker prima unterscheiden, wohingegen alle drei Farben in Graustufen gedruckt erstmal nicht mehr unterscheidbar sind. Und das ist ja u.U. eher blöd. Deswegen die Notwendigkeit bei der Ausgabe zu entscheiden ob Farbe geht oder nicht. Konkret geht es hier um Diagramme, deren einzelne Teile auch in S/W noch gut unterscheidbar sein sollen.

    schönen Gruß

    gandhi
  • nussratte schrieb:

    ich glaub was lucas meint ist

    du drückst auf DRUCKEN, dein Druckauftrag landet beim drucker , dann fängt der drucker an UND DANN willst du abfragen ob er farbe oder s/w druckt?
    ich würde mal sagen an der stelle ist das thema doch schon durch ?(


    nein, in dem moment wo du auf "drucken" klickst, generiert das system erstmal das view das gedruckt werden soll (anhand der ganzen einstellungen die du im druckmenu eingestellt hast). und die optionen will er eben abfragen (beim zeichnen des views - das system fragt einen ja dazu)
  • gandhi schrieb:

    Ich muss wissen, ob der aktuelle Druckvorgang in Farbe abläuft oder nicht.
    wahrscheinlich ist es für mich einfach zu früh aber nach dem was du gerade geschrieben hast, sind es doch die ganz normalen drucker einstellungen die man vorher abfragen kann
    ich lese anhand des zitats raus, das er cshon druckt
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • Mein Verständnisproblem bezieht sich auf 'während des Drucks'.
    Sobald dein Drucker druckt (a.k.a. 'während des Drucks') hat dein Drucker bereits alle Daten, du kannst dein View nicht mehr optimieren.
    (Stimmt fast, nussratte. :) Nur meinte ich nicht die Auswahl von 'Drucken' sondern 'Während des Drucks', also wenn der Drucker bereits am Rödeln ist.)

    Du kannst also nur feststellen, ob dein Drucker theoretisch in Farbe drucken könnte. Du kannst vermutlich auch noch feststellen, ob der Drucker praktisch genug Farbpatrone für einen farbigen Druck hat.
    Du wirst aber nicht feststellen können, ob dein Drucker auf Grund irgendeiner bevorzugten Grundeinstellung pauschal alles in Graustufen druckt, obwohl er theoretisch und praktisch in Farbe drucken könnte.
    Das siehst du dann erst auf dem Ausdruck.

    Mag sein, dass spezielle Druckertreiber dafür spezielle Informationen wie ein DefaultPrintSetting bieten, doch eine Allgemeinlösung kann ich mir da wirklich nicht vorstellen.
    Sprich: mehr allgemein gültige Möglichkeiten, als sie NSPrinter dir bietet, wirst du nicht haben.

    mattik:
    Woher hast du die Auflistung der Keys und Tables für den NSPrinter? Ich finde die irgendwie nicht. -.-
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    Mein Verständnisproblem bezieht sich auf 'während des Drucks'.
    Sobald dein Drucker druckt (a.k.a. 'während des Drucks') hat dein Drucker bereits alle Daten, du kannst dein View nicht mehr optimieren.
    (Stimmt fast, nussratte. :) Nur meinte ich nicht die Auswahl von 'Drucken' sondern 'Während des Drucks', also wenn der Drucker bereits am Rödeln ist.)

    Du kannst also nur feststellen, ob dein Drucker theoretisch in Farbe drucken könnte. Du kannst vermutlich auch noch feststellen, ob der Drucker praktisch genug Farbpatrone für einen farbigen Druck hat.
    Du wirst aber nicht feststellen können, ob dein Drucker auf Grund irgendeiner bevorzugten Grundeinstellung pauschal alles in Graustufen druckt, obwohl er theoretisch und praktisch in Farbe drucken könnte.
    Das siehst du dann erst auf dem Ausdruck.

    Mag sein, dass spezielle Druckertreiber dafür spezielle Informationen wie ein DefaultPrintSetting bieten, doch eine Allgemeinlösung kann ich mir da wirklich nicht vorstellen.
    Sprich: mehr allgemein gültige Möglichkeiten, als sie NSPrinter dir bietet, wirst du nicht haben.

    mattik:
    Woher hast du die Auflistung der Keys und Tables für den NSPrinter? Ich finde die irgendwie nicht. -.-


    nein, sobald du auf "drucken" klickst wird das view erstmal generiert und das zecihnest ja du. und an der stelle müsstest du eben in deinem code auch esehen können welche druckeinstellungen gewählt wurden.
  • Lucas de Vil schrieb:

    mattik:
    Woher hast du die Auflistung der Keys und Tables für den NSPrinter? Ich finde die irgendwie nicht. -.-

    Ja, die sind mal wieder super dokumentiert. Der Key stammt aus der Adobe PPD spec (die fast unlesbar ist - einfacher geht es, in einer PPD nachzusehen). Die Table-ID habe ich glaube ich in einem ObenStep-Forum gefunden - ist nicht sonderlich offiziell, aber an der Stelle wäre ich mir relativ sicher, dass Apple da nichts ändern kann ohne dass das ganze Print-System auseinanderfliegt.

    Man kommt übrigens an die aktuellen Druckeinstellungen, z.B. indem man im Dictionary [[[NSPrintOperation currentOperation] printInfo] printSettings] nachschaut, da stehen die Werte aus dem Druckdialog live drin. Darin gibt es z.B. einen Key "com_apple_print_PrintSettings_PMColorSpaceModel", der Wert ist (naheliegenderweise) vom Typ PMColorSpaceModel (frag' nicht, wo ich das her habe - eben herausgefummelt). Das Problem ist, dass einige Druckertreiber anscheinend ihr eigenes Süppchen kochen - da müsste man sehen, wie weit man kommt.

    Der sauberste Weg dürfte sein, einen eigenen Accessory Controller an das Print Panel zu hängen.
    Multigrad - 360°-Produktfotografie für den Mac
  • Ich würde mich auch in den Print Dialog hängen.
    Du kannst mit cupsctl das debugging anschalten.
    Dann kannst du in /var/log/cups/access_log ansehen was für Keys an die Druckertreiber übergeben wird.

    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • gritsch schrieb:

    nein, sobald du auf "drucken" klickst wird das view erstmal generiert und das zecihnest ja du. und an der stelle müsstest du eben in deinem code auch esehen können welche druckeinstellungen gewählt wurden.

    Dann druckt der Drucker aber noch nicht.

    Beim TE heißt es:
    ich möchte beim Drucken eines NSViews ermitteln, ob das Ausgabegerät gerade in Farbe druckt oder nicht um die Ausgabe (Graustufen anstatt Farben) zu optimieren.


    Vielleicht ist es nur unglücklich formuliert, aber für mich heißt das eben: nachdem der Druckvorgang los ging, der Drucker also druckt.
    "Ob das Ausgabegerät gerade druckt" bedeutet für mich jetzt, aktuell, zu genau diesem Zeitpunkt.

    Denn wie bereits mehrfach erwähnt, findet man die Einstellungen des Dinges via NSPrinter heraus.
    Ob da irgendeine druckerinterne Einstellung etwas Anderes macht (z.B. Fach 1 mit Firmenpapier nur in Graustufen auf A4, selbst wenn ich Farbe auf A3 kann), findet man erst am Ausdruck heraus, nicht aber generisch über das System.

    Und so wie ich gandhi verstanden habe, will er genau so etwas abfangen.

    Also nicht 'der Drucker ist im Treiber für Farbdrucke eingestellt' sondern 'der Drucker druckt trotz Einstellung für Farbdrucke im Treiber immer in Graustufen, wenn der Mond im Achten Haus des Wassermanns steht.'
    Oder simpler: statt 'kannst du in Farbe drucken?' ein 'druckst du den kommenden Auftrag in Farbe?'
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Gritsch hat es schon richtig formuliert: In dem Moment, in dem der Nutzer auf "Drucken" klickt wird die drawRect-Methode Deines Print-Views aufgerufen. Dort wäre es extrem hilfreich wenn man feststellen könnte, in welchem Farbmodell das am Ende gerendert wird.

    Ich habe jetzt bei Apple doch noch eine Technical Q&A gefunden, sie sich mit dem Problem befasst. Dort wird das so ähnlich gemacht, wie das mattik weiter oben gezeigt hat. Scheint also wirklich die einzige annähernde Lösung zu sein. Blöd, blöd...

    Den Vorschlag mit Cups schaue ich mir nochmal an.

    schönen Gruß

    gandhi
  • gandhi schrieb:

    Gritsch hat es schon richtig formuliert: In dem Moment, in dem der Nutzer auf "Drucken" klickt wird die drawRect-Methode Deines Print-Views aufgerufen. Dort wäre es extrem hilfreich wenn man feststellen könnte, in welchem Farbmodell das am Ende gerendert wird.

    Das wird doch erst mal als PDF gerendert das Du auch abspeichern kannst oder per E-Mail versenden. Oder Per Copy&Paste irgendwo einfügen.

    D.h. zwischen Programm-Button "Drucken" und dem Farbmodell beim Drucken gibt es keinen beidseitigen Zusammenhang, außer über die PDF-Datei (Einbahnstraße).

    Dir bleibt m.E. nichts anderes übrige wie bei manchen Webseiten eine "Druckansicht" zu machen. D.h. der Benutzer muß wählen, ob er es "normal" oder "bearbeitet" abgespeichert haben will. Also "Farbig Drucken", "S/W drucken".

    Das mag wie eine Einschränkung wirken, hat aber auch Vorteile, eben dass man es ohne Abhängigkeit wie es irgendwann mal gedruckt wird abspeichern kann.
  • Nein, die drawRect-Methode wird öfters aufgerufen: Einmal um die Vorschau im Druckdialog zu erzeugen, gegebenenfalls einmal um ein PDF zu erzeugen und einmal, wenn's an's Druclen geht.

    Aber Du hast wahrscheinlich Recht: Das Problem ist letztendlich mit Bordmitteln ohne Benutzerinteraktion nicht sauber zu lösen.

    ciao

    Christian