Imprimer un PDF depuis son ordinateur vers une imprimante à distance

Dans ce tutoriel, je vous montre comment créer une page web permettant d'envoyer un fichier PDF depuis votre ordinateur vers une imprimante à distance via le service Expedy Print.

L'exemple utilise une imprimante d'étiquettes pour imprimer des étiquettes de transport adhésives au format standard 4×6 (10×15 cm) — par exemple, des étiquettes générées depuis un site marchand, à transmettre à une imprimante dans un autre couloir de l'entrepôt, ou chez un partenaire dropship à l'autre bout du monde.

En complément, le formulaire permet aussi de saisir un texte pour le convertir en PDF. Les deux fonctions (upload de fichiers et génération depuis texte) peuvent être utilisées indépendamment ou conjointement.

Code source complet : github.com/ExpedyDev/pdftoprinter


Prérequis

Matériel

  • Une imprimante thermique (cet exemple utilise une Netum NT-LP110F, mais les modèles Zebra, Brother, BeePRT et autres formats A3/A4/photo sont compatibles)

  • Un adaptateur Cloud Print Expedy

  • Une connexion internet standard

Côté web

  • Librairie FPDF

  • Librairie FPDI

  • Un compte actif Expedy Print

  • API ExpedyPrint V2


1. Création du formulaire HTML

Le formulaire propose deux champs :

  • Un champ texte pour générer un PDF à la volée

  • Un sélecteur de fichiers pour téléverser un ou plusieurs PDF existants

<!DOCTYPE html>
<html>
<head>
  <title>Créer un PDF et imprimer</title>
</head>
<body>
  <h1>Créer un PDF et imprimer</h1>
  <form method="post" action="" enctype="multipart/form-data">
    <label for="text">Saisissez le texte à imprimer en PDF :</label><br>
    <input type="text" id="text" name="text"><br><br>

    <label for="files">Envoyer des fichiers PDF :</label><br>
    <input type="file" id="files" name="files[]" multiple><br><br>

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

2. Code PHP

Voici le code PHP complet, avec les commentaires intégrés :

<?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));

        // Fusion des fichiers PDF téléversés
        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);
                    }
                }
            }
        }

        // Ajout d'une page depuis le champ texte
        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>Vos fichiers ont été envoyés à l'imprimante !</p>";

    } else {
        echo "<p>Aucun texte ou fichier PDF spécifié.</p>";
    }
}

function sendToExpedyPrinter($file_url) {

    $printer_uid = 'SAISIR_UID_PRINTER';

    $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;
    }
}
?>

Points clés

Librairies FPDF et FPDI

Ces deux librairies sont indispensables : FPDF pour la génération du PDF, FPDI pour fusionner plusieurs fichiers en un seul document. Cette fusion est importante — il est plus efficace pour l'imprimante de recevoir un seul fichier PDF multipages que plusieurs fichiers distincts envoyés séparément à l'API.

Typographie du texte généré

Si le champ texte est renseigné, une page supplémentaire est ajoutée au PDF. La police peut être personnalisée ici :

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

Format du PDF

L'exemple utilise le format 4×6 (105×148 mm) pour les étiquettes de transport. Ces dimensions sont personnalisables selon votre format d'impression :

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

UID de l'imprimante

Récupérez l'identifiant unique de votre imprimante dans la console Expedy, section Printers. Ne pas inclure le #. Exemple : GSEPOHGEIO.

$printer_uid = 'SAISIR_UID_PRINTER';

Clés API

Disponibles dans la console Expedy, menu API Keys. Format : sid:token.

"Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",

Port USB

Dans cet exemple, l'imprimante est connectée sur le port USB n°4. Pour identifier le bon port, rendez-vous dans la console Expedy > Machines > USB SCAN.

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

Tester une impression

Si l'installation est correcte, un fichier PDF est créé dans votre dossier racine et l'API retourne une réponse de confirmation.

⚠️ Attention : les fichiers PDF générés ne sont pas supprimés automatiquement. Ils peuvent occuper un espace disque significatif sur votre hébergement au fil du temps.