2016-08-24 182 views
0

我試圖使用Ghostscript將用下面的代碼我的服務器上合併多個PDF文件:合併多個PDF文件合併成一個用PHP Ghostscript的

$files = array(
     '1.pdf', 
     '2.pdf', 
     '3.pdf' 
); 

$output = 'single.pdf'; 

$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$output "; 

foreach($files as $file) 
    $cmd .= "pdfs/$file "; 

var_dump(shell_exec($cmd)); 

我用的腳本是在根文件夾和PDF文件是一個名爲PDF文件文件夾中:

/[pdfs] 
|__ 1.pdf 
|__ 2.pdf 
|__ 3.pdf 
script.php 

的文件夾和文件的權限都是777

儘管如此,沒有任何事情發生,返回的值是NULL

那麼我做錯了什麼?將多個PDF文件合併爲一個使用Ghostscript的確切方式是什麼?

+0

您是否嘗試過回顯$ cmd而不是執行它,因此您可以將其複製並粘貼到終端以驗證該命令是否有效並正常工作? –

+0

我可以試試,但我會使用哪個終端呢?我剛剛檢查了我的服務器,發現PDF文件最終被合併,輸出結果正確。自從我上次測試以來我沒有做任何事情。所以我認爲這可能只是時間問題。有沒有辦法計算可能需要多長時間? – user3292788

回答

0

只是一邊評論; Ghostscript does 而不是'合併'PDF文件,它可以將多個PDF文件作爲輸入並創建一個全新的PDF文件,其外觀應與輸入相同,但它不合並PDF文件,輸入被完全解釋並且新文件除了與輸入文件相同的外觀之外沒有其他任何內容。

那麼,你確定Ghostscript工作正常嗎? 您是否嘗試過處理單個PDF文件? 它工作嗎?

如果不是這樣,那麼最可能的問題是您的$ PATH環境變量中沒有包含Ghostscript可執行文件的目錄(這是一個常見問題)。您可以通過在命令行提供給Ghostscript的可執行文件的完全限定路徑進行測試,所以不是:

$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$output "; 

試着這麼做:

$cmd = "/usr/local/bin/gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$output "; 

很明顯,你將不得不修改路徑匹配你的設置。如果可行,那麼問題很可能是該目錄不在$ PATH中,您可以添加它或只使用完整路徑。

還有一個邏輯錯誤,我不能幫你;

它在我看來像你的'foreach'將爲數組中的每個文件調用一次cmd。這意味着每個文件都將通過對Ghostscript的調用進行處理。所以每個文件都會生成一個單獨的PDF文件。由於它們都使用相同的OutputFile,它們將相互覆蓋。

如果你想使用的所有文件的輸入來創建一個單一的輸出,你需要調用Ghostscript的準確一次,不是每個輸入文件一次,並且在命令行中需要包括所有的輸入文件。

從本質上說你現在所擁有的是:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=single.pdf 1.pdf 
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=single.pdf 2.pdf 
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=single.pdf 3.pdf 

你想要的是:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=single.pdf 1.pdf 2.pdf 3.pdf 

因爲我什麼都不知道關於PHP我不能告訴你如何糾正。

+0

嗯,首先感謝你的詳細評論,但是你的方法是錯誤的,因爲'foreach'不會爲每個文件調用命令,而只是連接字符串變量'$ cmd'。 Ghostscript用'shell_exec'方法調用,並且在腳本結束時只執行一次。事實上,我的問題解決了,這只是時間問題。我等了幾分鐘,輸出的PDF文件就在那裏。 – user3292788

+0

嗯,我確實說過我不是PHP開發人員:-) – KenS