如何使用pdfminer从存储在S3存储桶中的PDF文件中提取文本而无需在本地下载?

问题描述

我在 S3 存储桶中存储了一个 PDF。我想使用 pdfminer 从该 PDF 文件提取文本。

文件存储在本地时,我可以使用以下代码提取

from pdfminer3.layout import LAParams,LTTextBox
from pdfminer3.pdfpage import pdfpage
from pdfminer3.pdfinterp import PDFResourceManager
from pdfminer3.pdfinterp import pdfpageInterpreter
from pdfminer3.converter import pdfpageAggregator
from pdfminer3.converter import TextConverter
from pdfminer.high_level import extract_pages
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
import io
from urllib.parse import urlparse

resource_manager = PDFResourceManager()
file_handle = io.StringIO()
converter = TextConverter(resource_manager,file_handle,laparams=LAParams())

page_interpreter = pdfpageInterpreter(resource_manager,converter)

pdf_file = 'file.pdf'

with open(pdf_file,'rb') as fh:


    for page in pdfpage.get_pages(fh,caching=True,check_extractable=True):
        page_interpreter.process_page(page)

        text = file_handle.getvalue()

# close open handles
converter.close()
file_handle.close()
total_no_pages = len(list(extract_pages(pdf_file)))
print(total_no_pages)
print(text)

我可以以干净的方式提取文本。

但是,我想对存储在 S3 中的 PDF 执行相同的操作。

我已经连接到 S3 存储桶并像这样获取数据:

import boto3,os

s3 = boto3.resource(
   service_name='s3',region_name=<region-name>,aws_access_key_id=<access-key>,aws_secret_access_key=<secret-key>
)

    
bucket_name = <bucket_name>
item_name = <folederName/file.pdf>

obj = s3.Object(bucket_name,item_name)
fs = obj.get()['Body'].read()

当我打印 fs 时,我看到它以字节为单位返回数据。

请建议一种使用 pdfminer 存储在 S3 中的文本的方法

解决方法

代替

get_pages(fh,caching=True,check_extractable=True):

你可以:

get_pages(io.BytesIO(fs),check_extractable=True):

顺便说一下,您仍在从 S3 下载对象,但并未将它们物理保存在本地硬盘上。