簡體   English   中英

將 pymupdf fitz object 作為 pdf 保存到 s3

[英]Saving a pymupdf fitz object to s3 as a pdf

我正在嘗試裁剪 pdf 並使用 lambda 將其保存到具有相同名稱的 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)

出於某種原因,我的doc.write()方法沒有返回字節 object 如上所述。 這是創建新doc的另一種方法,使用BytesIO轉換為字節,然后將其作為pdf保存到s3

import fitz
from io import BytesIO

client = boto3.client("s3")

# create new doc object
single_page = fitz.open()

# insert a page from original_pdf_doc
single_page.insert_pdf(
    original_pdf_doc, from_page=from_page_num, to_page=to_page_num
)

# Use BytesIO and .write() method to save to a bytes object
bytes_ = BytesIO(single_page.write())

# Upload the bytes object!
client.put_object(Body=bytes_, Bucket=bucket, Key=key)

發生這種情況是因為 page1 object 是使用fitz.fitz.page定義的,而 S3 put object 所期望的類型是字節。

為了解決這個問題,您可以使用新的 PDF ( doc ) 的write function 並獲取 output 然后它可以以字節格式傳遞給您。

# Save fil first.
new_bytes = doc.write()
s3.Bucket(bucketname).put_object(Key=filename, Body=new_bytes)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM