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

共 1509字,需浏览 4分钟

 ·

2019-10-17 23:02




NH8Ir7uYh6.png






作者:qikqiak


来源: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来搭配处理,一定注意小心内存占用。




浏览 53
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报