03.03 利用Python將PDF轉化為圖片的方法

python的功能真是強大,可以做詞雲圖、可以優雅地八卦、可以做遊戲外掛、還可以將PDF轉化成圖片,這個功能你還不知道吧,趕緊隨小編我一起來看看吧:

之前收集了很多優秀的 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的服務,開放給大眾使用。

最後,小編想說一句話:我是一名python開發工程師,整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習,面試寶典。想要這些資料的可以關注小編,私信小編“01”即可(免費分享哦)希望能對你有所幫助


分享到:


相關文章: