歡迎光臨
每天分享高質量文章

利用 Python 優雅地將 PDF 轉換成圖片

來自:陽明的博客

https://blog.qikqiak.com/post/python-convert-pdf-images/

之前收集了很多優秀的 PDF文件,但是需要看的時候不是很方便,需要去找到這個檔案,如果是在手機上的話往往還需要下載 PDF相關的插件才行,而且最大的問題是不便於資料的整理和分享。如果能夠將 PDF轉換成網頁,豈不是就能解決這些問題了?還能直接分享出去。

這裡利用 PyPDF包來處理 PDF檔案,為了方便快捷,我這裡直接將一個頁面轉換成圖片,就不需要去識別頁面中的每一個 PDF元素了,這是沒必要的。

轉換

核心代碼很簡單,就是將 PDF檔案讀取出來,轉換成 PdfFileReader,然後就可以根據 PyPDF2的API去獲得每一個頁面的二進制資料,拿到二進制資料過後,就能很方便的進行圖片處理了,這裡用 wand包來進行圖片處理。

  1. # -*- coding: utf-8 -*-

  2. import io

  3. from wand.image import Image

  4. from wand.color import Color

  5. from PyPDF2 import PdfFileReader, PdfFileWriter

  6. memo = {}

  7. def getPdfReader(filename):

  8.    reader = memo.get(filename, None)

  9.    if reader is None:

  10.        reader = PdfFileReader(filename, strict=False)

  11.        memo[filename] = reader

  12.    return reader

  13. def _run_convert(filename, page, res=120):

  14.    idx = page + 1

  15.    pdfile = getPdfReader(filename)

  16.    pageObj = pdfile.getPage(page)

  17.    dst_pdf = PdfFileWriter()

  18.    dst_pdf.addPage(pageObj)

  19.    pdf_bytes = io.BytesIO()

  20.    dst_pdf.write(pdf_bytes)

  21.    pdf_bytes.seek(0)

  22.    img = Image(file=pdf_bytes, resolution=res)

  23.    img.format = 'png'

  24.    img.compression_quality = 90

  25.    img.background_color = Color("white")

  26.    img_path = '%s%d.png' % (filename[:filename.rindex('.')], idx)

  27.    img.save(filename=img_path)

  28.    img.destroy()

需要註意的是一般PDF檔案較大,如果一次性轉換整個PDF檔案需要小心記憶體上限溢位的問題,我們這裡將第一次載入的整個PDF檔案儲存到記憶體,避免每次讀取的時候都重新載入。

批量處理

上面已經完成了一個 PDF頁面的轉換,要完成整個檔案的轉換就很簡單了,只需要拿到檔案的總頁碼,然後迴圈執行就行。考慮到轉換比較耗時,可以使用異步處理的方式加快速度。比如可以使用 celery來搭配處理,一定註意小心記憶體泄露。

核心代碼已經整理放到github上去了,好了,等有時間的時候準備做一個公共的 PDF轉成 H5的服務,開放給大眾使用。

花了點時間,做成了一個獨立的服務:https://pdfh5.com,歡迎大家試用


●編號414,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

演算法與資料結構

更多推薦18個技術類公眾微信

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂

© 2021 知識星球   网站地图