Je vais vous présenter comment créer une page web pour envoyer un fichier PDF de mon ordinateur vers une imprimante en utilisant le service d’impression à distance Expedy Print.

Dans cet exemple j’utilise une imprimante d’étiquettes (label) pour imprimer des étiquettes de transport adhésives au format standard 4×6 (10x15cm). Par exemple je créé des étiquettes d’un site marchand que je veux transmettre à une imprimante située dans une autre pièce de mon entrepôt, ou bien chez un partenaire dropship à l’autre de bout de la planète.

En même temps on va permettre de saisir dans un champ, un texte pour le générer en PDF, les deux fonctions pourront être utilisées indépendamment ou en même temps.

Le code source complet : https://github.com/ExpedyDev/pdftoprinter

Prérequis matériel

  • Imprimante étiquette (label), dans cet exemple j’utilise une Netum (NT-LP110F), mais vous pouvez utiliser d’autres modèles thermiques 4×6 comme Zebra, Brother, BeePRT ou un autre format (A3,A4,photo carte postale…) selon votre besoin.
  • Adaptateur Cloud Print de Expedy
  • Connexion internet classique

Prérequis web

Aperçu du résultat de la page

apercu du résultat final

1. Création du formulaire

On créé un formulaire pour la saisie du texte et/ou le chargement des fichiers.
Le premier champ permet de générer un PDF à partir d’une saisie texte, et le bouton parcourir pour téléverser un ou plusieurs fichiers PDF.

HTML
<!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. Création PHP

Voici le code PHP complet :

PHP
<?php
	// Si le formulaire est soumis
	if (isset($_POST['submit'])) {
		// Vérifier si le champ texte est rempli
		if (!empty($_POST['text']) || !empty($_FILES['files']['tmp_name'][0])) {
			// Récupérer le texte saisi par l'utilisateur
			$text = $_POST['text'];

			// Générer le nom du fichier PDF avec la date actuelle
			$pdfName = "pdf_" . date('Ymd_His') . ".pdf";

			// Inclure la bibliothèque FPDF et FPDI
			require('fpdf/fpdf.php');
			require('fpdi/src/autoload.php');

			// Créer un objet FPDI (PDF étendu) avec FPDF
			$pdf = new \setasign\Fpdi\Fpdi('P', 'mm', array(105, 148));

			// Gérer les 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)) {
						// Ajouter les pages du fichier PDF au PDF en cours
						$pageCount = $pdf->setSourceFile($file);
						for ($pageNumber = 1; $pageNumber <= $pageCount; $pageNumber++) {
							$tplIdx = $pdf->importPage($pageNumber);
							$pdf->AddPage();
							$pdf->useTemplate($tplIdx);
						}
					}
				}
			}

			// Ajouter une page au PDF si le champ texte est rempli
			if (!empty($text)) {
				$pdf->AddPage();
				$pdf->SetFont('Arial','B',16);
				$pdf->Cell(40, 10, $text);
			}

			// Générer le fichier PDF
			$pdf->Output('F', $pdfName);

			// Envoyer la requête à l'API Expedy pour imprimer le PDF
			$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 API Expedy.com
		$printer_uid = 'SAISIR UID PRINTER';

		// Message à imprimer
		$data = array(
			'usb_msg' => $file_url,
			'origin' => 'Your defined origin tag.. a uri, a name ..'
		);
		// Infos API
		$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",
			// Vos identifiants API sid:token
				"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;
		}


	}
	?>

Je ne vais pas détailler chaque point car les commentaires parlent d’eux mêmes, voici tout de même quelques précisions :

Les librairies FPDF et FPDI sont indispensables pour la génération du PDF et pour la fusion des différents fichiers PDF dans un seul et même fichier PDF.

Cette fusion PDF est importante car il sera plus efficace et rapide pour l’imprimante d’avoir un seul fichier PDF contenant plusieurs pages à traiter, que d’envoyer un seul fichier PDF un par un à l’API.

Texte généré en PDF

Si le champ texte est saisie (facultatif), une première page va s’ajouter au PDF généré. On peut paramétrer ici la typographie du texte imprimé.

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

Dimensions du PDF

Dans cet exemple j’ai besoin d’imprimer des étiquttes de transport, donc on indique des valeurs en mm pour créer un document au format 4×6 (10x15cm). Mais vous pouvez personnaliser les valeurs hauteur largeur pour imprimer sur n’importe quel type de format.

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

UID Printer

Récupérez l’identifiant unique de l’imprimante sur le compte Expedy dans la console dans la section Printers. Ne pas inclure le #. Par exemple GSEPOHGEIO.

PHP
	function sendToExpedyPrinter($file_url) {
		// Printer UID API Expedy.com
		$printer_uid = 'SAISIR UID PRINTER';

Clé API

Récupérez les clés API sur le compte Expedy dans la console dans le menu à gauche section Api Keys.
Saisissez les clés dans cet order : sid:token

PHP
"Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",

Paramétrer port USB

Dans cet exemple c’est le port USB numéro 4 qui est utilisé.
Pour connaitre le port USB, dans la console Expedy, allez dans Machines, puis faîtes un USB SCAN, vous obtiendrez un résultat comme ceci:

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

Tester une impression

Si vous avez bien effectué l’installation, vous devriez avoir un PDF qui sera créé dans votre dossier principal, et un retour de la requête comme ci-dessous.

Attention les fichiers PDF ne sont pas supprimés, ils peuvent donc prendre beaucoup d’espace disque sur votre hébergement.