Печать 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-файл размером с наклейку 8 x 4 дюйма, который отлично печатается на DHLPrinter, но на PaperPrinter не печатаются левые и верхние 5 мм этикетки. Смотрите прикрепленную картинку:

Поля не напечатаны

Я думаю, это происходит из-за того, что поля каким-то образом перекрываются PDF-файлом, что приводит к перемещению PDF-файла за пределы области печати.

Кто-нибудь знает способ исправить это? Я хочу, чтобы печать была полностью автоматизирована, и ни перед чем не остановлюсь. Мне просто интересно, есть ли у кого-нибудь творческие идеи о том, как редактировать поля PDF.


person Peter Huson    schedule 12.09.2016    source источник
comment
Попробуйте версию 2.0.2. И снимок 2.0.3 repository.apache.org/content/groups/snapshots/org/apache/ есть новый вариант, который может помочь.   -  person Tilman Hausherr    schedule 12.09.2016
comment
Если это не работает, пожалуйста, загрузите демонстрационную наклейку.   -  person Tilman Hausherr    schedule 12.09.2016
comment
Спасибо @TilmanHausherr. Я использовал снимок 2.0.3. Был ли вариант «ориентации» тем, о котором вы говорили?   -  person Peter Huson    schedule 13.09.2016
comment
Да. Однако вертикального варианта нет. Есть портрет и пейзаж.   -  person Tilman Hausherr    schedule 13.09.2016


Ответы (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, но на самом деле он стал меньше: Ориентация: вертикальная Ориентация: горизонтальная была полностью перепутана. Изображение включено в комментарий ниже.

person Peter Huson    schedule 13.09.2016
comment
PDFBox имеет проблемы с печатью этикеток, например. issues.apache.org/jira/browse/PDFBOX-3117 . В этом даже упоминается обходной путь, но для этого потребуется использовать java. - person Tilman Hausherr; 13.09.2016