Eine PDF-Datei vom Computer an einen Remote-Drucker senden

In diesem Tutorial zeige ich dir, wie du eine Webseite erstellst, die eine PDF-Datei von deinem Computer über den Expedy Print-Dienst an einen Remote-Drucker sendet.

Das Beispiel verwendet einen Etikettendrucker, um selbstklebende Versandetiketten im Standardformat 4×6 (10×15 cm) zu drucken — zum Beispiel Etiketten, die von einem Online-Shop generiert wurden und an einen Drucker in einem anderen Bereich des Lagers oder an einen Dropshipping-Partner auf der anderen Seite der Welt gesendet werden sollen.

Das Formular enthält außerdem ein Textfeld, um ein PDF direkt zu generieren. Beide Funktionen (Datei-Upload und Text-zu-PDF) können unabhängig voneinander oder gemeinsam verwendet werden.

Vollständiger Quellcode: github.com/ExpedyDev/pdftoprinter


Voraussetzungen

Hardware

  • Ein Thermodrucker (dieses Beispiel verwendet einen Netum NT-LP110F, aber Zebra, Brother, BeePRT und andere Modelle sind ebenfalls kompatibel, einschließlich A3/A4/Fotoformate)
  • Ein Expedy Cloud Print-Adapter
  • Eine Standard-Internetverbindung

Web

  • Bibliothek FPDF
  • Bibliothek FPDI
  • Ein aktives Expedy Print-Konto
  • ExpedyPrint API V2

1. Erstellung des HTML-Formulars

Das Formular enthält zwei Felder:

  • Ein Textfeld zur spontanen PDF-Generierung
  • Eine Dateiauswahl zum Hochladen einer oder mehrerer vorhandener PDF-Dateien
<!DOCTYPE html>
<html>
<head>
  <title>PDF erstellen und drucken</title>
</head>
<body>
  <h1>PDF erstellen und drucken</h1>
  <form method="post" action="" enctype="multipart/form-data">
    <label for="text">Text zum Drucken als PDF eingeben:</label><br>
    <input type="text" id="text" name="text"><br><br>

    <label for="files">PDF-Dateien hochladen:</label><br>
    <input type="file" id="files" name="files[]" multiple><br><br>

    <button type="submit" name="submit">Drucken</button>
  </form>
</body>
</html>

2. PHP-Code

Hier ist der vollständige PHP-Code mit eingebetteten Kommentaren:

<?php
if (isset($_POST['submit'])) {
    if (!empty($_POST['text']) || !empty($_FILES['files']['tmp_name'][0])) {

        $text    = $_POST['text'];
        $pdfName = "pdf_" . date('Ymd_His') . ".pdf";

        require('fpdf/fpdf.php');
        require('fpdi/src/autoload.php');

        // Format 4×6 (105×148 mm)
        $pdf = new \setasign\Fpdi\Fpdi('P', 'mm', array(105, 148));

        // Hochgeladene PDF-Dateien zusammenführen
        if (!empty($_FILES['files']['tmp_name'][0])) {
            foreach ($_FILES['files']['tmp_name'] as $file) {
                if (!empty($file) && file_exists($file)) {
                    $pageCount = $pdf->setSourceFile($file);
                    for ($pageNumber = 1; $pageNumber <= $pageCount; $pageNumber++) {
                        $tplIdx = $pdf->importPage($pageNumber);
                        $pdf->AddPage();
                        $pdf->useTemplate($tplIdx);
                    }
                }
            }
        }

        // Seite aus dem Textfeld hinzufügen
        if (!empty($text)) {
            $pdf->AddPage();
            $pdf->SetFont('Arial', 'B', 16);
            $pdf->Cell(40, 10, $text);
        }

        $pdf->Output('F', $pdfName);

        $file_url = 'https://' . $_SERVER['HTTP_HOST'] . '/' . $pdfName;
        sendToExpedyPrinter($file_url);

        echo "<p>Ihre Dateien wurden an den Drucker gesendet!</p>";

    } else {
        echo "<p>Kein Text oder keine PDF-Datei angegeben.</p>";
    }
}

function sendToExpedyPrinter($file_url) {

    $printer_uid = 'DRUCKER_UID_EINGEBEN';

    $data = array(
        'usb_msg' => $file_url,
        'origin'  => 'Your defined origin tag.. a uri, a name ..'
    );

    $options = array(
        CURLOPT_URL            => "https://www.expedy.fr/api/v2/devices/" . $printer_uid . "/usb/4/print",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING       => "",
        CURLOPT_MAXREDIRS      => 10,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST  => "POST",
        CURLOPT_POSTFIELDS     => json_encode($data),
        CURLOPT_HTTPHEADER     => array(
            "Accept: application/json",
            "Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "Content-Type: application/json"
        ),
    );

    $curl = curl_init();
    curl_setopt_array($curl, $options);
    $response = curl_exec($curl);
    $err      = curl_error($curl);
    curl_close($curl);

    if ($err) {
        echo "cURL Error #: " . $err;
    } else {
        echo $response;
    }
}
?>

Wichtige Hinweise

Bibliotheken FPDF und FPDI

Beide Bibliotheken sind erforderlich: FPDF übernimmt die PDF-Generierung, während FPDI mehrere Dateien zu einem einzigen Dokument zusammenführt. Dieser Zusammenführungsschritt ist wichtig — es ist für den Drucker effizienter, eine einzige mehrseitige PDF-Datei zu empfangen, als mehrere separate Dateien, die einzeln an die API gesendet werden.

Textformatierung

Wenn das Textfeld ausgefüllt ist, wird dem generierten PDF eine zusätzliche Seite hinzugefügt. Die Schriftart kann hier angepasst werden:

$pdf->SetFont('Arial', 'B', 16);

PDF-Abmessungen

Dieses Beispiel verwendet das Format 4×6 (105×148 mm) für Versandetiketten. Breite und Höhe können an jedes Papierformat angepasst werden:

$pdf = new \setasign\Fpdi\Fpdi('P', 'mm', array(105, 148));

Drucker-UID

Die eindeutige Kennung deines Druckers findest du in der Expedy-Konsole unter Printers. Das #-Zeichen nicht mit angeben. Beispiel: GSEPOHGEIO.

$printer_uid = 'DRUCKER_UID_EINGEBEN';

API-Schlüssel

Diese sind in der Expedy-Konsole unter API Keys verfügbar. Format: sid:token.

"Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",

USB-Port

In diesem Beispiel ist der Drucker an USB-Port 4 angeschlossen. Um den richtigen Port zu ermitteln, gehe in der Expedy-Konsole zu Machines > USB SCAN.

CURLOPT_URL => "https://www.expedy.fr/api/v2/devices/" . $printer_uid . "/usb/4/print",

Einen Druckauftrag testen

Wenn alles korrekt eingerichtet ist, wird eine PDF-Datei in deinem Stammverzeichnis erstellt und die API gibt eine Bestätigungsantwort zurück.

⚠️ Hinweis: Generierte PDF-Dateien werden nicht automatisch gelöscht. Sie können im Laufe der Zeit erheblichen Speicherplatz auf deinem Hosting-Server belegen.