Xcode 11 Swift 5 Drucker selektieren bevor Druckerpanel geöffnet wird

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

  • Xcode 11 Swift 5 Drucker selektieren bevor Druckerpanel geöffnet wird

    Hallo,

    ich habe hier mal einen separaten Teil-Thread zu meinem FAX Thema eröffnet. Bisher hatte ich immer auf dem Default-Printer alle notwendigen Dokumente gedruckt, soweit so gut.

    Nun muss ich jedoch einen anderen Drucker aus der Lister der verfügbaren Drucker selektieren und ein paar Voreinstellungenund treffen, bevor das Druckermenü mit dem zuvor selektiertem Drucker angezeigt wird . Wie funktioniert dies bzw. ist dies auf diesem Wege überhaupt so realisierbar?

    Mit dem nachfolgenden Code werden auf der Konsole alle vorhanden Drucker ausgegeben und via NSPrintOperation das Druckermenü mit einem initialisiertem PDFView geöffnet. Soweit alles i.O..


    Quellcode

    1. let printController = NSPrinter.printerNames
    2. let printInfo = NSPrintInfo.shared
    3. let pdfView : PDFView = PDFView.init()
    4. let operation: NSPrintOperation = NSPrintOperation(view: pdfView, printInfo: printInfo)
    5. print("Status: ", printController.description)
    6. operation.printInfo.dictionary()
    7. operation.run()
    Nun nochmals zu meinen Fragen:
    - Wie kann ich aus der Liste der Drucker, den für mich relevanten auswählen bzw. zur weiteren Nutzung festlegen?
    - Welche Möglichkeiten habe ich die Attribute des selektierten Druckers zu ändern und wie funktioniert dies?

    Danke mal vorab.
  • MCDan schrieb:

    Den Printer kannst Du über das Property printer in NSPrintInfo einstellen.

    In NSPrintInfo kannst Du auch noch weitere Attribute einstellen.

    Bei einer Document Based Application hat jedes Dokument ein eigenes NSPrintInfo.
    Ich habe daraufhin meinen Code wie folgt abgeändert.

    Quellcode

    1. let printInfo = NSPrintInfo.shared
    2. let pdfView : PDFView = PDFView.init()
    3. let operation: NSPrintOperation = NSPrintOperation(view: pdfView, printInfo: printInfo)
    4. let operationPrintInfo = operation.printInfo
    5. operationPrintInfo.printer = NSPrinter(name: "FAX")!
    6. operation.run()

    Nun wird mir das Druckermenü nun mit dem FAX Printer angezeigt. :thumbsup: Soweit so gut.


    Quellcode

    1. print("Dictionary: ", operationPrintInfo.dictionary())

    Zeigt mir nun folgende Struktur an:

    operationPrintInfo.dictionary(): {
    NSBottomMargin = 90;
    NSCopies = 1;
    NSDestinationFormat = "com.apple.documentformat.default";
    NSDetailedErrorReporting = 0;
    NSFaxNumber = "";
    NSFirstPage = 1;
    NSHorizonalPagination = 2;
    NSHorizontallyCentered = 1;
    NSJobDisposition = NSPrintSpoolJob;
    NSJobSavingFileNameExtensionHidden = 0;
    NSLastPage = 2147483647;
    NSLeftMargin = 72;
    NSMustCollate = 1;
    NSOrientation = 0;
    NSPagesAcross = 1;
    NSPagesDown = 1;
    NSPaperName = "iso-a4";
    NSPaperSize = "NSSize: {595, 842}";
    NSPrintAllPages = 1;
    NSPrintProtected = 0;
    ...
    }

    Wie kann ich nun NSFaxNumber eine Nummer zuordnen? Wenn ich .setValue() anwende, erhalte ich immer den Hinweis, dass dieser Key nicht existiert. ?(
  • Da dictionary() ein NSMutableDictionary zurück liefert, solltest Du dort jeden beliebigen Key verwenden können.

    Es macht natürlich Sinn bekannte Keys zu verwenden, wenn Du etwas in PrintInfo einstellen möchtest.

    Der folgende Code in Objektive-C funktioniert bei mir, wobei ich jetzt nicht getestet habe, ob die eingestellte Fax Nr. dann auch wirklich verwendet wird.

    Quellcode

    1. NSMutableDictionary *printInfoDict = printInfo.dictionary;
    2. [printInfoDict setValue:@"4711" forKey:NSPrintFaxNumber];
  • MCDan schrieb:

    Da dictionary() ein NSMutableDictionary zurück liefert, solltest Du dort jeden beliebigen Key verwenden können.

    Es macht natürlich Sinn bekannte Keys zu verwenden, wenn Du etwas in PrintInfo einstellen möchtest.

    Der folgende Code in Objektive-C funktioniert bei mir, wobei ich jetzt nicht getestet habe, ob die eingestellte Fax Nr. dann auch wirklich verwendet wird.

    Quellcode

    1. NSMutableDictionary *printInfoDict = printInfo.dictionary;
    2. [printInfoDict setValue:@"4711" forKey:NSPrintFaxNumber];
    Hat funktioniert, aber im Druckermenü wird die FAX-Numer nicht angezeigt.


    Tecalto schrieb:

    Nach dem operation.run(), kannst Du nochmals printInfo anzeigen lassen. Da kannst Du schauen, wie die Einstellungen zum Faxen sind. Ist von Drucker zu Drucker unterschiedlich. Bei meinem Xerox läuft es über "XRFaxRecipients" und "com_xerox_printsettings".
    Prima Tipp: Wenn ich im Druckermenü die FAX-Nummer eintrage und mir wie von Dir beschrieben die Settings nochmals ausgeben lasse, erhalte ich nachfolgende Infos:

    "com_apple_print_ticket_type" = "com.apple.print.PrintSettingsTicket";
    faxCoverSheet = False;
    faxCoverSheetMessage = "";
    faxDateLabel = "Date:";
    faxFromLabel = "From:";
    faxPrefix = "";
    faxSheetsLabel = "Sheets to follow:";
    faxSubject = "";
    faxSubjectLabel = "Subject:";
    faxTo = 4711;
    faxToLabel = "To:";
    phone = 4711;

    Nur wie kann ich die FAXNummer nun eintragen, dass diese nach operation.run() im Druckermenü auch angezeigt wird? Mit nachfolgendem Code funktioniert es leider nicht. Sorry, habe gerade einen Knoten in meinen Gedanken. ?(

    Quellcode

    1. let faxSettings = printInfo.printSettings
    2. faxSettings.setValue("4711", forKeyPath: "faxTo")
  • Ich habe es bei mir so gelöst:

    Quellcode

    1. var faxEntries:[[String: String]] = []
    2. for address in fax {
    3. faxEntries.append(["XRFaxRecipientName": address.name, "XRFaxRecipientNumber": address.number])
    4. }
    5. let xerox = ["XRFaxRecipients": faxEntries]
    6. info.printSettings["com_xerox_printsettings"] = xerox
    Wobei info ein NSPrintInfo ist.
  • Tecalto schrieb:

    Ich habe es bei mir so gelöst:

    Quellcode

    1. var faxEntries:[[String: String]] = []
    2. for address in fax {
    3. faxEntries.append(["XRFaxRecipientName": address.name, "XRFaxRecipientNumber": address.number])
    4. }
    5. let xerox = ["XRFaxRecipients": faxEntries]
    6. info.printSettings["com_xerox_printsettings"] = xerox
    Wobei info ein NSPrintInfo ist.
    Entsprechend Deinem obigen Beispiel habe ich meinen Code angepasst. Im Debugger sehe ich auch, dass die Struktur meine hinzugefügten Variablen enthält, aber im geöffnete Druckermenü wird weder meine Faxnummer noch sonstige Einstellungen angepasst.

    Irgendwie fehlt da eine Zwischensequenz/Verknüpfung von der Struktur zum Menü?
  • OSXDev schrieb:

    Tecalto schrieb:

    Ich habe es bei mir so gelöst:

    Quellcode

    1. var faxEntries:[[String: String]] = []
    2. for address in fax {
    3. faxEntries.append(["XRFaxRecipientName": address.name, "XRFaxRecipientNumber": address.number])
    4. }
    5. let xerox = ["XRFaxRecipients": faxEntries]
    6. info.printSettings["com_xerox_printsettings"] = xerox
    Wobei info ein NSPrintInfo ist.
    Entsprechend Deinem obigen Beispiel habe ich meinen Code angepasst. Im Debugger sehe ich auch, dass die Struktur meine hinzugefügten Variablen enthält, aber im geöffnete Druckermenü wird weder meine Faxnummer noch sonstige Einstellungen angepasst.
    Irgendwie fehlt da eine Zwischensequenz/Verknüpfung von der Struktur zum Menü?
    Die Faxinfos sieht du nur wenn der Faxdrucker das auch im PPD hat.
    Bildschirmfoto 2020-07-08 um 13.12.28.png
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • @MCDan:
    Das wäre eine mögliche Erklärung - aber unschön.

    Gibt es ein Quelle/Schaubild oder sonstige Übersicht, welche darstellt, wie welcher Service (NSPrintInfo, NSPrintPanel, NSPrintOperation, NSPrinter, .dictionary() usw.) mit welchem Korrespondiert bzw. wie deren Abarbeitungsreihenfolge aussieht?

    Vielleicht setzt meine Vorgehensweise nicht an der richtigen Quelle an? :/
  • Chris schrieb:

    Die Faxinfos sieht du nur wenn der Faxdrucker das auch im PPD hat.
    Hmmm, dieser Screenshot wird mir so angezeigt. Dies würde bedeuten, dass PPD vorhanden ist. Verstehe ich Dich da richtig?

    Ansonsten würde es keine Möglichkeit geben im Druckerpanel Voreinstellungen zu tätigen, zumindest nicht in OSX 10.10.

    Apple hat CUPS seit OSX 10.10 in eine Sandbox gesteckt. Aber aufgrund von vielen Problem, CUPS jedoch seit OSX 10.11 so geöffnet, dass dies konfigurierbar ist - bis hin zur vollkommenen Abschaltung. Somit müsste es doch eine Möglichkeit geben auch in 10.10 ein Hersteller unabhängiges PPD nach zu installieren.

    Wir setzen hier 10.12 - 10.15 ein und haben bisher keine Erfahrung mit Voreinstellungen in den Druckermenüs. War bisher einfach nicht gefragt. :rolleyes:
  • Es hat mir nun doch keine Ruhe gelassen und dies hat zu folgendem Teilerfolg geführt.

    Quellcode

    1. operationPrintInfo.printSettings["faxPrefix"] = "049"
    Mit obiger Zeile, kann dem Wählpräfix im Druck/FAX-Menü einen Wert zuweisen. Dieser wird auch wie erwartet im Menü (s. Screenshot von Chris) ausgewiesen. Dies deutet daraufhin, dass das PPD eigentlich doch vorhanden ist, oder verwechsle ich da etwas?

    Gibt es eine Möglichkeit gezielt abzufragen, welche Attribute von .printSettings erwartet bzw. gesetzt werden können? Ein erneuter Aufruf von printInfo nach operation.run() zeigt mir zwar Attribute an, jedoch zeigen Änderungen dieser im Menü - mit Ausnahme obiger Codezeile - keine Wirkung. ?(

    Nachtrag:
    Es lassen sich alle Attribute des Menüs steuern, bis auf die Angabe der FAX-Nummer(n) :S .

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag

  • Tecalto schrieb:

    Nach dem operation.run(), kannst Du nochmals printInfo anzeigen lassen. Da kannst Du schauen, wie die Einstellungen zum Faxen sind. Ist von Drucker zu Drucker unterschiedlich. Bei meinem Xerox läuft es über "XRFaxRecipients" und "com_xerox_printsettings".
    Das keine FAX-Nummern im Menü ausgewiesen werden, liegt wahrscheinlich daran, dass entweder die Struktur nicht stimmt oder ich nicht die richtigen Attributsnamen für die Wertzuweisung verwende.

    Bei mir werden bei der Ausgabe von printInfo nach operation.run() keine Attribute (wie z.B.: "XRFaxRecipients" oder "com_xerox_printsettings") ausgewiesen. Was für Möglichkeiten gibt es noch, diese Settings herauszufinden?


    Nachtrag:
    Struktur wurde nun bereinigt und entspricht der nach operation.run() ausgelesenen Struktur von printInfo. Nun kann es eigentlich nur noch an den Attributsnamen liegen. Jemand vielleicht noch eine weitere Idee?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag

  • OSXDev schrieb:

    Tecalto schrieb:

    Nach dem operation.run(), kannst Du nochmals printInfo anzeigen lassen. Da kannst Du schauen, wie die Einstellungen zum Faxen sind. Ist von Drucker zu Drucker unterschiedlich. Bei meinem Xerox läuft es über "XRFaxRecipients" und "com_xerox_printsettings".
    Das keine FAX-Nummern im Menü ausgewiesen werden, liegt wahrscheinlich daran, dass entweder die Struktur nicht stimmt oder ich nicht die richtigen Attributsnamen für die Wertzuweisung verwende.
    Bei mir werden bei der Ausgabe von printInfo nach operation.run() keine Attribute (wie z.B.: "XRFaxRecipients" oder "com_xerox_printsettings") ausgewiesen. Was für Möglichkeiten gibt es noch, diese Settings herauszufinden?


    Nachtrag:
    Struktur wurde nun bereinigt und entspricht der nach operation.run() ausgelesenen Struktur von printInfo. Nun kann es eigentlich nur noch an den Attributsnamen liegen. Jemand vielleicht noch eine weitere Idee?
    Der Key ist NSPrintFaxNumber aus NSPrintInfo.h oder in Swift static let faxNumber: AttributeKey
    Bei meinen Tests wurde auch nie die Faxnummer angezeigt. Wenn ich jedoch operation.showsPrintPanel = NO; einfüge wird der Druck sofort angestossen und die Faxnummer kommt im Treiber an. Scheint mir ein Fehler im Panel zu sein.
    Wenn ich am Wochenende dazu komme werde ich mal ein Accessory bauen und von dort aus die Faxnummer auslesen und wieder setzen,
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Chris schrieb:

    Der Key ist NSPrintFaxNumber aus NSPrintInfo.h oder in Swift static let faxNumber: AttributeKeyBei meinen Tests wurde auch nie die Faxnummer angezeigt. Wenn ich jedoch operation.showsPrintPanel = NO; einfüge wird der Druck sofort angestossen und die Faxnummer kommt im Treiber an. Scheint mir ein Fehler im Panel zu sein.
    Wenn ich am Wochenende dazu komme werde ich mal ein Accessory bauen und von dort aus die Faxnummer auslesen und wieder setzen,
    Werde Deinen Tipp mit dem Operation.showsPrintPanel = NO einfügen und gleich mal testen. Schon jetzt mal ein großes Dankeschön, dass Du Dir dies mal genauer ansiehst. :thumbsup:
  • Also, warum das FAX-Menü die übergebene FAX-Nummer nicht anzeigt, bleibt mir immer noch ein Rätsel.

    Jedoch kann ich nun ausschließen, dass es an der von mir verwendeten Variablen liegt. Der Debugger zeigt mir, dass meine Struktur bitgenau der Struktur entspricht, welche nach betätigen des FAX-Sende-Buttons, im Speicher vorzufinden ist.

    @Chris: Hast Du etwas Zeit aufbringen können und evtl. bereits etwas mehr herausgefunden?