如何将pdfminer用作库

jme*_*ich 65 python pdf pdfminer

我正在尝试使用pdfminer从pdf获取文本数据.我可以使用pdfminer命令行工具pdf2txt.py成功将此数据提取到.txt文件.我目前这样做,然后使用python脚本来清理.txt文件.我想将pdf提取过程合并到脚本中并为自己节省一步.

当我找到这个链接时,我以为我正在做某件事,但我没有成功解决任何问题.也许那里列出的功能需要再次更新,因为我使用的是更新版本的pdfminer.

我也尝试过这里显示的功能,但它也没有用.

我尝试的另一种方法是使用脚本在脚本中调用脚本os.system.这也是不成功的.

我使用的是Python 2.7.1版本和pdfminer版本20110227.

小智 76

这是一个适用于最新版本的新解决方案:

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)
    fp.close()
    device.close()
    str = retstr.getvalue()
    retstr.close()
    return str
Run Code Online (Sandbox Code Playgroud)

  • 大!最后一个运行的解决方案,没有使用`process_pdf` :)我尝试使用[官方git存储库]中的`simple1.pdf`(https://github.com/euske/pdfminer/blob/master/samples/simple1.pdf ) (5认同)
  • 这适用于版本`pdfminer 20131113`.谢谢. (4认同)
  • 非常适合进行一点小修改:不要使用 str 作为变量名。str 是一个Python 函数。 (3认同)
  • 如果你想得到一个html输出,只需将HTMLConverter添加到导入和函数中,而不是TextConverter放HTMLConverter.就那么简单. (2认同)

kar*_*thy 69

这是我最终制作的清理版本,对我有用.以下只是简单地返回PDF中的字符串,给定其文件名.我希望这能节省一些时间.

from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO

def convert_pdf(path):

    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)

    fp = file(path, 'rb')
    process_pdf(rsrcmgr, device, fp)
    fp.close()
    device.close()

    str = retstr.getvalue()
    retstr.close()
    return str
Run Code Online (Sandbox Code Playgroud)

此解决方案在2013年11月API更改之前有效.

  • 仅供参考,这不再适用于当前版本的pdfminer - 我得到"ImportError:无法导入名称process_pdf" (22认同)
  • process_pdf 只是被 PDFPageInterpreter 取代 (2认同)

jme*_*ich 12

我知道回答你自己的问题很不好,但我想我可能已经想到这一点,我不希望其他人浪费时间寻找解决我问题的方法.

我在我的问题中发布的一个链接中遵循了该建议,并重新使用了pdfminer附带的当前pdf2txt.py脚本.这是函数,以防它对其他人有用.感谢用户skyl发布该答案,我所要做的就是进行一些更改,使其与当前版本的pdfminer一起使用.

此函数采用pdf并在同一目录中创建具有相同名称的.txt文件.

def convert_pdf(path, outtype='txt', opts={}):
import sys
from pdfminer.pdfparser import PDFDocument, PDFParser
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, process_pdf
from pdfminer.pdfdevice import PDFDevice, TagExtractor
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.cmapdb import CMapDB
from pdfminer.layout import LAParams
import getopt

outfile = path[:-3] + outtype
outdir = '/'.join(path.split('/')[:-1])

# debug option
debug = 0
# input option
password = ''
pagenos = set()
maxpages = 0
# output option
# ?outfile = None
# ?outtype = None
outdir = None
#layoutmode = 'normal'
codec = 'utf-8'
pageno = 1
scale = 1
showpageno = True
laparams = LAParams()
for (k, v) in opts:
    if k == '-d': debug += 1
    elif k == '-p': pagenos.update( int(x)-1 for x in v.split(',') )
    elif k == '-m': maxpages = int(v)
    elif k == '-P': password = v
    elif k == '-o': outfile = v
    elif k == '-n': laparams = None
    elif k == '-A': laparams.all_texts = True
    elif k == '-V': laparams.detect_vertical = True
    elif k == '-M': laparams.char_margin = float(v)
    elif k == '-L': laparams.line_margin = float(v)
    elif k == '-W': laparams.word_margin = float(v)
    elif k == '-F': laparams.boxes_flow = float(v)
    elif k == '-Y': layoutmode = v
    elif k == '-O': outdir = v
    elif k == '-t': outtype = v
    elif k == '-c': codec = v
    elif k == '-s': scale = float(v)
#
#PDFDocument.debug = debug
#PDFParser.debug = debug
CMapDB.debug = debug
PDFResourceManager.debug = debug
PDFPageInterpreter.debug = debug
PDFDevice.debug = debug
#
rsrcmgr = PDFResourceManager()

outtype = 'text'

if outfile:
    outfp = file(outfile, 'w')
else:
    outfp = sys.stdout
device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)


fp = file(path, 'rb')
process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password,
                check_extractable=True)
fp.close()
device.close()
outfp.close()
return
Run Code Online (Sandbox Code Playgroud)

  • 可以回答你自己的问题,不用担心. (13认同)
  • 由于你提到的原因,回答你自己的问题是非常可取的 (2认同)

Jor*_*rge 12

这对我使用最新版本的pdfminer(截至2014年9月):

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
import unicodedata, codecs
from io import StringIO

def getPDFText(pdfFilenamePath):
    retstr = StringIO()
    parser = PDFParser(open(pdfFilenamePath,'r'))
    try:
        document = PDFDocument(parser)
    except Exception as e:
        print(pdfFilenamePath,'is not a readable pdf')
        return ''
    if document.is_extractable:
        rsrcmgr = PDFResourceManager()
        device = TextConverter(rsrcmgr,retstr, codec='ascii' , laparams = LAParams())
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        for page in PDFPage.create_pages(document):
            interpreter.process_page(page)
        return retstr.getvalue()
    else:
        print(pdfFilenamePath,"Warning: could not extract text from pdf file.")
        return ''

if __name__ == '__main__':
    words = getPDFText(path)
Run Code Online (Sandbox Code Playgroud)


小智 6

这是我的解决方案

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

def convert_pdf_to_txt(path, pages=None):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)
    output = StringIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    infile = open(path, 'rb')
    for page in PDFPage.get_pages(infile, pagenums):
        interpreter.process_page(page)
    infile.close()
    converter.close()
    text = output.getvalue()
    output.close()
    return text
Run Code Online (Sandbox Code Playgroud)

例如,您只想阅读pdf文件的前3页:

text = convert('../Data/EN-FINAL Table 9.pdf', pages=[0,1,2])
Run Code Online (Sandbox Code Playgroud)

pdfminer.six == 20160614

python:3.x


Dav*_*tts 5

这是一个适用于pdfminer.six运行 python 3.6的答案。pdfminer.high_level如果您只想从简单的 PDF 文件中获取原始文本,它会使用抽象出许多底层细节的模块。

import pdfminer
import io

def extract_raw_text(pdf_filename):
    output = io.StringIO()
    laparams = pdfminer.layout.LAParams() # Using the defaults seems to work fine

    with open(pdf_filename, "rb") as pdffile:
        pdfminer.high_level.extract_text_to_fp(pdffile, output, laparams=laparams)

    return output.getvalue()
Run Code Online (Sandbox Code Playgroud)