Vou mostrar-te como criar uma página Web para enviar um ficheiro PDF do meu computador para uma impressora utilizando o serviço de impressão remota Expedy Print.

Neste exemplo, estou a utilizar uma impressora de etiquetas para imprimir etiquetas de transporte autocolantes no formato padrão 4×6 (10x15cm). Por exemplo, estou a criar etiquetas para um site de venda a retalho que pretendo enviar para uma impressora localizada noutra sala do meu armazém ou para um parceiro de dropship no outro extremo do planeta.

Ao mesmo tempo, podes introduzir texto num campo para gerar um ficheiro PDF. As duas funções podem ser utilizadas independentemente ou ao mesmo tempo.

Código fonte completo: https: //github.com/ExpedyDev/pdftoprinter

Requisitos de hardware

  • Impressora de etiquetas, neste exemplo estou a usar uma Netum(NT-LP110F), mas podes usar outros modelos térmicos 4×6 como Zebra, Brother, BeePRT ou outro formato (A3, A4, postal fotográfico, etc.) dependendo das tuas necessidades.
  • Expedy Cloud Print Adapter
  • Ligação clássica à Internet

Requisitos da Web

Pré-visualização do resultado da página

pré-visualização do resultado final

1. Criar o formulário

Cria um formulário para introdução de texto e/ou carregamento de ficheiros.
Utiliza o primeiro campo para gerar um PDF a partir da introdução de texto e o botão de pesquisa para carregar um ou mais ficheiros 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. Criação de PHP

Aqui está o código PHP completo:

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


	}
	?>

Não vou entrar em detalhes sobre cada ponto, pois os comentários falam por si, mas aqui estão alguns detalhes:

As bibliotecas FPDF e FPDI são essenciais para a criação de PDF e para a fusão de diferentes ficheiros PDF num único ficheiro PDF.

Esta fusão de PDFs é importante porque será mais rápido e mais eficiente para a impressora ter um único ficheiro PDF contendo várias páginas para processar, do que enviar um único ficheiro PDF, um a um, para a API.

Texto gerado em PDF

Se o campo de texto for introduzido (opcional), será adicionada uma primeira página ao PDF gerado. A tipografia do texto impresso pode ser definida aqui.

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

Dimensões PDF

Neste exemplo, preciso de imprimir algumas etiquetas de transporte, pelo que especificamos valores em mm para criar um documento de formato 4×6 (10x15cm). Mas podes personalizar os valores de altura e largura para imprimir em qualquer tipo de formato.

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

Impressora UID

Recupera o identificador único da impressora da conta Expedy na consola, na secção Impressoras. Não incluas o #. Por exemplo, GSEPOHGEIO.

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

Chave API

Recupera as chaves API na conta Expedy a partir da consola no menu da esquerda na secção Chaves Api.
Introduz as chaves por esta ordem: sid:token

PHP
"Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",

Definições da porta USB

Neste exemplo, é utilizada a porta USB número 4.
Para saber qual é a porta USB, na consola do Expedy, vai a Machines (Máquinas) e depois faz um USB SCAN (Análise de USB), obtendo um resultado como este:

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

Testa uma impressão

Se a instalação tiver sido feita corretamente, deves ter um PDF criado na tua pasta principal e um pedido de devolução, como se mostra abaixo.

Tem em atenção que os ficheiros PDF não são eliminados, pelo que podem ocupar muito espaço em disco no teu alojamento.

Français (Francês) Español (Espanhol) Deutsch (Alemão) Italiano Português