python - 使用 pdfminer.six 从 URL 打开 PDF
问题描述
背景:Python 3.7 & pdfminer.six
使用此处找到的信息:Exporting Data from PDFs with Python,我有以下代码:
import io
from pdfminer.converter import TextConverter
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfpage import PDFPage
def extract_text_from_pdf(pdf_path):
resource_manager = PDFResourceManager()
fake_file_handle = io.StringIO()
converter = TextConverter(resource_manager, fake_file_handle)
page_interpreter = PDFPageInterpreter(resource_manager, converter)
with open(pdf_path, 'rb') as fh:
for page in PDFPage.get_pages(fh,
caching=True,
check_extractable=True):
page_interpreter.process_page(page)
text = fake_file_handle.getvalue()
# close open handles
converter.close()
fake_file_handle.close()
if text:
return text
if __name__ == '__main__':
path = '../_pdfs/mypdf.pdf'
print(extract_text_from_pdf(path))
这可行(耶!),但我真正想做的是通过其 url 直接请求 pdf,而不是打开已预先保存到本地驱动器的 pdf。
我不知道如何修改“打开”逻辑以从远程 url 调用,我也不确定哪个请求库最适合用于最新版本的 Python(请求、urllib、urllib2 等? )
我是 Python 新手,所以请记住这一点(Ps 我发现了其他关于此的问题,但我无能为力 - 可能是因为它们往往很旧。)
任何帮助将不胜感激!谢谢!
解决方案
我解决了如下:
from io import StringIO, BytesIO
import urllib.request
from pdfminer.converter import TextConverter
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage
def extract_text_from_pdf_url(url, user_agent=None):
resource_manager = PDFResourceManager()
fake_file_handle = StringIO()
converter = TextConverter(resource_manager, fake_file_handle)
if user_agent == None:
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
headers = {'User-Agent': user_agent}
request = urllib.request.Request(url, data=None, headers=headers)
response = urllib.request.urlopen(request).read()
fb = BytesIO(response)
page_interpreter = PDFPageInterpreter(resource_manager, converter)
for page in PDFPage.get_pages(fb,
caching=True,
check_extractable=True):
page_interpreter.process_page(page)
text = fake_file_handle.getvalue()
# close open handles
fb.close()
converter.close()
fake_file_handle.close()
if text:
# If document has instances of \xa0 replace them with spaces.
# NOTE: \xa0 is non-breaking space in Latin1 (ISO 8859-1) & chr(160)
text = text.replace(u'\xa0', u' ')
return text
推荐阅读
- r - R匹配一个表中的日期,如果在第二个表中的两个日期列之间超过类别
- python - Python:二分搜索 - “查找第一个匹配项”
- docker - 在 Travis CI 上加快颤振构建
- xslt - XSL FO 表中的粗边框线问题 - 使用 Apache FOP 创建 PDF
- linux - 在 ubuntu 18.04 上安装 Gitlab 后出错
- angular - 角度材质,显示来自延迟加载的组件的对话框
- reactjs - 将表单添加到 Gatsby JS,并使用导出默认的现有模板
- python - 如何在流程图中绘制范围循环
- excel - 如何将多个 Excel 图表均匀地放置在一张图表中?
- ios - 如何生成 iOS 应用程序的唯一标识