这里使用了三个工具包分别为 PyMuPDF
、reportlab
以及 PIL
,所以这三个工具包需要提前安装,但是注意不要使用 pip install fitz
安装 fitz
,因为这里使用的 fitz
是 PyMuPDF
里的,如果再安装 fitz
, 会因为命名冲突导致调用失败。
首先是库的导入:
import os
import sys
import fitz
from reportlab.lib.pagesizes import portrait
from reportlab.pdfgen import canvas
from PIL import Image
先进行 PDF 转图片的操作,使用 fitz
打开后缩放保存:
def pdf2img(filename=r'./document.pdf'):
# 打开PDF文件,生成一个对象
doc = fitz.open(filename)
print("共",doc.pageCount,"页")
for pg in range(doc.pageCount):
print("
转换为图片",pg+1,"/",doc.pageCount,end="")
page = doc[pg]
rotate = int(0)
# 每个尺寸的缩放系数为8,这将为我们生成分辨率提高64倍的图像。
zoom_x = 8.0
zoom_y = 8.0
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pm = page.getPixmap(matrix=trans, alpha=False)
pm.writePNG(r'./tu'+'{:02}.png' .format(pg))
print()
然后是图片转 PDF ,使用 PIL.Image
获取图片大小后使用 reportlab.pdfgen.canvas
保存为 PDF:
def getimgfile(input_paths, file_type=".png"):
pathDir = os.listdir(input_paths)
imglist = list()
for i in pathDir:
if file_type in i:
imglist.append(i)
return imglist
def imgtopdf(input_paths="./", outputpath="./docimg.pdf", file_type=".png"):
imglist = getimgfile(input_paths, file_type)
(maxw, maxh) = Image.open(imglist[0]).size
c = canvas.Canvas(outputpath, pagesize=portrait((maxw, maxh)))
for i in range(len(imglist)):
print("
转换为PDF",i+1,"/",len(imglist),end="")
c.drawImage(imglist[i], 0, 0, maxw, maxh)
c.showPage()
os.remove(imglist[i])
c.save()
最后使用一下语句便可实现转换:
if __name__ == "__main__":
pdf2img(filename=r'./document.pdf')
imgtopdf(input_paths="./", outputpath="./docimg.pdf", file_type=".png")
print("
转换完成!")
当然如果使用图片转PDF时的图片类型不是 .png
的话,可以修改 getimgfile
中的文件类型 file_type
。