在某些情况下,您可能希望避免将内容显式保存为文件到磁盘,例如当您想将 PDF 存储在数据库或 AWS S3 中时。

PyPDF2 支持将数据流式传输到类似文件的对象,方法如下。

from io import BytesIO

# Prepare example
with open("example.pdf", "rb") as fh:
    bytes_stream = BytesIO(fh.read())

# Read from bytes_stream
reader = PdfReader(bytes_stream)

# Write to bytes_stream
writer = PdfWriter()
with BytesIO() as bytes_stream:
    writer.write(bytes_stream)

将 PDF 直接写入 AWS S3

假设你想操作一个 PDF 并直接写入 AWS S3,而不必先将文件写入文件。我们在​raw_bytes_data​中拥有原始PDF的字节数,并想设置​my-secret-password​。

from io import BytesIO

import boto3
from PyPDF2 import PdfReader, PdfWriter


reader = PdfReader(BytesIO(raw_bytes_data))
writer = PdfWriter()

# Add all pages to the writer
for page in reader.pages:
    writer.add_page(page)

# Add a password to the new PDF
writer.encrypt("my-secret-password")

# Save the new PDF to a file
with BytesIO() as bytes_stream:
    writer.write(bytes_stream)
    bytes_stream.seek(0)
    s3 = boto3.client("s3")
    s3.write_get_object_response(
        Body=bytes_stream, RequestRoute=request_route, RequestToken=request_token
    )

直接从云服务读取 PDF

一种选择是先下载文件,然后将本地文件路径传递给 ​PdfReader​。另一种选择是获取字节流。

对于 AWS S3,它的工作方式如下:

from io import BytesIO

import boto3
from PyPDF2 import PdfReader


s3 = boto3.client("s3")
obj = s3.get_object(Body=csv_buffer.getvalue(), Bucket="my-bucket", Key="my/doc.pdf")
reader = PdfReader(BytesIO(obj["Body"].read()))

它与 Google Cloud Storage 的工作方式类似(示例