PDFBox печать с помощью инструмента командной строки PrintPDF
Я использую API DHL Shipping (XML), чтобы запрашивать посылки DHL и автоматически распечатывать ответную этикетку.
Вот как работает система:
XML-ответ DHL содержит PDF-файл в кодировке base64, содержащий:
Страница 1. Транспортная этикетка (печать на наклейке на упаковке)
Страница 2. Архивный документ (необходимо распечатать отдельно и передать курьеру)
Чтобы разделить два файла PDF, я сначала декодирую base64, затем выполняю PDFSplit с использованием инструментов командной строки PDFBox и, наконец, печатаю каждый соответствующий документ на соответствующем принтере:
$filename = "dhlexpress_labels/".date("Ymd_his")."_{$_REQUEST['id']}.pdf";
//Get the pdf response from DHL
$data = file_get_contents("path/dhl_request_shipment.php?".http_build_query($_REQUEST));
//Put decoded data in the file
file_put_contents($filename,base64_decode($data));
//Split the file into two
$exec = 'java pdfbox-app-1.8.3.jar PDFSplit -split 1 ' . $filename;
exec($exec);
//Print each file
$exec = 'java pdfbox-app-1.8.3.jar PrintPDF -silentPrint -printerName DHLPrinter ' . str_replace('.pdf',-0.'.pdf',$filename);
exec($exec);
$exec = 'java pdfbox-app-1.8.3.jar PrintPDF -silentPrint -printerName PaperPrinter ' . str_replace('.pdf',-1.'.pdf',$filename);
exec($exec);
Проблема заключается в следующем: ответ от DHL содержит PDF-файл с размерами стикера 8x4 дюйма, который отлично печатается на DHLPrinter
, но на PaperPrinter
он не печатает левую и верхнюю 5 мм этикетки. Смотрите прикрепленную картинку:
Я думаю, это происходит потому, что поля каким-то образом перекрываются полями, что приводит к тому, что PDF выходит за пределы области печати.
Кто-нибудь знает способ исправить это? Я хочу, чтобы печать была полностью автоматизирована и остановилась на этом. Мне просто интересно, есть ли у кого-нибудь креативные идеи о том, как редактировать поля PDF.
1 ответ
Я нашел решение. Используя OverlayPDF, я накладываю архивный документ на пустой PDF, и он отображается посередине примерно так: Центрированная метка
Я только добавил эти две строки кода, и это сработало как шарм:
$exec = java -jar pdfbox-app-2.0.3-20160908.164926-191.jar OverlayPDF blank.pdf '. str_replace('.pdf','-1'.'.pdf',$filename) .' '. str_replace('.pdf','-1'.'.pdf',$filename);
exec($exec);
Я пытался использовать атрибут "Ориентация" PrintPDF
, но на самом деле это сделало его меньше: Ориентация: вертикальная Ориентация: горизонтальная была полностью испорчена. Изображение включено в комментарий ниже.