2013-06-26 27 views
1

親愛的堆棧溢出用戶的二進制文件,寫作PDF從流收益率畸形PDF

我會很感激你有種與下列問題幫助: 我們的Apache服務器作爲轉發代理功能,配置有ext_filter:每當響應是MIME類型PDF,過濾器被調用(perl腳本),PDF的內容可以從STDIN中讀取。我們從STDIN讀取PDF文件,將其寫入文件,就這些了。這幾乎總是有效的,但在一個特定的網站,寫在下面的方式時,PDF的格式不正確:

my $input_file = shift; 
binmode STDIN; 
open(OUT, ">" . $input_file); 
binmode OUT; 
foreach my $line (<STDIN>){ 
     print OUT $line; 
} 
close OUT; 

如果我們不是叫「三通」(過濾器設置爲使用「三通」) - 文件寫入正確。分析格式錯誤的PDF表明,外部參照表格在我們編寫的PDF格式中格式錯誤,Adobe Reader無法打開它。我們已經嘗試使用sysopen,sysread等,使用「:raw」和其他幾種方法來正確編寫二進制文件,但沒有任何工作(剪切& documnetation粘貼代碼以編寫二進制文件)。只有在linux中使用'tee'工具作爲過濾器時,才能正確寫入。這對我們沒有幫助 - 我們需要能夠將它作爲perl腳本的一部分從stdin寫入文件。有什麼建議麼?如果有一種方式可以通過系統調用以某種方式調用'tee',併爲其提供perl程序的STDIN,它可能會工作。提前謝謝了。

+0

你從標準輸入複製到您的結果文件在*線由行*的方式。 PDFs(儘管它們可能大部分看起來像文本文件)必須被視爲二進制文件。如果例如一個類型的行尾字符被另一個類型替換(LF由LF LF),任何後續對象的位置都會改變,因此交叉引用突然出錯。此外,二進制部分流包含在PDF中,例如,字體或壓縮文本流。如果有更換髮生,那些流將變得不可讀。 – mkl

+0

mkl:參見'binmode STDIN'和'binmode OUT'調用? – innaM

+2

http://perlmonks.org/index.pl?node_id=1040759 – daxim

回答

0

好了,雖然代碼爲basiclly正確的,把它「EVAL」在某種程度上斷送THD PDF內。 我仍然不明白爲什麼,但刪除eval解決了這個問題。

該perl是Apache的ext_filter模塊的上下文中調用。

我會進一步調查此和更新的時候,我會覺得這個解釋。

感謝大家。