PyPDF2 和从 S3 解码 pdf 文件的问题

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

总体策略如下:

  1. 让 PyPDF2 处理解码

PyPDF2 在确定如何解码文件方面比您更聪明。PdfFileReader 可以从流或文件路径中读取,因此可以从 S3 读取文件并将其准备为字节流。让 PdfFileReader 来完成这项艰苦的工作。

  1. 准备字节流

要将文件流准备为字节流,您可以使用 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)