问题描述
我正在尝试从pdf提取文本,但是由于我的脚本有时检测到pdf的每一页,有时仅检测到pdf的第一页,所以我遇到了错误。我什至包括了Stackoverflow上前post的这一行。
print(len(list(extract_pages(pdf_file))))
每次我的脚本仅提取第一页时,该脚本仅检测到一页。
我什至尝试使用另一个库(PyPDF2)提取文本,但结果更糟。
如果我查找脚本处理不当的pdf属性,则Adobe会在pdf属性中清楚地显示正确的页面数。
下面是我正在使用的代码。关于如何更改脚本以检测pdf的所有页面的任何建议将不胜感激。
import os
from os.path import isfile,join
from io import StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager,pdfpageInterpreter
from pdfminer.pdfpage import pdfpage
from pdfminer.pdfparser import PDFParser
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
pdf_dir = "/dir/pdfs/"
txt_dir = "/dir/txt/"
corpus = (f for f in os.listdir(pdf_dir) if not f.startswith('.') and isfile(join(pdf_dir,f)))
for filename in corpus:
print(filename)
output_string = StringIO()
with open(join(pdf_dir,filename),'rb') as in_file:
parser = PDFParser(in_file)
doc = PDFDocument(parser)
rsrcmgr = PDFResourceManager()
device = TextConverter(rsrcmgr,output_string,laparams=LAParams())
interpreter = pdfpageInterpreter(rsrcmgr,device)
for page in pdfpage.create_pages(doc):
interpreter.process_page(page)
txt_name = "{}.txt".format(filename[:-4])
with open(join(txt_dir,txt_name),mode="w",encoding='utf-8') as o:
o.write(output_string.getvalue())
解决方法
这是一个解决方案。在尝试使用R(pdftools)和Python(pdfplumber)的不同库之后,PyMuPDF的效果最佳。
from io import StringIO
import os
from os.path import isfile,join
import fitz
pdf_dir = "pdf path"
txt_dir = "txt path"
output_string = StringIO()
corpus = (f for f in os.listdir(pdf_dir) if not f.startswith('.') and isfile(join(pdf_dir,f)))
for filename in corpus:
print(filename)
output_string = StringIO()
doc = fitz.open(join(pdf_dir,filename))
for page in doc:
output_string.write(page.getText("rawdict"))
txt_name = "{}.txt".format(filename[:-4])
with open(join(txt_dir,txt_name),mode="w",encoding='utf-8') as o:
o.write(output_string.getvalue())