pdf - 从 S3 读取 pdf 对象

我正在尝试创建一个 lambda 函数,该函数将访问上传到 s3 的 pdf 表单并删除输入到表单中的数据并将其发送到其他地方。

当我可以在本地下载文件时,我就可以执行此操作。所以下面的脚本可以工作,并允许我将 pdf 中的数据读入我的 pandas 数据框中。:

import PyPDF2 as pypdf
import pandas as pd

s3 = boto3.resource('s3')
s3.meta.client.download_file(bucket_name, asset_key, './target.pdf')

pdfobject = open("./target.pdf", 'rb')
pdf = pypdf.PdfFileReader(pdfobject)
data = pdf.getFormTextFields()

pdf_df = pd.DataFrame(data, columns=get_cols(data), index=[0])

但是使用 lambda 我无法在本地保存文件,因为我收到“只读文件系统”错误。

我试过像下面这样使用 s3.get_object() 方法:

s3_response_object= s3.get_object(
    Bucket='pdf-forms-bucket',
    Key='target.pdf',
)

pdf_bytes = s3_response_object['Body'].read()

但我不知道如何将生成的字节转换为可以用 PyDF2 解析的对象。我需要和 PyDF2 将产生的输出如下所示:

{'form1[0].#subform[0].nameandmail[0]': 'Burt Lancaster',
 'form1[0].#subform[0].mailaddress[0]': '675 Creighton Ave, Washington DC',
 'form1[0].#subform[0].Principal[0]': 'David St. Hubbins',
 'Principal[1]': None,
 'form1[0].#subform[0].Principal[2]': 'Bart Simpson',
 'Principal[3]': None}

所以总而言之,我需要能够读取带有可填写表格的 pdf 文件,将其读入内存并在不下载文件的情况下对其进行解析,因为我的 lambda 函数环境不允许使用本地临时文件。

最佳答案

已解决:

这就是诀窍:

import boto3
from PyPDF2 import PdfFileReader
from io import BytesIO

bucket_name ="pdf-forms-bucket"
item_name = "form.pdf"


s3 = boto3.resource('s3')
obj = s3.Object(bucket_name, item_name)
fs = obj.get()['Body'].read()
pdf = PdfFileReader(BytesIO(fs))

data = pdf.getFormTextFields()

https://stackoverflow.com/questions/62799852/

相关文章:

android - CameraX - 在纵向模式下锁定 Activity 时仅旋转预览

python - 如何使用 gspread 在 google 工作表单元格中插入任何超链接

python - 将 Pandas 数据框字符串拆分为单独的行

common-lisp - 如何在普通的 lisp 中创建一个位数组?

python - 我怎样才能遍历这个字典而不是对键进行硬编码

postgresql - 使用实体中的默认值与 PostgreSQL hibernate

javascript - 如何使用 typescript 导出 Mongoose 模式?

apache-spark - 我可以获取 Spark 读取的文件的元数据吗

amazon-web-services - terraform 可以复制 s3 存储桶的内容吗?

oracle - 基于字符和数字的 PL/SQL Regex 搜索