Python2.7实现PDF转图片需求

环境安装

PDF转IMG需要两个Python模块:PyPDF2(1.26.0)Wand(0.4.4),其中Wand安装前需要先安装软件ImageMagick,由于7.xx版本的接口改变,必须安装6.xx版本,以及GhostScriptPyPDF2Wand可以直接使用pip安装,主要两个软件以及环境配置需要根据系统环境不同进行不同操作。
由于自己开发用的Mac,生产环境覆盖了Linux和Windows,需要在这3种系统上进行环境安装,也是折腾了不少,以下简要列一下安装过程。

Mac环境

安装ImageMagick

brew install imagemagick@6

安装完后可以用命令convert --version来测试

软链接:

$ ln -s /usr/local/Cellar/imagemagick@6/6.9.9-49/lib/libMagickWand-6.Q16.dylib /usr/local/lib/libMagickWand.dylib

添加至系统环境:

echo 'export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"' >> ~/.bash_profile
. ~/.bash_profile

安装GhostScript

brew install gs

Linux环境

安装ImageMagickGhostScript

yum install ImageMagick

选择安装6.xx版本,由于依赖关系,会自动安装GhostScript

Windows环境

  1. 下载ImageMagick
  2. 相关安装及配置
  3. 下载安装GhostScript

windows环境下配合Wand0.4.4使用的时候,加载Wand后,python读取的环境变量Path变成了unicode类型,导致启动webdirver时会报“TypeError: environment can only contain strings”,可以在引入Wand后,将path修改回str类型

import os
import wand
os.environ['path'] = str(os.environ['path'])

代码实现

考虑PDF会有多页的情况,每一页PDF会生成单独的一张图片,如有需求,可以用PIL将多张图片进行合并。

import io

from wand.image import Image
from wand.color import Color
from PyPDF2 import PdfFileReader, PdfFileWriter
from PIL import Image as PIL_Image


def pdf_to_img(pdf_path, resolution=200, img_suffix='jpeg'):
    """
    PDF转图片
    :param pdf_path: PDF路径
    :param resolution: 分辨率
    :param img_suffix: 图片后缀名
    :return: List 图片路径列表
    """
    pdf_file = PdfFileReader(pdf_path, strict=False)
    pages = pdf_file.getNumPages()
    img_list = []
    for page in range(pages):
        page_obj = pdf_file.getPage(page)
        dst_pdf = PdfFileWriter()
        dst_pdf.addPage(page_obj)
        pdf_bytes = io.BytesIO()
        dst_pdf.write(pdf_bytes)
        pdf_bytes.seek(0)
        img = Image(file=pdf_bytes, resolution=resolution)
        img.format = img_suffix
        img.compression_quality = 90  # 图片质量压缩
        img.background_color = Color('white')
        img_path = pdf_path.replace('.pdf', '_{}.{}'.format(page, img_suffix))\
            if page > 0 else pdf_path.replace('.pdf', '.{}'.format(img_suffix))
        img.save(filename=img_path)
        img.destroy()
        img_list.append(img_path)
    if len(img_list) > 1:  # 多图上下拼接
        return _merge_img(img_list)
    elif len(img_list) == 0:  # 异常情况,无图片生成
        return ''
    else:
        return img_list[0]


def _merge_img(img_list):
    """拼接图片"""
    if img_list:
        img_name = img_list[0]
        color_mod = 'RGBA' if img_name.endswith('.png') else 'RGB'  # jpeg格式不支持RGBA
        first_img = PIL_Image.open(img_list[0])
        height_size = first_img.size[1]
        total_width = first_img.size[0]
        total_height = height_size * len(img_list)
        left = 0
        right = height_size
        target = PIL_Image.new(color_mod, (total_width, total_height))  # 最终拼接的图像的大小
        for img in img_list:
            target.paste(PIL_Image.open(img), (0, left, total_width, right))
            left += height_size
            right += height_size
        target.save(img_name, quality=100)
        return img_name
    else:
        return ''

注意事项

通过读PyPDF2的源码可以发现:

encrypt = self.trailer['/Encrypt'].getObject()
    if encrypt['/Filter'] != '/Standard':
        raise NotImplementedError("only Standard PDF encryption handler is available")
    if not (encrypt['/V'] in (1, 2)):
        raise NotImplementedError("only algorithm code 1 and 2 are supported")

如果PDF是有密码的,PyPDF2是支持输入密码的,但是仅限于其中两种密码算法,所以如果有密码需求的话,还需要测试下PyPDF2支不支持自己的PDF所用密码算法。

相关推荐
<p> 需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》, </p> <p> 课程链接 https://edu.csdn.net/course/detail/29865 </p> <h3> <span style="color:#3598db;">【为什么要学习这门课】</span> </h3> <p> <span>Linux</span>创始人<span>Linus Torvalds</span>有一句名言:<span>Talk is cheap. Show me the code. </span><strong><span style="color:#ba372a;">冗谈不够,放码过来!</span></strong> </p> <p> <span> </span>代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。 </p> <p> YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。 </p> <p> YOLOv4的实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。 </p> <h3> <span style="color:#3598db;">【课程内容与收获】</span> </h3> <p> 本课程将解析YOLOv4的实现原理和源码,具体内容包括: </p> <p> - YOLOv4目标检测原理<br /> - 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算<br /> - 代码阅读工具及方法<br /> - 深度学习计算的利器:BLAS和GEMM<br /> - GPU的CUDA编程方法及在darknet的应用<br /> - YOLOv4的程序流程 </p> <p> - YOLOv4各层及关键技术的源码解析 </p> <p> 本课程将提供注释后的darknet的源码程序文件。 </p> <h3> <strong><span style="color:#3598db;">【相关课程】</span></strong> </h3> <p> 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括: </p> <p> 《YOLOv4目标检测实战:训练自己的数据集》 </p> <p> 《YOLOv4-tiny目标检测实战:训练自己的数据集》 </p> <p> 《YOLOv4目标检测实战:人脸口罩佩戴检测》<br /> 《YOLOv4目标检测实战:中国交通标志识别》 </p> <p> 建议先学习一门YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。 </p> <h3> <span style="color:#3598db;">【YOLOv4网络模型架构图】</span> </h3> <p> 下图由白勇老师绘制 </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006291526195469.jpg" /> </p> <p>   </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202007011518185782.jpg" /> </p>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页