python 将pdf转换为图片
查询 PyMuPDF版本对应的解释器版本
版本查询传送门
需要安装相关包
pip3 install PyMuPDF
## pip install fitz
## 3.6的解释器,需要指定版本,如果安装最新的PyMuPDF会报错,安装不上,需要指定版本,演示版本用的python 3.9 PyMuPDF用的1.25.5
pip3 install PyMuPDF==1.22.0
将pdf每一页都转为图片
import os
import fitz
def covert2pic(file_path, zoom, png_path):
doc = fitz.open(file_path)
total = doc.page_count
for pg in range(total):
page = doc[pg]
zoom = int(zoom) # 值越大,分辨率越高,文件越清晰
rotate = int(0)
trans = fitz.Matrix(zoom / 100.0, zoom / 100.0).prerotate(rotate)
pm = page.get_pixmap(matrix=trans, alpha=False)
if not os.path.exists(png_path):
os.mkdir(png_path)
save = os.path.join(png_path, '%s.png' % (pg + 1))
pm.save(save)
doc.close()
if __name__ == "__main__":
pdfPath = './img/demo.pdf'
imagePath = './img'
covert2pic(pdfPath, 1000, imagePath)
将pdf每一页都转为图片 然后合并成横图
import fitz # PyMuPDF
from PIL import Image
def pdf_to_image(pdf_path, output_image_path, zoom=5.0):
# 打开PDF文件
pdf_document = fitz.open(pdf_path)
# 计算总宽度和最大高度
total_width = 0
max_height = 0
images = []
# 遍历每一页
for page_num in range(len(pdf_document)):
page = pdf_document.load_page(page_num)
# 创建一个矩阵来放大图像
matrix = fitz.Matrix(zoom, zoom) # 设置放大倍数
pix = page.get_pixmap(matrix=matrix) # 获取放大后的页面像素图
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
images.append(img)
total_width += img.width
max_height = max(max_height, img.height)
# 创建一个新的图像,宽度为所有页面宽度之和,高度为最大高度
combined_image = Image.new("RGB", (total_width, max_height))
# 将每一页的图像粘贴到新图像中
current_x = 0
for img in images:
combined_image.paste(img, (current_x, 0)) # 横着粘贴
current_x += img.width
# 保存最终的合并图像
combined_image.save(output_image_path)
if __name__ == '__main__':
# 使用示例
pdf_path = "./img/demo.pdf" # 输入的PDF文件路径
output_image_path = "output_image.png" # 输出的图像文件路径
pdf_to_image(pdf_path, output_image_path)
将pdf每一页都转为图片 然后合并成竖图
import fitz # PyMuPDF
from PIL import Image
def pdf_to_vertical_image(pdf_path, output_image_path):
'''
不指定像素,比较模糊
:param pdf_path: pdf路径
:param output_image_path: 保存的文件名和路径
:return:
'''
# 打开PDF文件
pdf_document = fitz.open(pdf_path)
# 计算最大宽度和总高度
max_width = 0
total_height = 0
images = []
# 遍历每一页
for page_num in range(len(pdf_document)):
page = pdf_document.load_page(page_num)
pix = page.get_pixmap() # 获取页面的像素图
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
images.append(img)
max_width = max(max_width, img.width) # 记录最大宽度
total_height += img.height # 计算总高度
# 创建一个新的图像,宽度为最大宽度,高度为所有页面高度之和
combined_image = Image.new("RGB", (max_width, total_height))
# 将每一页的图像粘贴到新图像中
current_y = 0
for img in images:
combined_image.paste(img, (0, current_y)) # 竖着粘贴
current_y += img.height # 更新当前的y坐标
# 保存最终的合并图像
combined_image.save(output_image_path)
def pdf_to_vertical_image2(pdf_path, output_image_path, zoom=10.0):
'''
指定像素使文件更清晰
:param pdf_path:
:param output_image_path:
:param zoom: zoom=1.0 表示原始分辨率,zoom=2.0 通常会将图像分辨率提高到两倍,从而提高清晰度。
可以尝试更高的值(如 3.0 或 4.0),但请注意,这会导致生成的图像文件大小显著增加。
较高的 zoom 值会导致处理时间延长以及更大的输出图像文件
:return:
'''
# 打开PDF文件
pdf_document = fitz.open(pdf_path)
# 计算最大宽度和总高度
max_width = 0
total_height = 0
images = []
# 遍历每一页
for page_num in range(len(pdf_document)):
page = pdf_document.load_page(page_num)
# 创建一个矩阵来放大图像
matrix = fitz.Matrix(zoom, zoom) # 设置放大倍数
pix = page.get_pixmap(matrix=matrix) # 获取放大后的页面像素图
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
images.append(img)
max_width = max(max_width, img.width) # 记录最大宽度
total_height += img.height # 计算总高度
# 创建一个新的图像,宽度为最大宽度,高度为所有页面高度之和
combined_image = Image.new("RGB", (max_width, total_height))
# 将每一页的图像粘贴到新图像中
current_y = 0
for img in images:
combined_image.paste(img, (0, current_y)) # 竖着粘贴
current_y += img.height # 更新当前的y坐标
# 保存最终的合并图像
combined_image.save(output_image_path)
if __name__ == '__main__':
# 使用示例
pdf_path = "./img/demo.pdf" # 输入的PDF文件路径
output_image_path = "output_image1.png" # 输出的图像文件路径
pdf_to_vertical_image2(pdf_path, output_image_path)
惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
一代天骄,成吉思汗,只识弯弓射大雕。
俱往矣,数风流人物,还看今朝