Inviare un PDF dal proprio computer a una stampante remota
In questo tutorial mostro come creare una pagina web che invii un file PDF dal proprio computer a una stampante remota tramite il servizio Expedy Print.
L'esempio utilizza una stampante di etichette per stampare etichette di spedizione adesive nel formato standard 4×6 (10×15 cm) — ad esempio etichette generate da un negozio online, da inviare a una stampante in un'altra area del magazzino o presso un partner di dropshipping dall'altra parte del mondo.
Il modulo include anche un campo di testo per generare un PDF al volo. Entrambe le funzioni (caricamento di file e testo in PDF) possono essere utilizzate indipendentemente o insieme.
Codice sorgente completo: github.com/ExpedyDev/pdftoprinter
Requisiti
Hardware
- Una stampante termica (questo esempio utilizza una Netum NT-LP110F, ma sono compatibili anche i modelli Zebra, Brother, BeePRT e altri, inclusi i formati A3/A4/foto)
- Un adattatore Expedy Cloud Print
- Una connessione internet standard
Web
1. Creazione del modulo HTML
Il modulo include due campi:
- Un campo di testo per generare un PDF al volo
- Un selettore di file per caricare uno o più file PDF esistenti
<!DOCTYPE html>
<html>
<head>
<title>Crea un PDF e stampa</title>
</head>
<body>
<h1>Crea un PDF e stampa</h1>
<form method="post" action="" enctype="multipart/form-data">
<label for="text">Inserisci il testo da stampare come PDF:</label><br>
<input type="text" id="text" name="text"><br><br>
<label for="files">Carica file PDF:</label><br>
<input type="file" id="files" name="files[]" multiple><br><br>
<button type="submit" name="submit">Stampa</button>
</form>
</body>
</html>
2. Codice PHP
Ecco il codice PHP completo con i commenti integrati:
<?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');
// Formato 4×6 (105×148 mm)
$pdf = new \setasign\Fpdi\Fpdi('P', 'mm', array(105, 148));
// Unione dei file PDF caricati
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);
}
}
}
}
// Aggiunta di una pagina dal campo di testo
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>I tuoi file sono stati inviati alla stampante!</p>";
} else {
echo "<p>Nessun testo o file PDF specificato.</p>";
}
}
function sendToExpedyPrinter($file_url) {
$printer_uid = 'INSERIRE_UID_STAMPANTE';
$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;
}
}
?>
Punti chiave
Librerie FPDF e FPDI
Entrambe le librerie sono necessarie: FPDF gestisce la generazione del PDF, mentre FPDI unisce più file in un unico documento. Questo passaggio di unione è importante — è più efficiente per la stampante ricevere un singolo PDF multipagina piuttosto che più file separati inviati uno ad uno all'API.
Formattazione del testo generato
Se il campo di testo è compilato, al PDF generato viene aggiunta una pagina supplementare. Il carattere può essere personalizzato qui:
$pdf->SetFont('Arial', 'B', 16);
Dimensioni del PDF
Questo esempio utilizza il formato 4×6 (105×148 mm) per le etichette di spedizione. Larghezza e altezza possono essere adattate a qualsiasi formato di carta:
$pdf = new \setasign\Fpdi\Fpdi('P', 'mm', array(105, 148));
UID della stampante
Recupera l'identificatore univoco della tua stampante dalla console Expedy, sezione Printers. Non includere il #. Esempio: GSEPOHGEIO.
$printer_uid = 'INSERIRE_UID_STAMPANTE';
Chiavi API
Disponibili nella console Expedy, menu API Keys. Formato: sid:token.
"Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
Porta USB
In questo esempio, la stampante è collegata alla porta USB numero 4. Per identificare la porta corretta, vai nella console Expedy > Machines > USB SCAN.
CURLOPT_URL => "https://www.expedy.fr/api/v2/devices/" . $printer_uid . "/usb/4/print",
Testare una stampa
Se tutto è configurato correttamente, nella cartella principale verrà creato un file PDF e l'API restituirà una risposta di conferma.
⚠️ Attenzione: i file PDF generati non vengono eliminati automaticamente. Nel tempo possono occupare uno spazio considerevole sul disco del tuo server di hosting.