如何从内联的原始字节(而不是文件)中读取PDF文件?

16

我正在尝试从澳大利亚证券交易所网站创建一个PDF提取器,它将允许我搜索公司发布的所有“公告”并在这些公告的PDF中搜索关键字。

目前,我正在使用requests和PyPDF2获取PDF文件,并将其写入我的驱动器,然后读取它。但是,我希望能够跳过将PDF文件写入我的驱动器并阅读它的步骤,直接从获取PDF文件转换为字符串。我现在拥有的是:

import requests, PyPDF2

url = 'http://www.asx.com.au/asxpdf/20171108/pdf/43p1l61zf2yct8.pdf'
response = requests.get(url)
my_raw_data = response.content

with open("my_pdf.pdf", 'wb') as my_data:
    my_data.write(my_raw_data)


open_pdf_file = open("my_pdf.pdf", 'rb')
read_pdf = PyPDF2.PdfFileReader(open_pdf_file)
num_pages = read_pdf.getNumPages()

ann_text = []
for page_num in range(num_pages):
    if read_pdf.isEncrypted:
        read_pdf.decrypt("")
        print(read_pdf.getPage(page_num).extractText())
        page_text = read_pdf.getPage(page_num).extractText().split()
        ann_text.append(page_text)

    else:
        print(read_pdf.getPage(page_num).extractText())
print(ann_text)

此代码会从提供的URL中打印一组字符串到PDF文件中。

请问我能否将my_raw_data变量转换为可读的字符串?

非常感谢您的帮助!


1
你可以使用curl而不是Python来读取它,然后再进行阅读吗? - Mike 'Pomax' Kamermans
2个回答

31

你可以使用io

PyPDF2 >= 2.0.0

import requests, PyPDF2, io
from PyPDF2 import PdfReader  # you can also use pypdf>=3.1.0

url = 'http://www.asx.com.au/asxpdf/20171108/pdf/43p1l61zf2yct8.pdf'
response = requests.get(url)

with io.BytesIO(response.content) as open_pdf_file:
    reader = PdfReader(open_pdf_file)
    num_pages = len(reader.pages)
    print(num_pages)

打印输出2

备注:为了打开文件,始终使用上下文管理器(with语句)。


为什么你应该总是使用上下文管理器? - alias51

8
尝试使用IO模块和一个额外的解密器进行以下操作:
import requests, PyPDF2, io


url = 'http://www.asx.com.au/asxpdf/20171103/pdf/43nyyw9r820c6r.pdf'
response = requests.get(url).content

reserve_pdf_on_memory = io.BytesIO(response)
load_pdf = PyPDF2.PdfFileReader(reserve_pdf_on_memory)

if load_pdf.isEncrypted:
    load_pdf.decrypt("")
    print(load_pdf.getPage(0).extractText())

else:
    print(load_pdf.getPage(0).extractText())

祝你好运... :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接