Bondruck aus SwiftUI App

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

  • Bondruck aus SwiftUI App

    Hallo,

    ich suche Informationen oder Tutorials darüber, wie ich aus einer SwittUI App einen Druck auf einem Bondruck initialisiert und wie man das zu druckende designen kann. Irgendwie finde ich zu dem Thema wenig bis nichts. Hat irgendwer hier damit Erfahrungen?

    Danke im voraus.

    Grüße

    Dirk
  • Du willst einfach einen "Druck" starten?

    Dann schau mal nach AirPrint Tutorials / Dingen auf Google.
    Hab mich damit noch nicht intensiver beschäftigt, nur mal ein paar Sachen angeschaut.
    Nach meinen Erfahrungen würdest du ein "Bild" aus deiner Druckvorlage erstellen und das dann per AirPrint an den Drucker schicken.

    Jetzt musst du dazu nur noch wissen wie man das Bild bearbeitet...

    Also - Bild generieren und bearbeiten
    Bearbeitetes Bild per AirPrint verschicken.

    Vielleicht weiß ja aber jemand noch ein paar mehr Dinge dazu - würd mich auch interessieren.
  • Von Prinzip soll kein Druckdialog erscheinen, sondern der Druck völlig autark aus dem Drucker kommen. Konkret:

    Eine Person meldet sich an einem Terminal an und sagt damit "ich bin nun da", was in einer Datenbank gespeichert wird. Meine App prüft die Datenbank nach Check In's und sobald die App einen neuen CheckIn entdeckt, soll ein Bon aus dem Drucker kommen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Qvex23 ()

  • Ich habe nun folgendes zusammen klimpern können aus einem Stackoverflow Beitrag:

    Quellcode

    1. // This is the View I want to print
    2. // Just a 200x200 blue square
    3. let testView = UIView(frame: CGRectMake(0, 0, 200, 200))
    4. testView.backgroundColor = UIColor.blue
    5. let printInfo = UIPrintInfo(dictionary:nil)
    6. printInfo.outputType = UIPrintInfo.OutputType.general
    7. printInfo.jobName = "My Print Job"
    8. // Set up print controller
    9. let printController = UIPrintInteractionController.shared
    10. printController.printInfo = printInfo
    11. // Assign a UIImage version of my UIView as a printing iten
    12. printController.printingItem = testView.toImage()
    13. // Do it
    14. printController.present(from: testView.frame, in: testView, animated: true, completionHandler: nil)
    Alles anzeigen
    Allerdings geht hier der Print Dialog auf, ich bräuchte das aber ohne den Dialog so das es direkt raus kommt auf einem definierten Drucker.

    Wenn hier noch einer eine Idee hätte wäre das klasse!

    Danke im voraus.

    Grüße
    Dirk
  • Qvex23 schrieb:

    Ich habe nun folgendes zusammen klimpern können aus einem Stackoverflow Beitrag:
    Allerdings geht hier der Print Dialog auf, ich bräuchte das aber ohne den Dialog so das es direkt raus kommt auf einem definierten Drucker.
    Etwas Googeln nach "ios print without UIPrintInteractionController" hat ´mich z. B. hierher geführt ... Du musst scheinbar UIPrinterPickerController zu irgendeinem Zeitpunkt präsentieren, um eine Druckerauswahl zu ermöglichen - die Du speichern kannst. Dann kannst Du mit printToPrinter diesen direkt nutzen.

    Ungetestet, nur auf Basis des o. g. Artikels...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Qvex23 schrieb:

    Ich habe nun folgendes zusammen klimpern können aus einem Stackoverflow Beitrag:

    Quellcode

    1. // This is the View I want to print
    2. // Just a 200x200 blue square
    3. let testView = UIView(frame: CGRectMake(0, 0, 200, 200))
    4. testView.backgroundColor = UIColor.blue
    5. let printInfo = UIPrintInfo(dictionary:nil)
    6. printInfo.outputType = UIPrintInfo.OutputType.general
    7. printInfo.jobName = "My Print Job"
    8. // Set up print controller
    9. let printController = UIPrintInteractionController.shared
    10. printController.printInfo = printInfo
    11. // Assign a UIImage version of my UIView as a printing iten
    12. printController.printingItem = testView.toImage()
    13. // Do it
    14. printController.present(from: testView.frame, in: testView, animated: true, completionHandler: nil)
    Alles anzeigen


    Allerdings geht hier der Print Dialog auf, ich bräuchte das aber ohne den Dialog so das es direkt raus kommt auf einem definierten Drucker.

    Wenn hier noch einer eine Idee hätte wäre das klasse!

    Danke im voraus.

    Grüße
    Dirk
    Ich habe gerade kurz gegoogled und lt. meinem Ergebnis, kannst du den Druckdialog ausblenden in dem du

    Quellcode

    1. printControler.present(false, completionHandler: nil)
    verwendest.

    Hier der Link zur Doku.
    developer.apple.com/documentat…ontroller/1618169-present

    Nebenbei habe ich auch ChatGPT mal mit den infos gefüttert...

    Auch hier:

    Quellcode

    1. // Erstelle den UIPrintInteractionController
    2. let printController = UIPrintInteractionController.shared
    3. // Konfiguriere den Druckauftrag
    4. let printInfo = UIPrintInfo(dictionary: nil)
    5. printInfo.outputType = .general
    6. printController.printInfo = printInfo
    7. // Konfiguriere den Druckinhalt
    8. let textToPrint = "Hier ist der Text aus der Datenbank."
    9. let formatter = UIMarkupTextPrintFormatter(markupText: textToPrint)
    10. printController.printFormatter = formatter
    11. // Zeige den Druckdialog nicht an und starte den Druckvorgang automatisch
    12. printController.present(false, completionHandler: nil)
    Alles anzeigen
    Lass mich gerne wissen ob das für dich geklappt hat.
  • ashtari schrieb:

    Qvex23 schrieb:

    Ich habe nun folgendes zusammen klimpern können aus einem Stackoverflow Beitrag:

    Quellcode

    1. // This is the View I want to print
    2. // Just a 200x200 blue square
    3. let testView = UIView(frame: CGRectMake(0, 0, 200, 200))
    4. testView.backgroundColor = UIColor.blue
    5. let printInfo = UIPrintInfo(dictionary:nil)
    6. printInfo.outputType = UIPrintInfo.OutputType.general
    7. printInfo.jobName = "My Print Job"
    8. // Set up print controller
    9. let printController = UIPrintInteractionController.shared
    10. printController.printInfo = printInfo
    11. // Assign a UIImage version of my UIView as a printing iten
    12. printController.printingItem = testView.toImage()
    13. // Do it
    14. printController.present(from: testView.frame, in: testView, animated: true, completionHandler: nil)
    Alles anzeigen


    Allerdings geht hier der Print Dialog auf, ich bräuchte das aber ohne den Dialog so das es direkt raus kommt auf einem definierten Drucker.

    Wenn hier noch einer eine Idee hätte wäre das klasse!

    Danke im voraus.

    Grüße
    Dirk
    Ich habe gerade kurz gegoogled und lt. meinem Ergebnis, kannst du den Druckdialog ausblenden in dem du

    Quellcode

    1. printControler.present(false, completionHandler: nil)
    verwendest.

    Hier der Link zur Doku.
    developer.apple.com/documentat…ontroller/1618169-present

    Nebenbei habe ich auch ChatGPT mal mit den infos gefüttert...

    Auch hier:

    Quellcode

    1. // Erstelle den UIPrintInteractionController
    2. let printController = UIPrintInteractionController.shared
    3. // Konfiguriere den Druckauftrag
    4. let printInfo = UIPrintInfo(dictionary: nil)
    5. printInfo.outputType = .general
    6. printController.printInfo = printInfo
    7. // Konfiguriere den Druckinhalt
    8. let textToPrint = "Hier ist der Text aus der Datenbank."
    9. let formatter = UIMarkupTextPrintFormatter(markupText: textToPrint)
    10. printController.printFormatter = formatter
    11. // Zeige den Druckdialog nicht an und starte den Druckvorgang automatisch
    12. printController.present(false, completionHandler: nil)
    Alles anzeigen
    Lass mich gerne wissen ob das für dich geklappt hat.
    "printController.present(false, completionHandler: nil)" scheint falsch zu sein, XCode will da

    Quellcode

    1. printController.present(animated: false, completionHandler: nil)
    haben.

    Was aber nicht dazu führt das der Drucker Dialog nicht angezeigt wird. Der Dialog wird nur nicht animiert angezeigt.
    Irgendwie hat ChatGPT auch keine Ahnung vom Programmieren, oder?

    MyMattes schrieb:

    Qvex23 schrieb:

    Ich habe nun folgendes zusammen klimpern können aus einem Stackoverflow Beitrag:
    Allerdings geht hier der Print Dialog auf, ich bräuchte das aber ohne den Dialog so das es direkt raus kommt auf einem definierten Drucker.
    Etwas Googeln nach "ios print without UIPrintInteractionController" hat ´mich z. B. hierher geführt ... Du musst scheinbar UIPrinterPickerController zu irgendeinem Zeitpunkt präsentieren, um eine Druckerauswahl zu ermöglichen - die Du speichern kannst. Dann kannst Du mit printToPrinter diesen direkt nutzen.
    Ungetestet, nur auf Basis des o. g. Artikels...

    Mattes

    Danke, das sieht sehr vielversprechend aus. Aber leider ObjC, das muss ich erstmal Übersetzen. Ich werde berichten

    Grüße

    Dirk
  • Ich habe dies gerade in einer App (Check-In App für einen Kongress) verwendet.

    Du kannst vorab in der App einen Drucker auswählen lassen, z.B. so (UIKit)

    Quellcode

    1. let pickerController = UIPrinterPickerController(initiallySelectedPrinter: nil)
    2. pickerController.delegate = self
    3. pickerController.present(animated: true) { (controller, completed, error) in
    4. if completed == true {
    5. if let printer = controller.selectedPrinter {
    6. let printerURL = printer.url
    7. self.printer = printer
    8. UserDefaults.standard.set(printerURL.absoluteString, forKey: "UserDefaultsSelectedPrinter")
    9. }
    10. }
    11. }
    Alles anzeigen
    Den ausgewählten Drucker, bzw. die URL vom Drucker, habe ich dann in den User Defaults gespeichert.

    Der UIPrintInteractionController kann auch direkt ohne Anzeige drucken. Dies sieht dann z.B. so aus (UIKit):

    Quellcode

    1. if let printerURLString = UserDefaults.standard.value(forKey: "UserDefaultsSelectedPrinter") as? String, let printerURL = URL(string: printerURLString) {
    2. let printer = UIPrinter(url: printerURL)
    3. let printerController = UIPrintInteractionController.shared
    4. // define printInfo
    5. let printInfo = UIPrintInfo(dictionary:nil)
    6. printInfo.outputType = .general
    7. printInfo.jobName = "Besucherausweis \(name)"
    8. printerController.printInfo = printInfo
    9. // define printFormatter
    10. printerController.printPageRenderer = YourPageRenderer()
    11. // print
    12. printerController.print(to: printer, completionHandler: { printController, completed, error in
    13. print("completed: \(completed), error: \(error)"
    14. })
    15. }
    Alles anzeigen
  • Wird der UIPrinterPickerController nicht angezeigt?

    Evtl. fehlt dann noch die Delegate Methode (UIKit):

    Quellcode

    1. func printerPickerControllerParentViewController(_ printerPickerController: UIPrinterPickerController) -> UIViewController? {
    2. return self.view.window?.rootViewController
    3. }
    Ich habe jedoch keine Ahnung, wie dies für SwiftUI aussehen müsste. :/

    Edit: Evtl. hilft dies hier weiter: stackoverflow.com/questions/60…nter-picker-using-swiftui

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von MCDan ()

  • Du schreibst Bondruck. Da gehe ich von einem Bon ähnlich wie an der Kasse beim Einkauf aus.
    Die Dinger sind entweder seriell angeschlossen oder im Netzwerk verfügbar.
    Da schickst du einfach Text hin. Gesteuert werden sie mit ESC-Codes für Fett, Courier oder abschneiden. Die meisten können mit den Codes auch millimetergenau positionierender Barcodes ausgeben.
    Doku dazu gibts beim Hersteller.

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

    Du schreibst Bondruck. Da gehe ich von einem Bon ähnlich wie an der Kasse beim Einkauf aus.
    Die Dinger sind entweder seriell angeschlossen oder im Netzwerk verfügbar.
    Da schickst du einfach Text hin. Gesteuert werden sie mit ESC-Codes für Fett, Courier oder abschneiden. Die meisten können mit den Codes auch millimetergenau positionierender Barcodes ausgeben.
    Doku dazu gibts beim Hersteller.

    Chris
    Es geht tatsächlich um einen Bonducker für eine Küche. Du denkst also ich suche gerade in die falsche Richtung und müsste erstmal schauen welchen Drucker ich verwenden will?

    Ich habe ein bisschen gesucht und ich stoße immer wieder auf diesen Druckner: Epson TM-T20III

    Aber irgendwie finde ich keine Angaben wie ich den mit Daten bespaßen kann.

    Grüße

    Dirk

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Qvex23 ()

  • manchmal kommt die Information doch eher unverhofft:

    ....
    The printer will immediately print any regular text it receives over Port 9100, line by line:

    echo "Hello World" | nc 192.168.192.168 9100

    I’ve included a PHP script to produce the ESC/POS commands for the below receipt, showing how to use a few of the supported features:
    [Blockierte Grafik: https://mike42.me/blog/images/2014-10-epson-example-small.jpg]
    And the script which created it:
    <?php/* ASCII constants */const ESC = "\x1b";const GS="\x1d";const NUL="\x00";/* Output an example receipt */echo ESC."@"; // Reset to defaultsecho ESC."E".chr(1); // Boldecho "FOO CORP Ltd.\n"; // Companyecho ESC."E".chr(0); // Not Boldecho ESC."d".chr(1); // Blank lineecho "Receipt for whatever\n"; // Print textecho ESC."d".chr(4); // 4 Blank lines/* Bar-code at the end */echo ESC."a".chr(1); // Centered printingecho GS."k".chr(4)."987654321".NUL; // Print barcodeecho ESC."d".chr(1); // Blank lineecho "987654321\n"; // Print numberecho GS."V\x41".chr(3); // Cutexit(0);
    This would again sent to the printer using netcat:php foo.php | nc 192.168.192.168 9100Good luck!

    Klingt machbar. Muss jetzt also noch rausfinden, wie ich solche Commands mit Swift ins Netzwerk senden kann und mir einen Empfänger auf einer IP auf Port 9100 irgendwo installieren, oder wir kaufen mal testweise so einen Drucker.
  • Hier eine Commandübersicht. download.epson-biz.com/modules…os/index.php?content_id=2
    Die Ansteuerung mache ich mit CocoaAsyncSocket github.com/robbiehanson/CocoaAsyncSocket
    Und immer die Verbindung zu machen wenn du fertig bist, dann musst du dich auch nicht mit seltsamen Phänomen rumärgern.

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

    Ich will ja tatsächlich nur den Socket öffnen und eine Nachricht senden und wieder den Socket zu machen. Sollte nicht zu komplex sein, aber ohne Beispiel Code komme ich da nicht weit.
    Hilft da nicht schon das GDC-Bespiel für den HTTP-Client weiter? Hier findest Du z. B. den GET-Request, der doch nichts anderes darstellt. So viel Code ist es nicht, ich nehme - ganz naiv - einmal an, das man den schnell in Swift portiert hat...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Qvex23 schrieb:

    Leider offenbart sich mir das überhaupt nicht. Da ich die Anwendung in SwiftUI mache weis ich nicht so recht wo ich mit den Delegate Kram hin soll. Gibts da denn nichts leichtgewichtigeres, irgendwas in Swift schon eingebautes?

    Grüße

    Dirk
    Eingebaut ist NWConnection.
    Oder Unix Sockets.
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.