上周同事发过来一个需求,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)