Python实现快速将pdf文件剪切成多个图片

 更新时间:2024年01月31日 14:18:17   作者:搬砖的诗人Z  
这篇文章主要为大家详细介绍了如何使用Python实现快速将pdf文件剪切成多个图片,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下

这里提供一个打包好的剪切包,window环境打开即可运行

import os
import fitz
import glob
import requests


os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

#剪切pdf为图片
def CutPdf(pdfPath,savePath,pdfSavePath):
	try:
		doc = fitz.open(pdfPath) #pdf路径
		for pg in range(doc.pageCount):
			page = doc[pg]
			rotate = int(0)
		    # 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
			zoom_x = 2.0
			zoom_y = 2.0
			trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
			pm = page.getPixmap(matrix=trans, alpha=False)
			imagePath = savePath + '%s.png' % str(pg + 1)
			pm.writePNG(imagePath) #最终存储路径
			newpdfPath = pdfSavePath + '%s.pdf' % str(pg + 1)
			print("剪切一张图片:" + str(pg + 1))
			frompic2pdf(imagePath,pdfSavePath,newpdfPath)
			print("转换成功一张pdf:" + str(pg + 1))
	except Exception as e:
		print('CutPdf出现异常:' + str(e))

#图片转pdf
def frompic2pdf(img_path,pdfSavePath, pdf_path):
	# 使用glob读图
	for img in sorted(glob.glob(img_path)):
		if not os.path.exists(pdfSavePath):
			 os.makedirs(pdfSavePath)
		
		# 打开空文档
		doc = fitz.open()
		# 打开指定图片
		imgdoc = fitz.open(img)
		# 使用图片创建单页的PDF
		pdfbytes = imgdoc.convertToPDF()
		imgpdf = fitz.open("pdf", pdfbytes)
		# 将当前页写入文档
		doc.insertPDF(imgpdf)
		# 保存为指定名称的PDF文件
		doc.save(pdf_path)
		# 关闭
		doc.close()


def main():
    pdfUrl = "cards"
    fileList = os.listdir(pdfUrl)
    index = 1
    for item in  fileList:
        print("开始裁剪" + item)
        url = pdfUrl + "/" + item

        foldStr = "images/" + item.split('.')[0]
        url2 = foldStr + "/" + item.split('.')[0]
        foldStr3 = "pdf/" + item.split('.')[0]
        url3 = foldStr3 + "/"
        if not os.path.exists(foldStr):
            os.makedirs(foldStr)

        CutPdf(url,url2,url3)
        print("完成裁剪")
        index+=1

if __name__ == "__main__":
    main()

知识补充

除了上文的方法,小编还为大家整理了其他Python裁剪pdf文件为图片的方法,希望对大家有所帮助

方法一:

剪裁PDF页面

在剪裁PDF页面之前,我们需要获取页面的尺寸,并计算剪裁区域的位置和大小。下面是剪裁PDF页面的代码:

# 获取页面尺寸
page_width = page.mediaBox.getWidth()
page_height = page.mediaBox.getHeight()

# 定义剪裁区域的位置和大小
x = 100  # 起始点的x坐标
y = 100  # 起始点的y坐标
width = 200  # 剪裁区域的宽度
height = 300  # 剪裁区域的高度

# 剪裁PDF页面
page.trimBox.lowerLeft = (x, y)
page.trimBox.upperRight = (x + width, y + height)
page.cropBox.lowerLeft = (x, y)
page.cropBox.upperRight = (x + width, y + height)

代码解析:

  • 使用mediaBox属性获取页面的宽度和高度。
  • 定义剪裁区域的位置和大小,可以根据实际需求进行调整。
  • 使用trimBox属性设置剪裁后的页面的边界框。
  • 使用cropBox属性设置剪裁后的页面的裁剪框。

保存剪裁后的图片

最后,我们需要将剪裁后的页面保存为图片。这可以通过使用PyPDF2库和Pillow库来实现。下面是保存剪裁后的图片的代码:

from PIL import Image

# 将剪裁后的页面保存为图片
with open('output.jpg', 'wb') as image_file:
    page_data = page.extract_xobject().get('/Im0').getData()
    image = Image.open(io.BytesIO(page_data))
    image.save(image_file, 'JPEG')

首先,导入Pillow库中的Image模块,用于处理图像。

  • 使用extract_xobject()方法从剪裁后的页面中提取图像数据。
  • 使用get('/Im0')方法获取图像数据。
  • 使用getData()方法获取图像的二进制数据。
  • 使用Image.open()方法打开图像数据。
  • 使用save()方法保存图像数据为JPEG格式的图片。
  • 'output.jpg'为保存的图片路径,可以根据需要修改。

方法二:

python分割pdf

