首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pdfminer作为库

如何使用pdfminer作为库
EN

Stack Overflow用户
提问于 2011-04-20 11:50:00
回答 15查看 83K关注 0票数 74

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

I thought I was on to something when I found this link,但我在任何解决方案上都没有成功。也许这里列出的函数需要再次更新,因为我使用的是较新版本的pdfminer。

I also tried the function shown here, but it also did not work.

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

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

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2011-11-30 19:24:20

这是我最终制作的一个为我工作的清理过的版本。下面只是简单地返回PDF中的字符串,给出它的文件名。我希望这能节省一些人的时间。

代码语言:javascript
复制
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

此解决方案在API changes in November 2013之前一直有效。

票数 74
EN

Stack Overflow用户

发布于 2014-01-03 22:02:11

以下是适用于最新版本的新解决方案:

代码语言:javascript
复制
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
票数 78
EN

Stack Overflow用户

发布于 2011-04-20 21:16:31

我知道回答你自己的问题很低级,但我想我可能已经弄明白了,我不想让任何人浪费他们的时间来寻找我的问题的解决方案。

我遵循了问题中发布的一个链接中的建议,并重新调整了pdfminer中包含的当前pdf2txt.py脚本的用途。下面是这个函数,以防它对其他任何人有用。感谢用户skyl发布了这个答案,我所要做的就是做一些更改,使其与当前版本的pdfminer一起工作。

此函数接受一个pdf,并在同一目录中创建一个同名的.txt文件。

代码语言:javascript
复制
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
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5725278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档