2010-08-05 50 views
2

我想組織從互聯網上下載的pdf文件。很明顯,他們中的很多人都是不健康的。我想從文件中提取真正的標題。這裏有許多是從Latex生成的,我從編譯的pdf中可以找到\ title {}關鍵字或類似的東西。然後我想用這個來重命名文件。從Pdf標題重命名.pdf

我可以使用pypdf讀取元數據。但大多數pdf在其元數據中不包含該標題。我用我的所有藏品嚐試過,發現沒有!

兩個問題: 1.是否可以閱讀從乳膠編譯的PDF編譯的pdf標題。 2.我可以使用哪個庫(主要是C/C++,java,python)來獲取這些信息。

在此先感謝。

回答

1

嘗試iText(Java)。我發現這個例子,嘗試一下(您可以添加仿製藥,如果支持的話):

PdfReader reader = new PdfReader("yourpdf.pdf"); 
HashMap map= reader.getInfo(); 
Set keys = map.keySet(); 
Iterator i = keys.iterator(); 

while(i.hasNext()) { 
    String thiskey = (String)i.next(); 
    System.out.println(thiskey + ":" + (String)map.get(thiskey)); 
} 
+0

這隻會從我認爲的pdf中得到元數據(就像pyPdf中的getDocumentInfo()一樣),它不能解決問題。 – Steven 2010-08-05 09:58:06

2

在Python中,最好的辦法是看pyPdf(Debian軟件包:蟒蛇-pypdf)。下面是一些代碼:

import pyPdf, sys 
filename=sys.argv[1] 
i=pyPdf.PdfFileReader(open(filename,"rb")) 
d=i.getDocumentInfo() 
print d["/Title"] 

以我的經驗,很少可以對PDF有「/標題」屬性設置,雖然如此,你的里程可能會有所不同。在這種情況下,你必須從內容中猜出標題,這肯定是容易出錯的。 pyPdf也可以幫助你。

+0

感謝pyPdf recomendation,但您的示例代碼導致我的系統掛在對PdfFileReader的調用上,因爲文件必須以二進制打開:i = pyPdf.PdfFileReader(open(filename,「rb」))。 – jimhark 2012-11-16 19:44:58

+0

謝謝,修復(這在Windows上是必需的)。 – loevborg 2012-12-10 11:34:54

3

我認爲這是不可能的。 LaTeX的信息不再出現在pdf中。如果標題不存在於元數據中,那麼如果標題是「標記的pdf」,則可以從結構信息中推導標題。然而,大多數pdf不是,而那些可能會提供元數據。

這會讓您進行佈局分析:嘗試通過查看佈局特徵來確定文檔中的標題。對於python,你可能想看看pdfminer。 下面的示例使用pdfminer使用一個相當簡單的方法來判斷題:

  • 我們假設的標題是第一頁
  • 上的某個地方,我們把它給pdfminer認識到「文本塊」上第一頁
  • 我們假設標題的打印比頁面的其他部分「大」。查看文本塊中每行的高度,我們確定哪個塊包含「最高」行,並假定該塊包含標題
  • 我們讓pdfminer從塊中提取文本,
  • 文本會可能包含換行符(由pdfminer放置),因爲標題可能包含多行和其他不必要的空格,所以我們做一些簡單的空白標準化(用單個空格替換連續的空格,並且刪除前導和尾隨空格),就是這樣!

正如我所說:這種方法相當簡單,可能會也可能不會爲您的文檔提供良好的結果,但它可能會指向您正確的方向。這裏有雲:

import sys 
import re 
from pdfminer.pdfparser import PDFParser, PDFDocument 
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
from pdfminer.converter import PDFPageAggregator 
from pdfminer.layout import LAParams, LTTextBox 

filename = sys.argv[1] 
fp = open(filename, 'rb') 

parser = PDFParser(fp) 
doc = PDFDocument() 
parser.set_document(doc) 
doc.set_parser(parser) 
doc.initialize() 

rsrcmgr = PDFResourceManager() 
laparams = LAParams() 
device = PDFPageAggregator(rsrcmgr, laparams=laparams) 
interp = PDFPageInterpreter(rsrcmgr, device) 

pages = doc.get_pages() 
first_page = pages.next() 
interp.process_page(first_page) 
layout = device.get_result() 
textboxes = [i for i in layout if isinstance(i, LTTextBox)] 
box_with_tallest_line = max(textboxes, key=lambda x: max(i.height for i in x)) 

text = box_with_tallest_line.get_text() 
print re.sub('\s+', ' ', text).strip() 

我會留下重命名文件到你(注意,標題可能包含您可能不想,或者說甚至沒有在文件名中有效的字符)。目前Pdfminer文檔相當稀少,因此您可能需要在郵件列表中詢問是否需要了解更多信息。 (我自己不太瞭解,但無法抗拒嘗試;-))。或者你也可以嘗試與其他pdf庫/其他語言類似的方法。

0

C++的另一種選擇是Poppler。

我曾嘗試在過去做過類似的事情(並在此處詢問建議: Extracting text from PDF with Poppler (C++)),但從未真正掌握它的工作原理。在一天結束的時候,我意識到至少爲了我的使用,手動重命名文件更容易。

0

我發現使用非理性評論的最佳解決方案,但在pdf文件中您需要的任何文本是A-PDF重命名應用程序,它對我嘗試過的所有文件都非常有效。