2014-11-05 40 views
2

我試圖從使用PDFMiner(代碼Extracting text from a PDF file using PDFMiner in python?處的代碼)中提取PDF文件中的文本。除了path/to/pdf之外,我沒有更改代碼。令人驚訝的是,該代碼返回同一文檔的多個副本。我得到了與其他pdf文件相同的結果。我是否需要通過其他論點或者我缺少什麼?任何幫助,高度讚賞。以防萬一,我提供了代碼:從pdf中提取文本與pdfminer給出多個副本

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
from pdfminer.converter import TextConverter 
from pdfminer.layout import LAParams 
from pdfminer.pdfpage import PDFPage 
from cStringIO import StringIO 

def convert_pdf_to_txt(path): 
    rsrcmgr = PDFResourceManager() 
    retstr = StringIO() 
    codec = 'utf-8' 
    laparams = LAParams() 
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) 
    fp = file(path, 'rb') 
    interpreter = PDFPageInterpreter(rsrcmgr, device) 
    password = "" 
    maxpages = 0 
    caching = True 
    pagenos=set() 
    fstr = '' 
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True): 
     interpreter.process_page(page) 

     str = retstr.getvalue() 
     fstr += str 

    fp.close() 
    device.close() 
    retstr.close() 
    return fstr 

print convert_pdf_to_txt("test.pdf") 
+0

這些PDF是從哪裏來的?他們全都是用同一種工具創造的嗎?一些腦死亡腳本完全有可能在其中創建帶有多個文本副本的PDF文件。 – kindall 2014-11-05 03:01:13

+0

@kindall感謝您的詢問。我從科學期刊下載了所有測試過的pdf文件,所以我假定它們是用相同的工具創建的。 – chemist 2014-11-05 03:18:16

+0

你能分享一個示例文檔來重現問題嗎? – mkl 2014-11-05 08:18:10

回答

6

我的回答在你引用的線程中有點不正確。我發現了錯誤,忘記更新我的答案。

由於pdfminer的文檔非常稀疏,我無法完全解釋它爲什麼會這樣工作。希望知道pdfminer庫更好一些的人可以給我們一些見解。

我所知道的是,你必須在for循環之外做text = retstr.getvalue()。我只能假設retstr正在更新,就好像我們在for循環中做final_text += text一樣,所以一旦完成,我們只需要做text = retstr.getvalue()即可從所有頁面獲取文本。

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
from pdfminer.converter import TextConverter 
from pdfminer.layout import LAParams 
from pdfminer.pdfpage import PDFPage 
from cStringIO import StringIO 

def convert_pdf_to_txt(path): 
    rsrcmgr = PDFResourceManager() 
    retstr = StringIO() 
    codec = 'utf-8' 
    laparams = LAParams() 
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) 
    fp = file(path, 'rb') 
    interpreter = PDFPageInterpreter(rsrcmgr, device) 
    password = "" 
    maxpages = 0 
    caching = True 
    pagenos=set() 
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,password=password,caching=caching, check_extractable=True): 

     interpreter.process_page(page) 

    text = retstr.getvalue() 

    fp.close() 
    device.close() 
    retstr.close() 
    return text 

print convert_pdf_to_txt("test.pdf") 

希望這有助於!