如何使用Requests在线解码PDF文本?

5
我正在尝试从澳大利亚证券交易所网站创建一个PDF提取器,它将允许我搜索公司发布的所有“公告”,并在这些公告的PDF中搜索关键词。
到目前为止,我使用了requests库。下面是我的代码:
import requests

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

print(response.content)

然而打印出来的是以下字符串(由于太长,我将截断):
> b'%PDF-1.5\r%\xe2\xe3\xcf\xd3\r\n5 0 obj\r<</E 212221/H [ 1081 145 ]/L
> 212973/Linearized 1/N 1/O 8/T 212553>>\rendobj\r                      
> \r\r42 0 obj\r<</DecodeParms <</Columns 5/Predictor 12>>/Encrypt 7 0
> R/Filter /FlateDecode/ID [(\\216\\203\\217T\\n\\f\\236\\345?%\\214t4
> E\\271) (\\216\\203\\217T\\n\\f\\236\\345?%\\214t4 E\\271)]/Index [5
> 38]/Info 3 0 R/Length 86/Prev 212554/Root 6 0 R/Size 43/Type /XRef/W
> [1 3
> 1]>>\rstream\nx\x9ccbd`\x10``b``:\x04"\x19\xab\xc1d-X\xc4\x06D2\xac\x02\xb3\x93\xc0\xe2\x1d
> \x92?\x07,\x1e\t"\xb9T\x80$\xe3\x84\xcb@\x92\xa9m"\x03\x13\xe3\xdf\x13Z`Y\x06\xc6\x01#\xff3\xb0h\xbcfb`\xb6\x12\x02\xba\xe4\xef!S\x06\x0

我在StackExchange和其他网站上搜索了几天,尝试使用print(response.content.decode('utf-8')和ASCII编码,但都无法让我读懂内容。抱歉,我知道我是个新手,希望能得到帮助。非常感谢。
3个回答

10

PDF文件是二进制格式,您需要按照其格式及其页眉页脚来读取它。您不能将二进制文件作为原始字符串读取。

1)如果文件名中有任何空格,则无论返回成功代码,PyPDF 2 解密函数最终都会失败。尝试在运行 PyPDF2 之前将 PDF 文件命名为带下划线的名称。

例如,使用 "my_pdf.pdf" 而不是 "my pdf.pdf"。

2)尝试使用空字符串作为密码进行解密。

请尝试这样做:

import requests, PyPDF2


url = 'http://www.asx.com.au/asxpdf/20171103/pdf/43nyyw9r820c6r.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)
if read_pdf.isEncrypted:
    read_pdf.decrypt("")
    print(read_pdf.getPage(0).extractText())

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

@JamesWard:您想将PDF中的内容提取为字符串并保存到文本文件中吗? - DRPK
@JamesWard:只需将print(ready pdf.getPage(0).extract Text())更改为blabla = read pdf.getPage(0).extract Text(),现在您有一个字符串变量,可以对其进行任何操作!能否帮我点个赞 :) - DRPK
我在这里发布了 https://dev59.com/I1YN5IYBdhLWcg3wm5Oi - James Ward
@JamesWard:我回答了你,请查看 :) - DRPK
__警告:版本3中的重大更改__:自2023年1月起,此代码将无法运行,因为PyPDF2已升级到新的主要版本:3.0.0。请使用PyPDF2.PdfReader替换PyPDF2.PdfFileReader,并使用read_pdf.pages[0].extract_text()替换read_pdf.getPage(0).extractText() - Nicolas Dao
显示剩余3条评论

0

你可以简单地将一个URL粘贴到一个shell脚本中,就像我在这里使用那个地址一样,但它也可以是地址列表。

enter image description here

@echo off&Title PDF URL TO TXT&Color 9F
if not "%1"=="" set "URL=%1"
if "%1"=="" set /p "URL=URL ? "

curl -o "%temp%\temp.pdf" "%URL%"
timeout 5
"%temp%\temp.pdf"
"C:\Apps\PDF\poppler\23.01.0\Library\bin\pdftotext.exe" -layout -nopgbrk -enc UTF-8 "%temp%\temp.pdf"
notepad "%temp%\temp.txt"

enter image description here

有几种方法可以复制粘贴URL,就像我从问题中点击我方便的下拉命令所做的那样,并且有许多方法可以解析结果文本文件以查找单词,但最简单的方法是从现在打开的文件中查找、剪切和粘贴。

显然,这种方法对于一些更安全的目标站点可能不起作用,但对于大多数常规PDF URL应该是有效的。


0

该响应是表示 PDF 内容的编码字符串。您需要使用提取工具,例如 pdfminer。页面上有一个示例,展示了如何通过 Python 进行样本提取。


我尝试使用PyPDF2,但它显示该pdf已加密,我不确定密码是什么。这是我的代码:`import PyPDF2pdfobj = open('test.pdf', 'rb') pdfreader = PyPDF2.PdfFileReader(pdfobj) #pageobj = pdfreader.getPage(0) print(pdfreader.isEncrypted)`这将返回true,但我不确定密码是什么。 - James Ward
您能在其他应用程序中打开“test.pdf”吗?如果不能,则可能已经加密了密码。在这种情况下,如果不知道密码或使用的加密算法,则打开它将非常困难。 - Sohail Khan
我可以在电脑上无需密码打开它。我感到相当困惑。谢谢您的快速回复。 - James Ward

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