• python实现pdf双页文档转png图片,png图片裁剪为左右两等分,再合并为新的pdf单页文档


    一、问题引入

    现有pdf双页文档如下:
    在这里插入图片描述
    现按照以下页码次序对pdf双页文档进行裁剪和拼接,其中有两点需要特别注意,一是封面页只裁剪中间部分,二是文档是从右往左的顺序排版的
    在这里插入图片描述

    二、python程序

    import os
    import office
    from PIL import Image
    import img2pdf
    
    
    # 新建两个文件夹分别存储裁剪前和裁剪后的图片
    def newfolders():
        for folder in ['images before cropping', 'images after cropping']:
            if os.path.isdir(folder) == False:
                os.mkdir(folder)
    
    
    # pdf双页文档转为多张png图片
    def pdf_to_images(pdf_path):
        office.pdf.pdf2imgs(pdf_path=pdf_path, out_dir='images before cropping')
    
    
    # png图片批量裁剪为左右两等分
    def images_cropping(pdf_name):
        images = os.listdir('images before cropping')
        images.sort(key=lambda x: int(x.replace(' [' + pdf_name.split('.')[0] + ']-', '').split('.')[0]))
        index = 0
        for image in images:
            image = Image.open('images before cropping/' + image)
            width, height = image.size
            item_width = int(width / 2)
            item_height = int(height / 2)
            box_list = []
            if index == 0:
                box = (int(item_width / 2), 0, int(item_width * 3 / 2), height)
                box_list.append(box)
            else:
                for i in range(2):
                    # box = (i * item_width, 0, (i + 1) * item_width, height)  # 从左往右
                    box = (abs(i - 1) * item_width, 0, (abs(i - 1) + 1) * item_width, height)  # 从右往左
                    box_list.append(box)
            image_list = [image.crop(box) for box in box_list]
            for j in range(len(image_list)):
                image_list[j].save('images after cropping/' + str(2 * index + 1 + j) + '.png', 'PNG')
            index += 1
    
    
    # 裁剪后的png图片合并为新的pdf单页文档
    def images_to_pdf(pdf_name):
        images = os.listdir('images after cropping')
        images.sort(key=lambda x: int(x.split('.')[0]))
        images = ['images after cropping/' + i for i in images]
        with open('pdf/' + pdf_name, 'wb') as f:
            f.write(img2pdf.convert(images))
    
    
    if __name__ == '__main__':
        pdf_name = '名探偵コナン日本語版第100巻.pdf'
        new_pdf_name = '名侦探柯南日文版第100卷.pdf'
        pdf_path = 'pdf/' + pdf_name
        newfolders()  # 新建两个文件夹分别存储裁剪前和裁剪后的图片
        pdf_to_images(pdf_path)  # pdf双页文档转为多张png图片
        images_cropping(pdf_name)  # png图片批量裁剪为左右两等分
        images_to_pdf(new_pdf_name)  # 裁剪后的png图片合并为新的pdf单页文档
    
        # 文档树:
        # │  main.py
        # │
        # ├─images after cropping
        # │      1.png
        # │      10.png
        # │      100.png
        # │      101.png
        # │      102.png
        # │      103.png
        #        ……
        # │      95.png
        # │      96.png
        # │      97.png
        # │      98.png
        # │      99.png
        # │
        # ├─images before cropping
        # │      [名探偵コナン日本語版第100巻]-0.jpg
        # │      [名探偵コナン日本語版第100巻]-1.jpg
        # │      [名探偵コナン日本語版第100巻]-10.jpg
        # │      [名探偵コナン日本語版第100巻]-100.jpg
        # │      [名探偵コナン日本語版第100巻]-11.jpg
        # │      [名探偵コナン日本語版第100巻]-12.jpg
        # │      [名探偵コナン日本語版第100巻]-13.jpg
        #        ……
        # │      [名探偵コナン日本語版第100巻]-95.jpg
        # │      [名探偵コナン日本語版第100巻]-96.jpg
        # │      [名探偵コナン日本語版第100巻]-97.jpg
        # │      [名探偵コナン日本語版第100巻]-98.jpg
        # │      [名探偵コナン日本語版第100巻]-99.jpg
        # │
        # └─pdf
        #        名侦探柯南日文版第100卷.pdf
        #        名探偵コナン日本語版第100巻.pdf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96

    三、效果展示

    在这里插入图片描述

  • 相关阅读:
    71.【MySQL-二刷】
    【从入门到入土】Java SE 反射机制1(从JDBC回来的!!)
    Google Earth Engine ——重采样过程中的错误
    自己动手写线程池——向JDK线程池进发
    学习MySQL 临时表
    docker安装seata(指定配置文件、数据库、容器数据卷等)
    上周热点回顾(11.21-11.27)
    jdbc技术实现插入数据,更新和删除操作,查询操作
    上周热点回顾(3.20-3.26)
    下载 Windows11 23H2 官方系统镜像
  • 原文地址:https://blog.csdn.net/m0_67790374/article/details/132621108