# Inhalt auf einen Lesegerät drucken Drucken Sie Inhalte auf dem integrierten Drucker eines Lesegeräts. Mit Stripe Terminal können Sie benutzerdefinierte Inhalte wie Belege, Tickets oder andere Dokumente direkt auf dem integrierten Drucker eines Lesegeräts drucken. Diese Funktion ist nur für das Lesegerät [Verifone V660p](https://stripe.com/terminal/v660p) verfügbar, das mit einem integrierten Thermodrucker ausgestattet ist, der in Schwarzweiß drucken kann. ## Erstellung von Druckinhalten Ihre Integration ist dafür verantwortlich, die Inhalte zu generieren, die als Bilddatei gedruckt werden sollen. Bilder sind das einzige Format, das wir zum Drucken unterstützen. Wenn Sie ein Bild haben, konvertieren Sie es in die systemeigene Bilddarstellung für Ihren Integrationstyp (z. B. eine Bilddatei für servergestützte Anwendungen oder eine [Bitmap](https://developer.android.com/reference/kotlin/android/graphics/Bitmap.html) für Android). ### Richtlinien für Inhalte Um optimale Ergebnisse zu erzielen, empfehlen wir Bilder, auf die Folgendes zutrifft: - Maximal 384 Pixel breit - Schwarz und weiß (keine Farbe) - Der dünnste Teil eines Zeichens oder einer Zeile muss mindestens 2 Pixel breit sein, damit der Druck klar und lesbar ist > Sie sind rechtlich verantwortlich für alle Inhalte, die Stripe zum Drucken mit Lesegeräten übermittelt werden, und müssen sicherstellen, dass Ihre Belege den geltenden Gesetzen entsprechen. Es ist Ihnen untersagt, Belege zu drucken, die Materialien enthalten, die (i) die Rechte Dritter verletzen, (ii) gegen geltendes Recht verstoßen oder (iii) anstößige, beleidigende, täuschende, ungenaue oder schädliche Inhalte enthalten. ## Drucken von Inhalten #### Servergestützt - [print_content](https://docs.stripe.com/api/terminal/readers/print_content.md) Um Inhalte auf einem Lesegerät zu drucken, rufen Sie den Endpoint [print_content](https://docs.stripe.com/api/terminal/readers/print_content.md) auf. Senden Sie einen `multipart/form-data`-Text mit Ihrer PNG- oder JPEG-Bilddatei. Die hochgeladene Datei darf nicht größer als 100 KB sein. ```curl curl https://files.stripe.com/v1/terminal/readers/tmr_FDOt2wlRZEdpd7/print_content \ -u "<>:" \ -F type=image \ -F "image=@/path/to/a/image.png" ``` > Dieser Endpoint befindet sich in der Subdomain `files.stripe.com` anstelle von `api.stripe.com`. #### Android - [drucken (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/print.html) Um Inhalte mit dem Android SDK zu drucken, übergeben Sie eine Instanz der nativen [Bitmap](https://developer.android.com/reference/kotlin/android/graphics/Bitmap.html)-Klasse als `PrintContent` an die [print](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/print.html)-Methode. #### Kotlin ```kotlin val bitmap = createBitmap(384, /* some height */ ) // A width of 384 pixels is recommended // Generate print content here val printContent = PrintContent.Bitmap.create(bitmap) Terminal.getInstance().print( printContent, object : Callback { override fun onSuccess() { // Placeholder for handling successful operation } override fun onFailure(e: TerminalException) { // Placeholder for handling exception } } ) ``` #### iOS - [Drucken (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)print:completion:) Um Inhalte mit dem iOS SDK zu drucken, übergeben Sie eine Instanz der nativen Klasse [UIImage](https://developer.apple.com/documentation/uikit/uiimage) an die Methode [print](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)print:completion:). #### Swift ```swift let image = UIImage(named: "receipt") // Generate print content here let content = try PrintContentBuilder(image: image).build() Terminal.shared.print(content) { (error) in // Check for errors } ``` #### JavaScript - [print (JavaScript)](https://docs.stripe.com/terminal/references/api/js-sdk.md#print) Um Inhalte mit dem JavaScript SDK zu drucken, übergeben Sie ein natives [HTMLCanvasElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement)-Objekt an die [print](https://docs.stripe.com/terminal/references/api/js-sdk.md#print)-Methode. #### JavaScript ```javascript const canvas = document.createElement('canvas'); canvas.width = 384; canvas.height = /* some height */; // Generate print content here const result = await terminal.print(canvas); if ('error' in result) { // Placeholder for handling exception } else { // Placeholder for handling successful operation } ``` #### React Native - [print (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#print) Um Inhalte mit dem React Native SDK zu drucken, übergeben Sie ein Bild, das als base64-Zeichenfolge oder `data:`-URI-Schema codiert ist, an die [print](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#print)-Methode. #### TypeScript ```typescript const { print } = useStripeTerminal(); // JPEG/PNG image encoded as a base64 string const imageUri = "iVBORw0KGgoAAAANSUhEUgAAAAcAAAAFCAYAAACJmvbYAAAAN0lEQVR4AUyLCQ4AQATExv7/z1YniERd5UnKgriVPpGIS9QAGsll7Rz0YMkV2HRijvns3RY+8wMAAP//S2WPFgAAAAZJREFUAwBWNAoHH+0LdQAAAABJRU5ErkJggg=="; const { error } = await print(imageUri); if (error) { // Placeholder for handling exception } else { // Placeholder for handling successful operation } ``` ## Verarbeiten Sie das Druckergebnis #### Servergestützt Der Endpoint [print_content](https://docs.stripe.com/api/terminal/readers/print_content.md) antwortet mit einem aktualisierten [Lesegerät](https://docs.stripe.com/api/terminal/readers/object.md)-Objekt, wenn der Druckbefehl erfolgreich an das Lesegerät gesendet wurde. Sehen Sie sich die folgende Beispielantwort an: ```json { "id": "tmr_FDOt2wlRZEdpd7", "object": "terminal.reader", "action": { "failure_code": null, "failure_message": null, "print_content": { "image": { "created_at": 1748971913, "filename": "image.png", "size": 15864, "type": "png" }, "type": "image" }, "status": "in_progress", "type": "print_content" }, "device_sw_version": "2.37.2.0", "device_type": "verifone_v660p", "ip_address": "0.0.0.0", "label": "Blue Rabbit", "last_seen_at": 1695166525506, "livemode": false, "location": "tml_FDOtHwxAAdIJOh", "metadata": {}, "serial_number": "452-406-028", "status": "online" } ``` Das Objekt `action` zeigt an, dass eine `print_content`-Aktion `in_progress` ist. Das Objekt `print_content` enthält Informationen über das zu druckende Bild. Der Endpoint antwortet auf einen Validierungsfehler (z. B. Datei zu groß oder nicht unterstütztes Format) sofort mit einem `400`-Statuscode und einer Textausgabe, wie der folgenden: ```json { "error": { "message": "The file you uploaded was too large. Please upload a file smaller than 100 KB", "param": "image", "request_log_url": "https://dashboard.stripe.com/...", "type": "invalid_request_error" } } ``` #### Webhook-Ereignisse Wenn der Druckvorgang abgeschlossen ist (entweder erfolgreich oder mit einem Fehler), sendet Stripe eine Anfrage an Ihren [Webhook-Endpoint](https://docs.stripe.com/webhooks.md). Stripe sendet zwei Webhook-Ereignisse, um Ihr Backend über das Ergebnis des Druckbefehls zu informieren: - `terminal.reader.action_succeeded`: Der Druckbefehl war erfolgreich. - `terminal.reader.action_failed`: Der Druckbefehl ist fehlgeschlagen. Der Drucker hatte zum Beispiel kein Papier mehr oder hat sich während des Druckens gestaut. Die Webhook-Nutzlast enthält ein [Ereignisobjekt](https://docs.stripe.com/api/events/object.md), wobei `data.object` ein aktualisiertes [Lesegerät](https://docs.stripe.com/api/terminal/readers/object.md)-Objekt ist. ##### Das Ereignis `terminal.reader.action_succeeded` Bei einem Ereignis `terminal.reader.action_succeeded` sieht das Objekt `data` wie folgt aus: ```json { "object": { "id": "tmr_FDOt2wlRZEdpd7", "object": "terminal.reader", "action": { "failure_code": null, "failure_message": null, "print_content": { "image": { "created_at": 1748971913, "filename": "image.png", "size": 15864, "type": "png" }, "type": "image" }, "status": "succeeded", "type": "print_content" }, "device_deploy_group": "", "device_sw_version": "2.34.0.0", "device_type": "verifone_v660p", "ip_address": "10.244.38.93", "label": "test", "livemode": false, "location": "tml_GEPlmAJnZUoXI6", "metadata": {}, "serial_number": "452-406-028", "software": null, "status": "online" }, "previous_attributes": null } ``` Der `action.status` wird auf `succeeded` gesetzt. Der `action.failure_code` und die `action.failure_message` sind in diesem Fall beide `null`. ##### Das Ereignis `terminal.reader.action_failed` Bei einem Ereignis`terminal.reader.action_failed` sieht das Objekt `data` wie folgt aus: ```json { "object": { "id": "tmr_FDOt2wlRZEdpd7", "object": "terminal.reader", "action": { "failure_code": "reason_out_of_paper", "failure_message": "The printer is out of paper.", "print_content": { "image": { "created_at": 1748971913, "filename": "image.png", "size": 15864, "type": "png" }, "type": "image" }, "status": "failed", "type": "print_content" }, "device_deploy_group": "", "device_sw_version": "2.34.0.0", "device_type": "verifone_v660p", "ip_address": "10.244.35.107", "label": "test", "livemode": false, "location": "tml_GEPlmAJnZUoXI6", "metadata": {}, "serial_number": "452-406-028", "software": null, "status": "online" }, "previous_attributes": null } ``` Der `action.status` wird auf `failed` gesetzt. Das Feld `failure_code` enthält den Grund für den Fehler und das Feld `failure_message` enthält eine von Menschen lesbare Nachricht, die den Fehler beschreibt. Die möglichen Werte für das Feld `failure_code` sind: | Fehlerbeschreibung | Fehlercode | | ------------------------------------------------------------------------ | ---------------------- | | Der Drucker druckt gerade. | `printer_busy` | | Die Papierrolle des Druckers hat sich gestaut. | `printer_paperjam` | | Der Drucker hat kein Papier mehr. | `printer_out_of_paper` | | Die Abdeckung des Druckers oder die Kopfeinheit ist geöffnet. | `printer_cover_open` | | Allgemeiner Fehler beim Drucken (Auffanglösung für alle anderen Fehler). | `printer_failure` | Wenn das Lesegerät das Drucken nicht unterstützt, wird der `failure_code` auf `printer_not_supported` gesetzt und der Fehler kehrt unmittelbar nach dem Aufruf des Endpoints [print_content](https://docs.stripe.com/api/terminal/readers/print_content.md) zurück. Ein Ereignis `terminal.reader.action_failed` wird nicht gesendet. #### Android Nachdem der Druckbefehl abgeschlossen ist, ruft das Android SDK entweder die Funktion `onSuccess` oder `onFailure` des [`Callback`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.callable/-callback/index.html)-Objekts auf. Im Falle eines Druckfehlers wird die Funktion `onFailure` mit einem [`TerminalException`](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-terminal-exception/index.html)-Objekt mit einem der folgenden `TerminalErrorCode`-Werte aufgerufen: - `PRINTER_BUSY` - `PRINTER_PAPERJAM` - `PRINTER_OUT_OF_PAPER` - `PRINTER_COVER_OPEN` - `PRINTER_ABSENT` - `PRINTER_UNAVAILABLE` - `PRINTER_ERROR` Erfahren Sie mehr über diese Fehlercodes in der [`TerminalErrorCode`-Referenz](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-terminal-error-code/index.html#-556602182%2FClasslikes%2F-1219334616). #### iOS Nachdem der Druckbefehl abgeschlossen ist, ruft das iOS SDK den bereitgestellten Block `completion` auf. Bei Erfolg wird der Block mit `nil` aufgerufen. Bei einem Fehlschlag des Druckvorgangs wird der Block mit einem `NSError`-Objekt mit einem der folgenden `SCPError`-Codes aufgerufen: | Objective-C | Swift | | -------------------- | -------------------- | | `PrinterBusy` | `printerBusy` | | `PrinterPaperJam` | `printerPaperJam` | | `PrinterOutOfPaper` | `printerOutOfPaper` | | `PrinterCoverOpen` | `printerCoverOpen` | | `PrinterAbsent` | `printerAbsent` | | `PrinterUnavailable` | `printerUnavailable` | | `PrinterError` | `printerError` | Erfahren Sie mehr über diese Fehlercodes in der [`SCPError`-Referenz](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPError.html#/c:@E@SCPError@SCPErrorPrinterBusy). #### JavaScript Die [Druck](https://docs.stripe.com/terminal/references/api/js-sdk.md#print)-Methode gibt ein `Promise` zurück, das bei erfolgreichem Druckbefehl in ein leeres Objekt aufgelöst wird. Wenn der Befehl fehlschlägt, wird das `Promise` zu einem Objekt mit einem `error`-Feld aufgelöst. Das `error`-Objekt enthält einen Fehler-`code` sowie eine für Menschen lesbare `message`. Die möglichen Werte für das Feld `code` sind: - `printer_busy` - `printer_paperjam` - `printer_cover_open` - `printer_out_of_paper` - `printer_absent` - `printer_unavailable` - `printer_error` Siehe [Referenz zu Fehlercodes](https://docs.stripe.com/terminal/references/api/js-sdk.md#error-codes). #### React Native Die [Druck](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#print)-Methode gibt ein `Promise` zurück, das bei erfolgreichem Druckbefehl in ein leeres Objekt aufgelöst wird. Wenn der Befehl fehlschlägt, wird das `Promise` in ein Objekt mit einem `Error`-Feld aufgelöst. Der Wert von `error` ist ein [StripeError](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeError.html)-Objekt, das einen bestimmten [Fehler-Code](https://stripe.dev/stripe-terminal-react-native/api-reference/types/ErrorCode.html), eine menschenlesbare `message` sowie zusätzliche Details wie `apiError` und `underlyingError` enthält.