按目录级别批量拆分PDF?
我想从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 个回答
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/