使用 AWS Lambda 將 PDF 轉換成圖片檔

更新於 發佈於 閱讀時間約 8 分鐘
raw-image


PyMuPDF 是一個高效能 Python 函式庫,用於 PDF(和其他)文件的資料擷取、分析、轉換和操作。

還有其他套件可使用 PyPDF2、 pdf2image,有嘗試過 pdf2image 對部分中文會消失。


執行過程為,將 PDF 檔案上傳至 S3 Bucket > 觸發 AWS Lambda 轉換檔案 >把結果圖片放置到 S3 Bucket


這裡的 Lambda 採用 docker image 來建置,將程式碼和相依性打包到 Docker 映像中。 Dockerfile 應包含程式碼正確運作所需的依賴項和環境設定。

因此,我決定嘗試使用 Docker 建立自己的環境,由於它可以從一開始就安裝在執行環境中,因此不再需要使用 Lambda Layer。


設定部署環境

步驟1:建立 S3 Bucket

創建兩個資料夾,來放PDF與輸出的圖片檔

raw-image


步驟2:編寫 Python 程式碼

app.py

import boto3
import fitz # PyMuPDF
import concurrent.futures

# 創建 S3 存儲桶中的資料夾
def create_folder(s3_client, bucket_name, folder_name):
s3_client.put_object(Bucket=bucket_name, Key='IMG/' + folder_name + '/')

# 將 PDF 頁面轉換為 JPG 圖像
def convert_page_to_jpg(s3_client, page, folder_name, bucket_name, object_key):
pixmap = page.get_pixmap(dpi=400) #DPI影響轉換速度
img = pixmap.tobytes()
# 將 JPG 圖像上傳至 S3,檔案名稱包含物件名稱和頁碼
s3_client.put_object(Bucket=bucket_name, Key=f'IMG/{folder_name}/{object_key.split("/")[-1].split(".")[0]}-page-{page.number}.jpg', Body=img)

# 將整個 PDF 轉換為 JPG 圖像
def convert_pdf_to_jpg(s3_client, pdf_doc, folder_name, bucket_name, object_key):
with concurrent.futures.ThreadPoolExecutor() as executor:
# 使用多執行緒處理 PDF 的每一頁
executor.map(lambda page: convert_page_to_jpg(s3_client, page, folder_name, bucket_name, object_key), pdf_doc)

# 處理 S3 事件
def handle_s3_event(event, context):
# 創建 S3 客戶端
s3_client = boto3.client('s3')
# 獲取 S3 事件相關資訊
bucket_name = event['Records'][0]['s3']['bucket']['name']
object_key = event['Records'][0]['s3']['object']['key']
# 從 S3 中獲取 PDF 文件
obj = s3_client.get_object(Bucket=bucket_name, Key=object_key)
pdf_content = obj['Body'].read()

# 使用物件名稱作為資料夾名稱
folder_name = object_key.split('/')[-1].split('.')[0]
# 創建資料夾,存轉換後的圖像
create_folder(s3_client, bucket_name, folder_name)

# 使用 PyMuPDF 開啟 PDF 文件
pdf_doc = fitz.open(stream=pdf_content)
# 將 PDF 轉換為 JPG 並上傳至 S3
convert_pdf_to_jpg(s3_client, pdf_doc, folder_name, bucket_name, object_key)

def handler(event, context):
try:
# 處理 S3 事件
handle_s3_event(event, context)
print("Successfully converted PDF to JPG and uploaded to S3")
except Exception as e:
# 處理錯誤,並拋出異常
error_msg = "An error occurred: {}".format(e)
print(error_msg)
raise Exception(error_msg)


步驟3:編寫 Dockerfile

FROM public.ecr.aws/lambda/python:3.12

RUN pip3 install PyMuPDF boto3

# Copy function code

COPY app.py ./

CMD [ "app.handler" ]


步驟4:建立AWS ECR

步驟5:將 Docker Image推送到 AWS ECR,這裡採用Cloud 9

步驟6:建立 Lambda 函數

raw-image

必須新增權限角色以允許 Lambda 存取 S3,這裡為了方便使用 AmazonS3FullAccess

raw-image


步驟7 : 設置Memory 與 Timeout,根據檔案實際情況調整,

檔案大小、頁面複雜度都會影響。

raw-image


步驟8 : 設置觸發來源

raw-image


步驟9 : 觸發 Lambda 測試

為了檢查轉換過程是否正常,我們將 PDF 檔案上傳到 S3 儲存桶並讓 Lambda 函數對其進行轉換。該過程完成後,我們將檢查輸出以確保其符合我們的期望。

這裡以台積電年報為例,請注意 pdf 檔名不能中文

raw-image

Billed Duration: 281148 ms Max Memory Used: 995 MB

raw-image

可以看到結果還是可以

raw-image


結論

將PDF轉換為圖像對於各行各業和企業都是一項極具價值的工具。透過AWS Lambda和Docker的部署,能夠高效地實現這一轉換,無論是用於在網站上展示PDF或進一步處理,都無需煩惱基礎設施管理的問題。儘管有許多其他在線工具可供選擇,但利用AWS Lambda和Docker提供了一個強大且可擴展的解決方案。


參考

https://pymupdf.readthedocs.io/en/latest/

