2011-12-23 30 views
4

我正在嘗試將pdf文件的文本內容讀取到Perl變量中。從其他SO問題/答案我得到的意義,我需要使用CAM::PDF。這裏是我的代碼:在閱讀Perl中的pdf文本時遇到麻煩

#!/usr/bin/perl -w 

use CAM::PDF; 
my $pdf = CAM::PDF->new('1950-01-01.pdf'); 
print $pdf->numPages(), " pages\n\n"; 

my $text = $pdf->getPageText(1); 
print $text, "\n"; 

我試着在this pdf file上運行這個。 Perl沒有報告錯誤。第一份印刷聲明有效;它會打印出「2頁」,這是本文檔中正確的頁數。

下一個打印語句不會返回任何可讀的內容。以下是Emacs中的輸出內容:

2 pages 

^A^B^C^D^E^C^F^D^G^H 
^D^A^K^L^C^M^D^N^C^M^O^D^P^C^Q^Q^C  ^D^R^K^M^O^D ^A^B^C^D^E 
^F^G^G^H^E 
^K^L 
^M^N^E^O^P^E^O^Q^R^S^E 
.... more lines with similar codes .... 

有什麼我可以做的,使這項工作?我不太瞭解PDF文件,但我認爲,因爲我可以使用Acrobat輕鬆複製和粘貼來自PDF文件的文本,所以它必須被識別爲文本而不是圖像,所以我希望這意味着我可以提取它與Perl。

任何指導將不勝感激。

回答

2

PDF可以有不同種類的內容。例如,PDF可能根本沒有任何可讀文本,只有位圖和圖形內容。您鏈接到的PDF已壓縮其中的數據。使用文本編輯器打開它,您將看到該內容位於「/ Filter/FlateDecode」塊中。也許CAM::PDF不支持。谷歌FlateDecode的一些想法。

進一步研究該PDF,我發現它還使用嵌入的字體子集和自定義編碼。即使CAM :: PDF處理壓縮,自定義編碼也可能導致壓縮。這可能有所幫助:Web page from a software company, describing the problem

+0

好的。如果我在Acrobat中打開該文件並保存爲文本文件,則會正確地導出文本。正因爲如此,我認爲必須有某種方式來用Perl來提取它。但是,Acrobat是否理解編碼和CAM :: PDF不兼容? – itzy 2011-12-30 20:06:50

+0

是的,我相信就是這樣。看到我上面超鏈接的頁面,它描述了子集編碼的樣子。沒有任何保證的方式來恢復字符是什麼,除了渲染和做OCR(儘管一些啓發式可能工作,如標題爲「找出它」的部分所述)。 – theglauber 2012-01-03 16:29:45

2

我相當確定問題不在於您的Perl代碼,它是與PDF文件。我在我自己的PDF文件上運行了相同的腳本,並且它工作得很好。