from PyPDF2 import PdfFileReader, PdfFileWriter
 
 
# PDF文件分割
def split_pdf(read_file, out_detail):
    try:
        fp_read_file = open(read_file, 'rb')
        pdf_input = PdfFileReader(fp_read_file)  # 将要分割的PDF内容格式话
        page_count = pdf_input.getNumPages()  # 获取PDF页数
        print(page_count)  # 打印页数
 
        with open(out_detail, 'r',True,'utf-8')as fp:
            # print(fp)
            txt = fp.readlines()
            # print(txt)
            for detail in txt:  # 打开分割标准文件
                # print(type(detail))
                pages, write_file = detail.split()  # 空格分组
               #  write_file, write_ext = os.path.splitext(write_file)  # 用于返回文件名和扩展名元组
                pdf_file = r'C:\Users\GZTSALFIEL\Desktop\excel问题文件\pdf\\'+f'{write_file}.pdf'
                # liststr=list(map(int, pages.split('-')))
                # print(type(liststr))
                start_page, end_page = list(map(int, pages.split('-')))  # 将字符串数组转换成整形数组
                start_page -= 1
                try:
                    print(f'开始分割{start_page}页-{end_page}页,保存为{pdf_file}......')
                    pdf_output = PdfFileWriter()  # 实例一个 PDF文件编写器
                    for i in range(start_page, end_page):
                        pdf_output.addPage(pdf_input.getPage(i))
                    with open(pdf_file, 'wb') as sub_fp:
                        pdf_output.write(sub_fp)
                    print(f'完成分割{start_page}页-{end_page}页,保存为{pdf_file}!')
                except IndexError:
                    print(f'分割页数超过了PDF的页数')
        # fp.close()
    except Exception as e:
        print(e)
    finally:
        fp_read_file.close()
 
 
 
# def main():
#     fire.Fire(split_pdf)
#
# if __name__ == '__main__':
#     main()
 
split_pdf(r'..\pdfdocement\myfile.pdf', 'consult.txt')

到此这篇关于Python实现快速将pdf文件剪切成多个图片的文章就介绍到这了,更多相关Python将pdf剪切图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python3实现的判断回文链表算法示例

    Python3实现的判断回文链表算法示例

    这篇文章主要介绍了Python3实现的判断回文链表算法,结合实例形式分析了Python3针对链表是否为回文链表进行判断的相关算法实现技巧,需要的朋友可以参考下
    2019-03-03
  • Django 跨域请求处理的示例代码

    Django 跨域请求处理的示例代码

    本篇文章主要介绍了Django 跨域请求处理的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Python函数式编程指南(二):从函数开始

    Python函数式编程指南(二):从函数开始

    这篇文章主要介绍了Python函数式编程指南(二):从函数开始,本文讲解了定义一个函数、使用函数赋值、闭包、作为参数等内容,需要的朋友可以参考下
    2015-06-06
  • Django项目打包完整步骤以及可能出现的问题

    Django项目打包完整步骤以及可能出现的问题

    django项目的结构大体上都是类似,打包主要的功能就是把一些不需要部署的文件剔除,把需要部署的文件直接压缩打包,下面这篇文章主要给大家介绍了关于Django项目打包完整步骤以及可能出现问题的相关资料,需要的朋友可以参考下
    2023-06-06
  • Python入门教程(七)Python数字类型

    Python入门教程(七)Python数字类型

    这篇文章主要介绍了Python入门教程(七)Python数字类型,Python是一门非常强大好用的语言,也有着易上手的特性,本文为入门教程,需要的朋友可以参考下
    2023-04-04
  • 在python中使用pyspark读写Hive数据操作

    在python中使用pyspark读写Hive数据操作

    这篇文章主要介绍了在python中使用pyspark读写Hive数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python高阶函数map()和reduce()实例解析

    python高阶函数map()和reduce()实例解析

    这篇文章主要介绍了python高阶函数map()和reduce()实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python字典高级用法深入分析讲解

    Python字典高级用法深入分析讲解

    字典作为Python的一个内置数据结构,和列表一样都是可变序列的,但是它是无序的,以键值对的方式存储数据。本文将详解一下Python中字典的高级使用,需要的可以参考一下
    2022-10-10
  • 通过CartPole游戏详解PPO 优化过程

    通过CartPole游戏详解PPO 优化过程

    这篇文章主要为大家介绍了通过CartPole游戏详解PPO 优化过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • python 包之 multiprocessing 多进程

    python 包之 multiprocessing 多进程

    这篇文章主要介绍了python 包之 multiprocessing 多进程,首先创建一个进程。实例化 Process 类创建一个进程对象、然后调用它的 start 方法即可生成一个子进程,下文更多相关资料,需要的朋友可以参考一下
    2022-04-04

最新评论