我認爲這是不可能的。 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庫/其他語言類似的方法。
這隻會從我認爲的pdf中得到元數據(就像pyPdf中的getDocumentInfo()一樣),它不能解決問題。 – Steven 2010-08-05 09:58:06