在某些情況下,您可能希望避免將內(nèi)容顯式保存為文件到磁盤,例如當(dāng)您想將 PDF 存儲(chǔ)在數(shù)據(jù)庫或 AWS S3 中時(shí)。
PyPDF2 支持將數(shù)據(jù)流式傳輸?shù)筋愃莆募膶?duì)象,方法如下。
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
假設(shè)你想操作一個(gè) PDF 并直接寫入 AWS S3,而不必先將文件寫入文件。我們?cè)?raw_bytes_data
?中擁有原始PDF的字節(jié)數(shù),并想設(shè)置?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
)
直接從云服務(wù)讀取 PDF
一種選擇是先下載文件,然后將本地文件路徑傳遞給 ?PdfReader
?。另一種選擇是獲取字節(jié)流。
對(duì)于 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 的工作方式類似(示例)
更多建議: