2016-09-12 104 views
0

我正在使用DHL送貨(XML)API來請求DHL貨件並自動打印已回覆的送貨標籤。使用PrintPDF命令行工具執行PDFBox打印

這是該系統的工作原理:

的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「×4」的尺寸,打印完美的DHLPrinter一個pdf,但在PaperPrinter上它不打印標籤的左側和頂部5mm。 見附圖:

Margins not printed

我想這是因爲利潤率由PDF莫名其妙地重寫,導致PDF可打印區域的外部移動。

有誰知道一種方法來解決這個問題?我希望打印完全自動化,並且會立即停止打印。我只是想知道是否有人有關於如何編輯PDF頁邊空間的創意。

+0

請嘗試2.0.2版本。而2.0.3快照https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/2.0.3-SNAPSHOT/有一個新的選項可能會有所幫助。 –

+0

如果不起作用,請上傳演示貼紙。 –

+0

謝謝@TilmanHausherr我使用了2.0.3快照。你正在談論的那個'方向'選項是什麼? –

回答

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 方向:水平被完全搞砸了。圖片包含在下面的評論中。

+0

取向:'horizo​​ntal'http://i65.tinypic.com/1iig6g.jpg –

+0

PDFBox出現重新打印標籤的問題,例如https://issues.apache.org/jira/browse/PDFBOX-3117。那甚至提到了一個解決方法,但它需要使用java。 –