
今天分享两个小案例,用Python将一堆图片转成Pdf文档,以及将Pdf文档转成一堆图片
1、安装相关库
pip install PyMuPDF2、pdf文档转图片
目前Python将PDF文档转图片有三个常见模块:pdf2image、wind、PyMuPDF。不过pdf2image需要安装Poppler软件(Windows),wand还需要安装imagemagick和ghostscript软件,相对比较麻烦,所以现在只剩下最后一个PyMuPDF模块可以用了
# -*- coding:utf-8 -*-
# 所有的图片与PDF转换的操作都在这里进行定义
from multiprocessing import Pool
# 安装fitz需要安装PyMuPDF才能使用
import fitz
import os
import argparse
def pdf_to_jpg(dir, filename):
#拼接pdf的文件路径
pwd_name = os.path.join(dir, filename)
print(pwd_name)
doc = fitz.open(pwd_name)
# 将文件名同我们的保存路径拼接起来(保存图片的文件夹)
dir_name = os.path.splitext(filename)[0]
pdf_name = os.path.join(dir, dir_name)
print(pdf_name)
temp = 0
#(保存图片的文件夹)不存咋则生成
# exsitsdir.judge(pdf_name)
print(doc.page_count)
os.makedirs(pdf_name,exist_ok=True)
for pg in range(doc.page_count):
page = doc[pg]
temp += 1
rotate = int(0)
# 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
zoom_x = 2.0
zoom_y = 2.0
trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
pm = page.get_pixmap(matrix=trans, alpha=False)
pic_name = '{}.jpg'.format(temp)
#拼接生成pdf的文件路径
pic_pwd = os.path.join(pdf_name, pic_name)
print(pic_pwd)
pm.save(pic_pwd)
parser = argparse.ArgumentParser(description='manual to this script')
parser.add_argument('--d', type=str, default=None) #文件夹路径
parser.add_argument('--f', type=str, default=None) #文件名
args = parser.parse_args()
if __name__ == '__main__':
pdf_to_jpg(
dir = args.d,
filename = args.f
) #需要pdf切图就开启在php中调用如下
$command = 'python pdftoimg.py --d "d:/1" --f "d:/1.pdf"';
exec( $command, $output, $return);3、一推图片转成pdf文档
如何将图片转PDF文档?换言之也就是将图片插入到PDF文档中。Python操作PDF的库有很多,比如PyPDF2、pdfplumber、PyMuPDF等等。
我们可以继续沿用上次使用过的PyMuPDF模块
#coding=utf-8
import glob
import fitz
import os
import argparse
import shutil
def pic2pdf(img_dir, pdf_path):
doc = fitz.open()
for img in sorted(glob.glob("{}/*".format(img_dir))): # 读取图片,确保按文件名排序
print(img)
imgdoc = fitz.open(img) # 打开图片
pdfbytes = imgdoc.convert_to_pdf() # 使用图片创建单页的 PDF
imgpdf = fitz.open("pdf", pdfbytes)
doc.insert_pdf(imgpdf) # 将当前页插入文档
imgdoc.close()
if os.path.exists(pdf_path):
os.remove(pdf_path)
doc.save(pdf_path) # 保存pdf文件
doc.close()
remove_dir(img_dir)
def remove_dir(dir):
shutil.rmtree(dir)
def singlePic2pdf(img_path, pdf_path):
doc = fitz.open()
imgdoc = fitz.open(img_path) # 打开图片
pdfbytes = imgdoc.convert_to_pdf() # 使用图片创建单页的 PDF
imgpdf = fitz.open("pdf", pdfbytes)
doc.insert_pdf(imgpdf) # 将当前页插入文档
if os.path.exists(pdf_path):
os.remove(pdf_path)
doc.save(pdf_path) # 保存pdf文件
doc.close()
imgdoc.close()
parser = argparse.ArgumentParser(description='manual to this script')
parser.add_argument('--d', type=str, default=None) #图片文件夹路径
parser.add_argument('--p', type=str, default=None) #pdf文件路径
parser.add_argument('--t', type=int, default=0) #执行类型 0文件夹图片合并成pdf 1单张图片合成pdf
args = parser.parse_args()
if __name__ == '__main__':
if args.t == 0:
pic2pdf(
img_dir = args.d,
pdf_path = args.p,
)
elif args.t == 1:
singlePic2pdf(
img_path = args.d,
pdf_path = args.p,
)在php中调用如下
$command = 'python imgtopdf.py --d "d:/1" --p "d:/1.pdf" --t 0';
exec( $command, $output, $return);4、小结
实际上,很多我们操作Python操作PDF的场景,都可以用一些在线网站实现。那这种情况的话,没必要非要使用Python(学习为目的除外)。不过要批量操作大量的PDF文档,这时候Python代码的优越性就会体现出来了,写几行代码后面for循环慢慢执行就好了。
人生苦短,快学Python
评论
暂无评论
评论(0)