TJB*_*TJB 3 python pdf amazon-s3 pypdf amazon-web-services
我正在尝试获取存储在 AWS 中的 S3 存储桶之一中的 pdf 文件,并获取其一些元数据,例如页数和文件大小。我成功从 S3 存储桶获取 pdf 文件,在调用 print(obj) 时获取此文件
s3.Object(bucket_name='somebucketname', key='somefilename.pdf')
Run Code Online (Sandbox Code Playgroud)
使用 PyPDF2.PdfFileReader() 时,我尝试使用原始文件、UTF-8 解码文件和 ISO-8859-1 解码文件。ISO-8859-1 解码文件是唯一不会引发异常的文件,但是当尝试将其作为参数传递到 PdfFileReader 时,我收到错误,并且此回溯
Traceback (most recent call last):
File "s3_test.py", line 18, in <module>
pdfFile = PdfFileReader(parse3)
File "/usr/local/lib/python3.6/site-packages/PyPDF2/pdf.py", line 1081, in __init__
fileobj = open(stream, 'rb')
ValueError: embedded null byte
Run Code Online (Sandbox Code Playgroud)
我是否使用了错误的编码类型来解码此 pdf 文件,或者是否像 pdfFileReader 的第一个参数必须是文件路径之类的其他内容?有没有一种更简单的方法来访问 S3 pdf 对象的元数据,而无需费力去实现?
Python脚本
import boto3
from PyPDF2 import PdfReader
s3 = boto3.resource('s3')
obj = s3.Object(bucket_name, itemname)
parse3 = obj.get()['Body'].read().decode("ISO-8859-1")
pdfFile = PdfReader(parse3)
Run Code Online (Sandbox Code Playgroud)
小智 8
总体策略如下:
PyPDF2 在确定如何解码文件方面比您更聪明。PdfFileReader 可以从流或文件路径中读取,因此可以从 S3 读取文件并将其准备为字节流。让 PdfFileReader 来完成这项艰苦的工作。
要将文件流准备为字节流,您可以使用 BytesIO 库。
Python 2:
from BytesIO import BytesIO
Run Code Online (Sandbox Code Playgroud)
Python 3:
from io import BytesIO
Run Code Online (Sandbox Code Playgroud)
对于您的代码示例:
from BytesIO import BytesIO
Run Code Online (Sandbox Code Playgroud)