上周同事发过来一个需求,300 页的 PDF 文件,需要每页转成图片,再将这些图片按顺序插入到 Word 文档。要的比较急,只有一个小时来处理。本着能剥削机器,绝不多动一下手的懒劲,这个活就交给 Python 吧。

花了 15 分钟检索,找到相应的解决办法。剩下的就是轻体力的搬运了,话说懒人是真的适合编程。拆解下问题,先把 PDF 每页变成图片,再将图片插入到 Word 中,完活。

故写了两个函数,分别实现上述功能。实现过程中,一个小的问题是 pdf2image 使用中涉及一个依赖库「poppler」的调用问题,这个库安装起来相对麻烦,其余都是 stack overflow 上找现成的代码即可。

面向 stack overflow 的编程,真不是说说而已。编程思维的一个难点是怎么用英文把问题描述清楚,也就是优雅的提问技巧。

附上源码,供有同样问题的同学参考。


#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import os
from pdf2image import convert_from_path
from docx import Document
from docx.shared import Inches


def pdf2Img(filePath, fileToRead, imgSavePath):
    dpiImage = 100
    pdfTransformFile = filePath + '/' + fileToRead
    pagesImg = convert_from_path(pdfTransformFile, dpiImage)

    if not os.path.exists(imgSavePath):
        os.mkdir(imgSavePath)

    for i in range(len(pagesImg)):
        pageTransform = pagesImg[i]
        print('pdfImg_{}.jpg Done'.format(i))
        pageTransform.save(imgSavePath + '/' + 'output_{}.jpg'.format(i), 'JPEG')


def img2Word(imgSavePath, wordSavePath):
    document = Document()
    p = document.add_paragraph('Picture bullet section', 'List Bullet')
    p = p.insert_paragraph_before('')
    r = p.add_run()

    for imgs in range(len(os.listdir(imgSavePath))):
        r.add_picture(imgSavePath + '/' + 'output_' + str(imgs) + '.jpg', height=Inches(8))
    document.save(wordSavePath + '/' + 'testReport.docx')


if __name__ == "__main__":
    filePath = os.getcwd()
    wordSavePath = filePath
    pdf2Img(filePath, '报告.pdf', 'imgToSave')
    img2Word('imgToSave', wordSavePath)