https://note.leoxyz.com/post/convert-pdf-to-image-with-aws-python-lambda-function-and-docker-deployment



留言
avatar-img
留言分享你的想法!
D&Y熊繪生-avatar-img
2024/06/05
感謝分享練習Dockerfile的教學
avatar-img
西尼亞ming的沙龍
16會員
80內容數
西尼亞ming的沙龍的其他內容
2024/11/05
在ops-agent當中可以安裝 JVM 來收集 Java 參數,該工具主要收集 memory 以及 garbage collection 的參數,其中監控的選項有包含以下: jvm.classes.loaded jvm.gc.collections.count jvm.gc.collec
2024/11/05
在ops-agent當中可以安裝 JVM 來收集 Java 參數,該工具主要收集 memory 以及 garbage collection 的參數,其中監控的選項有包含以下: jvm.classes.loaded jvm.gc.collections.count jvm.gc.collec
2024/11/05
**Google Cloud 操作與 Audit Logs 說明** Google Cloud 作為純雲端服務提供商,所有操作均透過 HTTPS 網頁或 API 呼叫完成,並無「登入專案」的行為紀錄。不過,若使用 Google Workspace 管理使用者身份,則可以透過 Google
2024/11/05
**Google Cloud 操作與 Audit Logs 說明** Google Cloud 作為純雲端服務提供商,所有操作均透過 HTTPS 網頁或 API 呼叫完成,並無「登入專案」的行為紀錄。不過,若使用 Google Workspace 管理使用者身份,則可以透過 Google
2024/11/05
使用 Storage Transfer 服務是否能降低成本? Storage Transfer 的計價方式針對從 Cloud Storage 轉移至 Cloud Storage,除了一般費用外,Storage 移轉服務會使用 Cloud Storage rewrite 作業在 Cloud
2024/11/05
使用 Storage Transfer 服務是否能降低成本? Storage Transfer 的計價方式針對從 Cloud Storage 轉移至 Cloud Storage,除了一般費用外,Storage 移轉服務會使用 Cloud Storage rewrite 作業在 Cloud
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
前端 為了實驗我們上傳的 Docker Image 有沒有問題,我們先在學一個刪除本地 Docker Image,刪除 Docker Image 要使用 docker rmi <image> 這個語法,現在開始刪除本地 Docker Image 輸入以下指令 docker rmi timmmmm
Thumbnail
前端 為了實驗我們上傳的 Docker Image 有沒有問題,我們先在學一個刪除本地 Docker Image,刪除 Docker Image 要使用 docker rmi <image> 這個語法,現在開始刪除本地 Docker Image 輸入以下指令 docker rmi timmmmm
Thumbnail
本文介紹了使用PyMuPDF,AWS Lambda和Docker將PDF文件轉換為圖像的高效方法。同時提到了在執行過程中可能會遇到的部分問題和解決方法。
Thumbnail
本文介紹了使用PyMuPDF,AWS Lambda和Docker將PDF文件轉換為圖像的高效方法。同時提到了在執行過程中可能會遇到的部分問題和解決方法。
Thumbnail
R036 Blog API 伺服器的維護更新日誌 (2024/04/30) 開發環境技術 語言: Javascript 環境: Node JS 框架: Express.js 本次維護目的 優化及測試API伺服器程運行 重溫程式碼架構以便日後更新優化 Reac
Thumbnail
R036 Blog API 伺服器的維護更新日誌 (2024/04/30) 開發環境技術 語言: Javascript 環境: Node JS 框架: Express.js 本次維護目的 優化及測試API伺服器程運行 重溫程式碼架構以便日後更新優化 Reac
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
前言 大家好上次我們教了如何建立自己的 Docker Image,今天我們要來教怎麼把自己做好的 Docker Image 上傳到 Docker Hub,如果以後自己在公司有搭建 Docker Registry,也可以用同樣方式上傳到公司的 Docker Registry 私有倉庫 登入 Doc
Thumbnail
前言 大家好上次我們教了如何建立自己的 Docker Image,今天我們要來教怎麼把自己做好的 Docker Image 上傳到 Docker Hub,如果以後自己在公司有搭建 Docker Registry,也可以用同樣方式上傳到公司的 Docker Registry 私有倉庫 登入 Doc
Thumbnail
前言 大家好上次我們教了如何下載 Docker Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 大家好上次我們教了如何下載 Docker Image 使用,今天我們要教如何產出自己的 Image,這次會使用一個 Dockerfile 範例,自行打包 Docker Image,初步練習使用 Docker 指令 下載 Dockerfile 教學檔案 在這裡我已經幫忙寫好一個 Docke
Thumbnail
前言 上次講到 Dockerfile、DockerImage、Docker Container 他們之間的關係,今天我們要來熟悉 Docker Image 如何使用,教你如何抓取雲端上的 Docker Image, Docker Image 下載來源 當我們今天要要使用 Docker Imag
Thumbnail
前言 上次講到 Dockerfile、DockerImage、Docker Container 他們之間的關係,今天我們要來熟悉 Docker Image 如何使用,教你如何抓取雲端上的 Docker Image, Docker Image 下載來源 當我們今天要要使用 Docker Imag
Thumbnail
在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。 現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的
Thumbnail
在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。 現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News