吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1621|回复: 40
上一主题 下一主题
收起左侧

[Python 原创] pdf逐页转换成png

  [复制链接]
跳转到指定楼层
楼主
naonao211 发表于 2024-10-27 15:35 回帖奖励
本帖最后由 naonao211 于 2024-11-2 16:34 编辑

2024.11.02更新,增加图片合并功能,可指定合并页数(多少页合并到一个图片),以及合并方向:横向合并或纵向合并
代码如下:
[Python] 纯文本查看 复制代码
import os
from PyPDF2 import PdfReader
from pdf2image import convert_from_path
from PIL import Image


def convert_pdf_to_images(pdf_path, output_folder):
    # 创建输出文件夹如果不存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 打开PDF文件
    with open(pdf_path, 'rb') as file:
        reader = PdfReader(file)
        num_pages = len(reader.pages)

        # 遍历每一页
        for page_number in range(num_pages):
            # 将PDF页面转换为图像
            images = convert_from_path(pdf_path, first_page=page_number + 1, last_page=page_number + 1)
            image = images[0]
            # 保存图像
            image_filename = f"{output_folder}/{page_number + 1:03d}.png"
            image.save(image_filename, "PNG")
            print(f"Saved {image_filename}")


def merge_images(image_files, output_path, num_per_merge, direction):
    images = [Image.open(img) for img in image_files]
    widths, heights = zip(*(i.size for i in images))

    if direction == 1:  # 横向合并
        total_width = sum(widths)
        max_height = max(heights)
    else:  # 竖向合并
        total_width = max(widths)
        max_height = sum(heights)

    new_im = Image.new('RGB', (total_width, max_height))

    if direction == 1:  # 横向合并
        x_offset = 0
        for im in images:
            new_im.paste(im, (x_offset, 0))
            x_offset += im.size[0]
    else:  # 竖向合并
        y_offset = 0
        for im in images:
            new_im.paste(im, (0, y_offset))
            y_offset += im.size[1]

    new_im.save(output_path)
    print(f"合并后的图片保存在: {output_path}")


def main():
    num_per_merge = int(input("输入多少个页面合并到一个图片中,例如2,则每2页合并为一个图片: "))
    direction = int(input("横向合并输入1,竖向合并输入2: "))
    pdf_files = [f for f in os.listdir('.') if f.endswith('.pdf')]

    for pdf_file in pdf_files:
        output_folder = f'转换后_{pdf_file[:-4]}'
        convert_pdf_to_images(pdf_file, output_folder)

        image_files = sorted([f"{output_folder}/{img}" for img in os.listdir(output_folder)])

        for i in range(0, len(image_files), num_per_merge):
            merge_images(image_files[i:i + num_per_merge], f"{output_folder}/merged_{i // num_per_merge + 1}.png",
                         num_per_merge, direction)


if __name__ == "__main__":
    main()


效果图:



前两天看到有人发pdf转图片的软件,正好自己也在学python,就用Python写了一个,它可以自动检测当前py文件目录下的pdf文件,然后逐页转换成png格式,并存储到目录下的“转换后的文件夹”,文件名以001,002,003...命名。效果图:

注意:pdf2image库需要安装Poppler,安装后需要重启代码编辑器

代码:
[Python] 纯文本查看 复制代码
import os
from PyPDF2 import PdfReader
from pdf2image import convert_from_path

def convert_pdf_to_images(pdf_path, output_folder):
    # 创建输出文件夹如果不存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 打开PDF文件
    with open(pdf_path, 'rb') as file:
        reader = PdfReader(file)
        num_pages = len(reader.pages)

        # 遍历每一页
        for page_number in range(num_pages):
            # 将PDF页面转换为图像
            images = convert_from_path(pdf_path, first_page=page_number + 1, last_page=page_number + 1)
            image = images[0]
            # 保存图像
            image_filename = f"{output_folder}/{page_number + 1:03d}.png"
            image.save(image_filename, "PNG")
            print(f"Saved {image_filename}")

# 获取当前目录下所有PDF文件
pdf_files = [f for f in os.listdir('.') if f.endswith('.pdf')]

# 转换每个PDF文件
for pdf_file in pdf_files:
    convert_pdf_to_images(pdf_file, '转换后')



目录和名字之类的大家可以修改成自己需要的。

PixPin_2024-11-02_16-31-07.png (792.24 KB, 下载次数: 1)

PixPin_2024-11-02_16-31-07.png

PixPin_2024-11-02_16-32-12222.png (1.56 MB, 下载次数: 1)

PixPin_2024-11-02_16-32-12222.png

PixPin_2024-11-02_16-33-56.png (152.14 KB, 下载次数: 1)

PixPin_2024-11-02_16-33-56.png

免费评分

参与人数 9吾爱币 +14 热心值 +8 收起 理由
再见babay + 1 + 1 谢谢@Thanks!
poptop + 1 请勿灌水,提高回帖质量是每位会员应尽的义务!
weidechan + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Deformation + 1 + 1 我很赞同!
快乐的小驹 + 1 谢谢@Thanks!
wapjsx + 2 + 1 谢谢@Thanks!
laozhang4201 + 1 + 1 热心回复!
langyoChina + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
Deformation 发表于 2024-10-28 10:03
不知道能不能拼成一张大图
推荐
teddymvs 发表于 2024-10-28 11:13
现在很多这种较为基础的变化都可以借助python+AI大模型解决。我之前就是想把多个png合并成一个pdf。直接在VSCode里面+一个代码预测模型。用描述性文字说明,模型自动生成相应代码,一般出错概率较小。复杂了估计需要一定代码基础修改
推荐
langyoChina 发表于 2024-10-27 19:30
之前都是跑去 smartpdf 在线转换的,本地装的 pandoc 不好操作

这个就有点意思了,直接开个终端手动进 python 转换,这样就不用担心 pdf 泄露了
沙发
Altman1997 发表于 2024-10-27 19:19
学学python再看
3#
o276496959 发表于 2024-10-27 19:20
感谢分享
5#
alidadai 发表于 2024-10-27 19:35
正好需要,试试
6#
qqycra 发表于 2024-10-27 20:23
很多功能quicker都有,我现在小功能都不写代码了
7#
axinabcd 发表于 2024-10-27 21:28
能不能搞个高质量的转换为word的
8#
axinabcd 发表于 2024-10-27 21:29
能不能搞个高质量的转换为word的
9#
banxia1986 发表于 2024-10-27 21:40
感谢楼主,谢谢提供资源。
10#
l60037527 发表于 2024-10-27 22:26
多谢。可以不分开,拼接吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 09:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表