将 pymupdf fitz 对象作为 pdf 保存到 s3

meg*_*egv 5 python pdf amazon-s3 aws-lambda pymupdf

我正在尝试使用 lambda 裁剪 pdf 并将其保存到具有相同名称的 s3 中。我在数据类型为 fitz.fitz.page 时收到错误

import os
import json
import boto3
from urllib.parse import unquote_plus
import fitz, sys
from io import BytesIO

OUTPUT_BUCKET_NAME = os.environ["OUTPUT_BUCKET_NAME"]
OUTPUT_S3_PREFIX = os.environ["OUTPUT_S3_PREFIX"]
SNS_TOPIC_ARN = os.environ["SNS_TOPIC_ARN"]
SNS_ROLE_ARN = os.environ["SNS_ROLE_ARN"]


def lambda_handler(event, context):

    textract = boto3.client("textract")
    if event:
        file_obj = event["Records"][0]
        bucketname = str(file_obj["s3"]["bucket"]["name"])
        filename = unquote_plus(str(file_obj["s3"]["object"]["key"]))
        
        doc = fitz.open()
        s3 = boto3.resource('s3')
        obj = s3.Object(bucketname, filename)
        fs = obj.get()['Body'].read()
        pdf=fitz.open("pdf", stream=BytesIO(fs))
        #pdf.close()
        
        
        rect=fitz.Rect(0.0, 0.0, 595.0, 842.0)
        #page = pdf[0]
        page1 = doc.new_page(width = rect.width,  # new page with ...
                       height = rect.height)
        page1.show_pdf_page(rect, pdf, 0)  
        print(type(doc))
        print(type(page1))
        
        s3.Bucket(bucketname).put_object(Key=filename, Body=page1)

Run Code Online (Sandbox Code Playgroud)

All*_*hua 1

发生这种情况是因为 page1 对象是使用定义的,fitz.fitz.page并且 S3 put 对象期望的类型是字节。

为了解决这个问题,您可以使用write新的 PDF ( doc) 函数并获取其字节格式的输出,然后您可以将其传递给 S3。

# Save fil first.
new_bytes = doc.write()
s3.Bucket(bucketname).put_object(Key=filename, Body=new_bytes)
Run Code Online (Sandbox Code Playgroud)