使用PrintPDF命令行工具

时间:2016-09-12 15:39:54

标签: pdf printing base64 pdfbox dhl

我正在使用DHL Shipping(XML)API来请求DHL货件并自动打印已回复的货运标签。

这就是系统的工作方式:

DHL响应XML包含base64编码的pdf,其中包含:

第1页。装运标签(打印在包装上的标签上)

第2页。存档文件(需要单独打印并提供给运输快递)

为了分离两个pdf,我首先解码base64,然后使用PDFBox命令行工具执行PDFSplit,最后在各自的打印机上打印每个文档:

$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的回复包含一个尺寸为8" x4"贴纸,可在DHLPrinter上完美打印,但在PaperPrinter上,它不会打印标签的左上方和前5毫米。 见附图:

Margins not printed

我认为这是因为pdf以某种方式覆盖了边距,导致pdf移动到可打印区域之外。

有谁知道解决这个问题的方法?我希望打印完全自动化,并且不会停止打印。我只是想知道是否有人对如何编辑pdf边距有任何创意。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。使用OverlayPDF,我将存档文档覆盖到空白PDF上,它显示在中间,如下所示:Centered Label

我刚刚添加了这两行代码,它就像一个魅力:

$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的'orientation'属性,但实际上它变小了: Orientation: vertical 方向:横向完全搞砸了。图片包含在下面的评论中。