【发布时间】:2021-07-31 05:55:01
【问题描述】:
我是编码世界的新手,现在已经被这个问题困扰了 3 天,到处寻找答案,所以任何帮助都将不胜感激。我需要从位于 url 的 Pdf 文件中提取少量文本。我使用sessions.get(chart_PDF) 作为定位URL 的驱动程序,其中chart_PDF 是下面的示例URL。
示例网址为https://www.airservicesaustralia.com/aip/pending/dap/PADGN01-166_09SEP2021.pdf
我知道我可以将其写入本地驱动器,但我不想这样做,我希望能够远程执行,因为我只需要其中的几个数字。
我尝试从 url 页面查找密码进行解密,但找不到。我尝试过使用PyPDF2、pdfminer 和pikepdf(可能不太好)。
我只需要检索 PDF 底部附近的两个数字即可用于我的其余代码。请帮助,即使这是一个简单的修复,我对这一切都是新手,需要一些帮助。谢谢。
from io import BytesIO
from pikepdf import Pdf as PDF
from pdfminer import high_level
chart_PDF = https://www.airservicesaustralia.com/aip/pending/dap/PADGN01-166_09SEP2021.pdf
retrieve = s.get(chart_PDF)
content = retrieve.content
response =urllib.request.urlopen(chart_PDF)
p = BytesIO(content)
p.getbuffer()
check = PDFPage.get_pages(p, check_extractable=False)
extract = high_level.extract_text(p)
我明白了:
PDFTextExtractionNotAllowedWarning:位于 0x000001B007ABEC20> 的 PDF <_io.bytesio pdftextextractionnotallowedwarning>
或者,如果我尝试这个:
from pikepdf import Pdf as PDF
from pdfminer.pdfpage import PDFPage
from PyPDF2 import PdfFileReader
new_pdf = PDF.new()
with PDF.open(p) as pdf:
print(len(pdf.pages))
page1 = pdf.pages[0]
if PdfFileReader.getIsEncrypted(pdf):
print(True)
PdfFileReader.decrypt(page1, password='')
pdf.close()
我明白了:
第 1987 行,在解密中 返回self._decrypt(密码) 属性错误:_decrypt
21 年 3 月 8 日更新 非常感谢KJ!你真的帮了大忙!
from io import BytesIO
from pdfminer.pdfpage import PDFPage
from pdfminer import high_level
retrieve = s.get(chart_PDF)
content = retrieve.content
bytes = BytesIO(content)
bytes.getbuffer()
PDFPage.get_pages(bytes, check_extractable=False)
extract = high_level.extract_text(bytes, password='') #THIS LINE THROWS ERROR
joined = ''.join(extract)
find_txt = re.findall(r'[(]\d*[-]\d[.]\d[)]', joined)
print(find_txt)
bytes.close()
现在运行良好,我已经能够提取我需要的数字(我基本上已经从 PDF 的括号内提取了所有数字)。我会整理一下,找到我需要的。
奇怪的是,虽然它给了我我需要的东西,但我的 extract = high_level.extract_text(bytes, password='') 行仍然抛出警告:(warning_msg, PDFTextExtractionNotAllowedWarning),这很烦人。不确定这个过程是如何工作的,但它仍然会泄露信息。
我不能使用 try except 或者它会跳过它。解决方法是什么?我怎样才能阻止这个错误的出现?
最终更新
我绕过了警告,现在效果很好。
with warnings.catch_warnings():
warnings.simplefilter("ignore")
extract = high_level.extract_text(bytes)
为忍受我的无知干杯,你们帮了很多忙。
【问题讨论】:
-
您无法对远程文件进行操作 - 在从服务器请求它之后,字节就在您的机器中。但是,您可以将字节加载到 in-memory buffer 并在那里对其进行操作。
-
感谢您的回复。我已经编辑了我的问题以包括我正在尝试使用缓冲区的内容。它绝对是经过编码的。
-
将 pdf 数据加载到缓冲区后,您需要将其传递给某些东西——也许是您提到要解析的 Python PDF 包之一。通常该函数会声明它接受“类似文件的对象”,这意味着缓冲区是可以接受的。请注意,PDF 不是文本格式,因此无法解码:字节必须由能够理解 PDF 文件格式的东西解析。
-
非常感谢您的帮助。我会继续努力,如果我得到任何东西,我会告诉你。
-
我不知道 Mutool是一种在 Python 中使用 Mutool 或类似工具“清理”的方法,这很棒,可以消除我对警告消音器的需求。转换为 HTML 并返回是一个好主意,因为每个单独的图表(如您预测的那样)都显示了我的抽到所需的数字后,在不同的位置。我会给它一个聪明的伙伴,谢谢。
标签: python pdf encryption text decode