これは、PyPDF2 が一貫性のないスクレーパー であるためです。すべてのpdfが同じように構築されているわけではないことを覚えておく必要があります。そのため、pdfが構築された構造に基づいて、PyPDF2はそれをスクレイピングできる場合とできない場合があります。
通常、 pdf をスクレイピングしているときは、PyPDF2を使用してテキストを取得するかどうかに応じて、PyPDF2、pdfminer、およびslate3kを切り替える必要があります。私の意見では最も簡単なので、PyPDF2から始めます。
堅牢性の私の順序 (パッケージがpdfをどれだけうまくスクレイピングできるか):
1.) pdfマイナー
2.) スレート3k
3.) PyPDF2
スレート 3k の使用:
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)
pdfマイナーの使用
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 は非常に多くの方法で構築できるため、テキストはさまざまな方法で出力できます。しかし、これで正しい方向に進むはずです。