Enviar um PDF do computador para uma impressora remota
Neste tutorial, mostro como criar uma página web que envie um arquivo PDF do seu computador para uma impressora remota através do serviço Expedy Print.
O exemplo utiliza uma impressora de etiquetas para imprimir etiquetas de envio adesivas no formato padrão 4×6 (10×15 cm) — por exemplo, etiquetas geradas por uma loja online, a enviar para uma impressora noutra área do armazém ou para um parceiro de dropshipping do outro lado do mundo.
O formulário inclui também um campo de texto para gerar um PDF diretamente. As duas funções (carregamento de ficheiros e texto para PDF) podem ser utilizadas de forma independente ou em conjunto.
Código fonte completo: github.com/ExpedyDev/pdftoprinter
Requisitos
Hardware
- Uma impressora térmica (este exemplo utiliza uma Netum NT-LP110F, mas os modelos Zebra, Brother, BeePRT e outros são compatíveis, incluindo os formatos A3/A4/foto)
- Um adaptador Expedy Cloud Print
- Uma ligação à internet standard
Web
1. Criação do formulário HTML
O formulário inclui dois campos:
- Um campo de texto para gerar um PDF diretamente
- Um seletor de ficheiros para carregar um ou vários ficheiros PDF existentes
<!DOCTYPE html>
<html>
<head>
<title>Criar um PDF e imprimir</title>
</head>
<body>
<h1>Criar um PDF e imprimir</h1>
<form method="post" action="" enctype="multipart/form-data">
<label for="text">Introduza o texto a imprimir como PDF:</label><br>
<input type="text" id="text" name="text"><br><br>
<label for="files">Carregar ficheiros 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
Aqui está o código PHP completo com os comentários 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));
// Fusão dos ficheiros PDF carregados
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);
}
}
}
}
// Adicionar uma página a partir do 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>Os seus ficheiros foram enviados para a impressora!</p>";
} else {
echo "<p>Nenhum texto ou ficheiro PDF especificado.</p>";
}
}
function sendToExpedyPrinter($file_url) {
$printer_uid = 'INTRODUZIR_UID_IMPRESSORA';
$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;
}
}
?>
Pontos-chave
Bibliotecas FPDF e FPDI
Ambas as bibliotecas são necessárias: FPDF trata da geração do PDF, enquanto FPDI funde vários ficheiros num único documento. Este passo de fusão é importante — é mais eficiente para a impressora receber um único PDF com várias páginas do que vários ficheiros separados enviados um a um para a API.
Formatação do texto gerado
Se o campo de texto estiver preenchido, uma página adicional é adicionada ao PDF gerado. O tipo de letra pode ser personalizado aqui:
$pdf->SetFont('Arial', 'B', 16);
Dimensões do PDF
Este exemplo utiliza o formato 4×6 (105×148 mm) para etiquetas de envio. A largura e a altura podem ser ajustadas para qualquer formato de papel:
$pdf = new \setasign\Fpdi\Fpdi('P', 'mm', array(105, 148));
UID da impressora
Obtenha o identificador único da sua impressora na consola Expedy, secção Printers. Não incluir o #. Exemplo: GSEPOHGEIO.
$printer_uid = 'INTRODUZIR_UID_IMPRESSORA';
Chaves API
Disponíveis na consola Expedy, menu API Keys. Formato: sid:token.
"Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
Porta USB
Neste exemplo, a impressora está ligada à porta USB número 4. Para identificar a porta correta, aceda à consola Expedy > Machines > USB SCAN.
CURLOPT_URL => "https://www.expedy.fr/api/v2/devices/" . $printer_uid . "/usb/4/print",
Testar uma impressão
Se tudo estiver configurado corretamente, será criado um ficheiro PDF na sua pasta raiz e a API devolverá uma resposta de confirmação.
⚠️ Atenção: os ficheiros PDF gerados não são eliminados automaticamente. Com o tempo, podem ocupar um espaço considerável no disco do seu servidor de alojamento.