需要安装的库:

pip install fitz  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install PyMuPDF==1.18.14  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install img2pdf  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

程序:(运行一次生成一个pdf)

import fitz,os,img2pdf


file_path = r'C:\xx.pdf' # PDF 文件路径
dir_path = 'C:/Users/Desktop/output/output/' # 存放图片的文件夹

def pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle):  # zoom_x, zoom_y可以用来调整生成的图片的大小
    # 打开PDF文件
    pdf = fitz.open(pdfPath)
    # 逐页读取PDF
    for pg in range(0, pdf.pageCount):
        page = pdf[pg]
        # 设置缩放和旋转系数
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
        pm = page.getPixmap(matrix=trans, alpha=False)
        # 开始写图像
        pm.writePNG(imgPath + str(pg).zfill(3) + ".png")
        print(imgPath + str(pg).zfill(3) + ".png")
    pdf.close()

# def pic2pdf(img_dir):
#     doc = fitz.open()
#     for img in sorted(glob.glob("{}/*".format(img_dir))):  # 读取图片,确保按文件名排序
#         print(img)
#         imgdoc = fitz.open(img)  # 打开图片
#         pdfbytes = imgdoc.convertToPDF()  # 使用图片创建单页的 PDF
#         imgpdf = fitz.open("pdf", pdfbytes)
#         doc.insertPDF(imgpdf)  # 将当前页插入文档
#     if os.path.exists("allimages.pdf"):
#         os.remove("allimages.pdf")
#     doc.save("allimages.pdf")  # 保存pdf文件
#     doc.close()


def from_photo_to_pdf(photo_path):
    # 1、生成地址列表
    photo_list = os.listdir(photo_path)
    photo_list = [os.path.join(photo_path, i) for i in photo_list][0:-1]
    print(photo_list)

    # 1、指定pdf的单页的宽和高
    # A4纸张
    a4inpt = (img2pdf.mm_to_pt(210), img2pdf.mm_to_pt(297))
    # 我的自定义:
    # a4inpt = (img2pdf.mm_to_pt(720), img2pdf.mm_to_pt(1080))
    layout_fun = img2pdf.get_layout_fun(a4inpt)
    with open(photo_path+'/1result.pdf', 'wb') as f:
        f.write(img2pdf.convert(photo_list, layout_fun=layout_fun))


if __name__ == '__main__':
    # 将pdf转图片
    pdf_image(file_path, dir_path, 10, 10, 0)

    # 将图片合成pdf
    # pic2pdf(dir_path)
    from_photo_to_pdf(dir_path)

批量生成pdf:

import fitz,os,img2pdf


dir_path = 'C:/Users/DOUH/Desktop/pdf批量改页面大小/output/output/' # 存放图片的文件夹
PDFDIR_intput = "C:/Users/DOUH/Desktop/pdf批量改页面大小/output/AI-Lab 课件资料打印装订版_20230111/Training materials/"  # 原始PDF存放的路径
PDFDIR_output = "C:/Users/DOUH/Desktop/pdf批量改页面大小/outputPDF/"  # pdf导出后存放的路径

def pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle):
    # 打开PDF文件
    pdf = fitz.open(pdfPath)
    # 逐页读取PDF
    for pg in range(0, pdf.pageCount):
        page = pdf[pg]
        # 设置缩放和旋转系数
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
        pm = page.getPixmap(matrix=trans, alpha=False)
        # 开始写图像
        pm.writePNG(imgPath + str(pg).zfill(3) + ".png")
        print(imgPath + str(pg).zfill(3) + ".png")
    pdf.close()

def from_photo_to_pdf(photo_path,pdfName):
    # 1、生成地址列表
    photo_list = os.listdir(photo_path)
    photo_list = [os.path.join(photo_path, i) for i in photo_list][0:-1]
    print(photo_list)

    # 1、指定pdf的单页的宽和高
    # A4纸张
    a4inpt = (img2pdf.mm_to_pt(210), img2pdf.mm_to_pt(297))
    # 我的自定义:
    # a4inpt = (img2pdf.mm_to_pt(720), img2pdf.mm_to_pt(1080))
    layout_fun = img2pdf.get_layout_fun(a4inpt)
    with open(PDFDIR_output+pdfName, 'wb') as f:
        f.write(img2pdf.convert(photo_list, layout_fun=layout_fun))


if __name__ == '__main__':
    # # 将pdf转图片
    # pdf_image(file_path, dir_path, 10, 10, 0)
    #
    # # 将图片合成pdf
    # from_photo_to_pdf(dir_path)

        
    for filename in os.listdir(PDFDIR_intput):
        if filename[-3:] == "pdf":
            pdf_image(PDFDIR+filename, dir_path, 10, 10, 0)
            from_photo_to_pdf(dir_path,filename)

            # 清空所有图片(每生成一次pdf,就将转出的所有图片清空)
            for pngname in os.listdir(dir_path):
                os.remove(dir_path+pngname)


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