这是因为 PyPDF2 是一个不一致的刮板 。您必须记住,并非所有 pdf 都是相同的,因此基于 pdf 的构建结构,PyPDF2 可能会也可能不会抓取它。
通常当我抓取pdf 文件时,我必须在 PyPDF2、pdfminer 和slate3k之间切换,这取决于我是否使用 PyPDF2 获取文本。我从 PyPDF2 开始,因为在我看来它是最简单的。
我的健壮性顺序(包可以刮取pdf的程度):
1.) pdfminer
2.) slate3k
3.) PyPDF2
使用 slate3k:
import glob as glob
all_files = r'C:/Users/NAME.NAME/Downloads/Eu/T/*.pdf'
for filenames in glob.glob(all_files):
with open(filenames,'rb') as f:
pdf_text = slate.PDF(f)
print(text)
使用 pdfminer
import glob as glob
import io
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = io.StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = open(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)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
all_files = r'C:/Users/NAME.NAME/Downloads/Eu/T/*.pdf'
for files in glob.glob(all_files):
convert_pdf_to_txt(files)
您可能需要更改函数以获取所需格式的文本。正如我所说,因为 PDF 可以以多种方式构建,您的文本可以以多种不同方式输出。但这应该让你朝着正确的方向前进。