來自:陽明的部落格
https://blog.qikqiak.com/post/python-convert-pdf-images/
之前收集了很多優秀的 PDF
檔案,但是需要看的時候不是很方便,需要去找到這個檔案,如果是在手機上的話往往還需要下載 PDF
相關的外掛才行,而且最大的問題是不便於資料的整理和分享。如果能夠將 PDF
轉換成網頁,豈不是就能解決這些問題了?還能直接分享出去。
這裡利用 PyPDF
包來處理 PDF
檔案,為了方便快捷,我這裡直接將一個頁面轉換成圖片,就不需要去識別頁面中的每一個 PDF
元素了,這是沒必要的。
轉換
核心程式碼很簡單,就是將 PDF
檔案讀取出來,轉換成 PdfFileReader
,然後就可以根據 PyPDF2
的API去獲得每一個頁面的二進位制資料,拿到二進位制資料過後,就能很方便的進行圖片處理了,這裡用 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
頁面的轉換,要完成整個檔案的轉換就很簡單了,只需要拿到檔案的總頁碼,然後迴圈執行就行。考慮到轉換比較耗時,可以使用非同步處理的方式加快速度。比如可以使用 celery
來搭配處理,一定註意小心記憶體洩露。
核心程式碼已經整理放到github上去了,好了,等有時間的時候準備做一個公共的 PDF
轉成 H5
的服務,開放給大眾使用。
花了點時間,做成了一個獨立的服務:https://pdfh5.com,歡迎大家試用
●編號414,輸入編號直達本文
●輸入m獲取文章目錄
演演算法與資料結構
更多推薦《18個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。