【问题标题】:Issue with PyPDF2 and decoding pdf file from S3PyPDF2 问题和从 S3 解码 pdf 文件
【发布时间】:2018-01-22 02:37:21
【问题描述】:

我正在尝试获取存储在 AWS 中的一个 S3 存储桶中的 pdf 文件,并获取它的一些元数据,例如页数和文件大小。我成功地从 S3 存储桶中获取了 pdf 文件,调用 print(obj) 时得到了这个

s3.Object(bucket_name='somebucketname', key='somefilename.pdf')

使用 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

我是否使用了错误的编码类型来解码这个 pdf 文件,还是像 pdfFileReader 的第一个参数一样必须是文件路径?有没有更简单的方法来访问 S3 pdf 对象的元数据,而无需费劲儿地到达那里?

Python 脚本

import boto3
from PyPDF2 import PdfFileReader

s3 = boto3.resource('s3')
obj = s3.Object(bucket_name, itemname)
parse3 = obj.get()['Body'].read().decode("ISO-8859-1")
pdfFile = PdfFileReader(parse3)

【问题讨论】:

    标签: python amazon-web-services pdf amazon-s3


    【解决方案1】:

    总体策略如下:

    1. 让 PyPDF2 处理解码

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

    1. 准备字节流

    要将文件流准备为字节流,您可以使用 BytesIO 库。

    Python 2:

    from BytesIO import BytesIO
    

    Python 3:

    from io import BytesIO
    

    对于您的代码示例:

        import boto3
        from PyPDF2 import PdfFileReader
        from io import BytesIO
    
        s3 = boto3.resource('s3')
        obj = s3.Object(bucket_name, itemname)
        fs = obj.get()['Body'].read()
        pdfFile = PdfFileReader(BytesIO(fs))
    

    【讨论】:

    • 嗨@JBT 你能检查这个答案,如果它回答了你的问题,标记为正确吗?
    • 我遇到了几乎完全相同的问题,您的解决方案奏效了。
    • 谢谢,我用这个来解决阅读 pymupdf -> fitz.open(stream=fs, filetype='pdf')
    猜你喜欢
    • 2019-07-06
    • 1970-01-01
    • 2022-10-05
    • 2020-09-15
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多