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
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.