社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

利用 Python 优雅地将 PDF 转换成图片

编程派 • 6 年前 • 437 次点击  

作者: qikqiak

来源: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,欢迎大家试用

题图:pexels,CC0 授权。

点击阅读原文,查看更多 Python 教程和资源。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/1t9LkFKx1z
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/5362
 
437 次点击