使用 pypdf2 抓取一页 pdf 时不返回任何文本

No text is returned when pypdf2 is used to scrape a one paged pdf

我已经从这个来源下载了一堆 pdf:'http://ec.europa.eu/growth/tools-databases/cosing/index.cfm?fuseaction=search.detailsPDF_v2&id=28157

现在我想使用 PyPDF2 抓取 PDF,但是没有返回文本。

我用另一个 pdf 测试了代码,它没有问题。

all_files = os.listdir('C:/Users/NAME.NAME/Downloads/Eu/T/')
count=0
count2=0
for filenames in all_files: 
   count +=1
   file_path='C:/Users/NAME.NAME/Downloads/Eu/T/'+filenames
   pdf_obj=open(file_path, 'rb')
   pdf_reader = PyPDF2.PdfFileReader(pdf_obj)
   num_pages = pdf_reader.numPages
   current_page=0
   text2=""
   pageObj= pdf_reader.getPage(current_page)
   text2 +=pageObj.extractText()

This is because PyPDF2 is a inconsistent scraper 。您必须记住,并非所有 pdf 的构建都是相同的,因此基于构建 pdf 的结构 PyPDF2 可能会也可能不会 抓取 它。

通常当我 抓取 pdf 时,我必须在 PyPDF2、pdfminer 和 slate3k 之间切换,这取决于我是否使用 PyPDF2 获取文本。我从 PyPDF2 开始,因为在我看来它是最简单的。

我的稳健性顺序(包可以抓取 pdfs的程度):

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 可以以多种方式构建,所以您的文本可以以多种不同的方式输出。但这应该会让您朝着正确的方向前进。