利用Python優(yōu)雅地將PDF轉換成圖片

作者:qikqiak
來源:https://blog.qikqiak.com/post/python-convert-pdf-images/
之前收集了很多優(yōu)秀的??PDF文檔,但是需要看的時候不是很方便,需要去找到這個文件,如果是在手機上的話往往還需要下載??PDF相關的插件才行,而且最大的問題是不方便資料的整理和如果能夠將??PDF轉換成網頁,豈不是能夠解決這些問題了?還能直接分享出去。
這里利用??PyPDF包來處理??PDF文件,為了方便快捷,我這里直接將一個頁面轉換成圖片,就不需要去識別頁面中的每一個??PDF元素了,這是沒必要的。
轉換
核心代碼很簡單,就是將??PDF文件讀取出來,轉換成??PdfFileReader,然后就可以根據(jù)??PyPDF2的API去獲得每個一個頁面的二進制數(shù)據(jù),拿到二進制數(shù)據(jù)過后,就能很方便的進行圖片處理了,這里用??wand包來進行圖片處理。
# -*- coding: utf-8 -*-
import io
from wand.image import Image
from wand.color import Color
from PyPDF2 import PdfFileReader, PdfFileWriter
memo = {}
def getPdfReader(filename):
? ?reader = memo.get(filename, None)
? ?if reader is None:
? ? ? ?reader = PdfFileReader(filename, strict=False)
? ? ? ?memo[filename] = reader
? ?return reader
def _run_convert(filename, page, res=120):
? ?idx = page + 1
? ?pdfile = getPdfReader(filename)
? ?pageObj = pdfile.getPage(page)
? ?dst_pdf = PdfFileWriter()
? ?dst_pdf.addPage(pageObj)
? ?pdf_bytes = io.BytesIO()
? ?dst_pdf.write(pdf_bytes)
? ?pdf_bytes.seek(0)
? ?img = Image(file=pdf_bytes, resolution=res)
? ?img.format = 'png'
? ?img.compression_quality = 90
? ?img.background_color = Color("white")
? ?img_path = '%s%d.png' % (filename[:filename.rindex('.')], idx)
? ?img.save(filename=img_path)
? ?img.destroy()
需要注意的是一般PDF文件合并,如果一次性轉換整個PDF文件需要小心緩存重疊的問題,我們這里將第一次加載的整個PDF文件保存到內存,避免每次重新放置的時候都重新加載入。
批量處理
上面已經完成了一個??PDF頁面的轉換,要完成整個文件的轉換就很簡單了,只需要拿到文件的總頁碼,然后循環(huán)執(zhí)行就行。考慮到轉換比較耗時,可以使用反向處理的方式加快速度。例如可以使用??celery來搭配處理,一定注意小心內存占用。
評論
圖片
表情
