php项目中调用python脚本使用pdf和image之间相互转换

今天分享两个小案例,用Python将一堆图片转成Pdf文档,以及将Pdf文档转成一堆图片

php项目中调用python脚本使用pdf和image之间相互转换

今天分享两个小案例,用Python将一堆图片转成Pdf文档,以及将Pdf文档转成一堆图片

1、安装相关库
pip install PyMuPDF
2、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

上一篇:利用Python将PDF转html并提取文字和图片 下一篇:阿里开源数据同步组件Canal

评论

评论(0)

暂无评论