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

  • Libreria FPDF
  • Libreria FPDI
  • Un account Expedy Print attivo
  • API ExpedyPrint V2

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.