Enviar un PDF desde tu ordenador a una impresora remota
En este tutorial, te muestro cómo crear una página web que envíe un archivo PDF desde tu ordenador a una impresora remota mediante el servicio Expedy Print.
El ejemplo utiliza una impresora de etiquetas para imprimir etiquetas de envío adhesivas en el formato estándar 4×6 (10×15 cm), por ejemplo, etiquetas generadas desde una tienda online, enviadas a una impresora situada en otra zona del almacén o en casa de un socio de dropshipping al otro lado del mundo.
El formulario también incluye un campo de texto para generar un PDF al vuelo. Ambas funciones (carga de archivos y texto a PDF) pueden usarse de forma independiente o conjunta.
Código fuente completo: github.com/ExpedyDev/pdftoprinter
Requisitos
Hardware
- Una impresora térmica (este ejemplo usa una Netum NT-LP110F, pero los modelos Zebra, Brother, BeePRT y otros son compatibles, incluidos los formatos A3/A4/foto)
- Un adaptador Expedy Cloud Print
- Una conexión a internet estándar
Web
1. Creación del formulario HTML
El formulario incluye dos campos:
- Un campo de texto para generar un PDF al vuelo
- Un selector de archivos para subir uno o varios archivos PDF existentes
<!DOCTYPE html>
<html>
<head>
<title>Crear un PDF e imprimir</title>
</head>
<body>
<h1>Crear un PDF e imprimir</h1>
<form method="post" action="" enctype="multipart/form-data">
<label for="text">Introduce el texto a imprimir como PDF:</label><br>
<input type="text" id="text" name="text"><br><br>
<label for="files">Subir archivos PDF:</label><br>
<input type="file" id="files" name="files[]" multiple><br><br>
<button type="submit" name="submit">Imprimir</button>
</form>
</body>
</html>
2. Código PHP
Aquí está el código PHP completo con comentarios integrados:
<?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));
// Fusionar los archivos PDF subidos
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);
}
}
}
}
// Añadir una página desde el campo de texto
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>¡Sus archivos han sido enviados a la impresora!</p>";
} else {
echo "<p>No se ha especificado ningún texto ni archivo PDF.</p>";
}
}
function sendToExpedyPrinter($file_url) {
$printer_uid = 'INTRODUCIR_UID_IMPRESORA';
$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;
}
}
?>
Puntos clave
Librerías FPDF y FPDI
Ambas librerías son necesarias: FPDF se encarga de la generación del PDF, mientras que FPDI fusiona varios archivos en un único documento. Este paso de fusión es importante, es más eficiente para la impresora recibir un solo PDF multipágina que varios archivos separados enviados uno a uno a la API.
Formato del texto generado
Si el campo de texto está relleno, se añade una página adicional al PDF generado. La fuente puede personalizarse aquí:
$pdf->SetFont('Arial', 'B', 16);
Dimensiones del PDF
Este ejemplo utiliza el formato 4×6 (105×148 mm) para etiquetas de envío. El ancho y el alto pueden ajustarse para adaptarse a cualquier formato de papel:
$pdf = new \setasign\Fpdi\Fpdi('P', 'mm', array(105, 148));
UID de la impresora
Obtén el identificador único de tu impresora en la consola Expedy, sección Printers. No incluyas el #. Ejemplo: GSEPOHGEIO.
$printer_uid = 'INTRODUCIR_UID_IMPRESORA';
Claves API
Disponibles en la consola Expedy, menú API Keys. Formato: sid:token.
"Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
Puerto USB
En este ejemplo, la impresora está conectada al puerto USB número 4. Para identificar el puerto correcto, ve a la consola Expedy > Machines > USB SCAN.
CURLOPT_URL => "https://www.expedy.fr/api/v2/devices/" . $printer_uid . "/usb/4/print",
Probar una impresión
Si todo está configurado correctamente, se creará un archivo PDF en tu carpeta raíz y la API devolverá una respuesta de confirmación.
⚠️ Atención: los archivos PDF generados no se eliminan automáticamente. Con el tiempo, pueden ocupar un espacio considerable en el disco de tu servidor de alojamiento.