繁体   English   中英

创建 AWS lambda function 以在 s3 存储桶中拆分 pdf 个文件

[英]Creating an AWS lambda function to split pdf files in a s3 bucket

我想写一个 AWS Lambda function :

从 s3 存储桶中取出 pdf 文件 -> 拆分 pdf 文件 -> 将拆分文件存储到 S3 存储桶。
我正在使用 PyPDF 模块,所以我还需要知道如何在 aws lambda function 中使用它。

拆分pdf个文件的代码:

import os
from PyPDF2 import PdfFileReader, PdfFileWriter

pdf_file_path = 'filename.pdf'
file_base_name = pdf_file_path.replace('.pdf','')
output_folder_path = os.path.join(os.getcwd(), 'output')

pdf = PdfFileReader(pdf_file_path)

for page_num in range(pdf.numPages):
    pdfWriter = PdfFileWriter()
    pdfWriter.addPage(pdf.getPage(page_num))

    with open(os.path.join(output_folder_path, '{0}_Page{1}.pdf'.format(file_base_name,page_num+1)), 'wb') as f:
        pdfWriter.write(f)
        f.close()

我的 lambda function 应该是什么?(代码)

您的 lambda 代码需要看起来像这样。 在这种情况下,我正在使用 boto3 读取 S3 文件。 您在活动中将 arguments 传递给您的 lambda function。

import boto3
from content_reader_lambda.pdf import reader

def read_pdf_from_bucket(event, context):
    bucket_name = event['bucket_name']
    file_name = event['file_name']
    s3 = boto3.resource('s3')
    obj = s3.Object(bucket_name, file_name)
    s3_file = obj.get()['Body'].read()
    return reader.pdf_as_text(s3_file, 'pdf')

我正在使用 pymupdf 读取 PDF 并返回这样的文本。

def pdf_as_text(file_stream, filetype):
    text = ''
    with fitz.open(stream=file_stream, filetype=filetype) as doc:
        for page in doc:
            # Sort reads the text in display/reading order.  https://pymupdf.readthedocs.io/en/latest/page.html#Page.get_textpage
            text+= page.get_text('text', sort=True)
    return text

您可以将其替换为您的代码并使用 boto3 将您的 PDF 写回 S3。

将您的 lambda 与您使用的第三方库一起部署到 AWS 是一个完全不同的主题。 为此,我建议使用图层。 鉴于 AWS 大小限制,较小的库更容易部署。

pypdf可以使用文件流(文档):

读:

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)

写作:

from io import BytesIO

import boto3
from pypdf 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
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM