我正在使用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毫米。
见附图:
我认为这是因为pdf以某种方式覆盖了边距,导致pdf移动到可打印区域之外。
有谁知道解决这个问题的方法?我希望打印完全自动化,并且不会停止打印。我只是想知道是否有人对如何编辑pdf边距有任何创意。
答案 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
方向:横向完全搞砸了。图片包含在下面的评论中。