按第一目录级别批量拆分PDF?

时间:2014-05-13 10:54:48

标签: python text text-extraction pdfminer

我希望从PDF中提取文本以进行数据挖掘任务。 我正在查看的PDF包含多个报告,每个报告在文档目录中都有自己的第一级条目。此外,PDF的开头有一个书面目录,其中包含每个报告的页码("从页面到页面")。

我正在寻找一种方法:

  • 将PDF拆分为各个报告,以便将每个报告转储到.txt文件中。

  • 直接将PDF的每个部分转储为.txt。

到目前为止,我已经能够使用PDFminer(python)将整个文件转储到.txt中,如下所示:

# Not all imports are needed for this task 
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO

def myparse(data):

    fp = file(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
    #fp.close()
    #device.close()
    str = retstr.getvalue()
    #retstr.close()
    return str

t1 = myparse("part2.pdf")
text_file = open("part2.txt", "w")
text_file.write(t1)
text_file.close()

此外,这将返回目录的整个结构:

# Open a PDF document.
fp = open('solar.pdf', 'rb')
parser = PDFParser(fp)
password = ""
document = PDFDocument(parser, password)

# Get the outlines of the document.
outlines = document.get_outlines()
for (level,title,dest,a,se) in outlines:
print (level, title, a)

知道如何从这里开始吗?任何使用python,R或bash的工具对我个人来说都是最容易使用的,但只要它能够根据文档的第一个大纲级别进行批量拆分,任何解决方案都会很棒。

谢谢你, 的Matthias

1 个答案:

答案 0 :(得分:2)

我使用sejda-console找到了一个直接的解决方案:

from subprocess import call
import os

pdfname = "example.pdf"


outdir = "C:\\out\\%s" % pdfname
if not os.path.exists(outdir):
    os.makedirs(outdir)



sejda = 'C:\\sejda\\bin\\sejda-console.bat'
call = sejda
call += ' splitbybookmarks'
call += ' --bookmarkLevel 1'
call += ' -f "%s"' % pdfname
call += ' -o "%s"' % outdir
print '\n', call
subprocess.call(call)
print "PDFs have been written to out-directory"

显然这需要sejda程序:http://www.sejda.org/