可以根据不同的页码范围应用不同的裁剪参数:
import fitz
import os
def save_pdf_pages_as_images(pdf_path, output_folder, page_ranges):
"""
将PDF指定页面保存为图片,可为不同页码范围设置不同的裁剪边距
:param pdf_path: PDF文件路径
:param output_folder: 输出文件夹
:param page_ranges: 列表,包含多个字典,每个字典定义:
{
'pages': [页码列表], # 从0开始
'crop_margins': (top, right, bottom, left) # 裁剪边距,单位是点(1/72英寸)
}
"""
doc = fitz.open(pdf_path)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 创建一个页码到裁剪参数的映射
page_crop_map = {}
for range_info in page_ranges:
for page_num in range_info['pages']:
page_crop_map[page_num] = range_info['crop_margins']
# 获取所有需要处理的页码(已去重)
all_page_numbers = sorted(page_crop_map.keys())
for page_num in all_page_numbers:
if page_num < len(doc):
output_path = os.path.join(output_folder, f"page_{page_num + 1}.png")
page = doc.load_page(page_num)
media_box = page.mediabox
# 获取当前页面的裁剪参数
crop_margins = page_crop_map[page_num]
# 如果有设置裁剪边距,则计算裁剪框
if crop_margins is not None:
top, right, bottom, left = crop_margins
crop_box = fitz.Rect(
media_box.x0 + left,
media_box.y0 + top,
media_box.x1 - right,
media_box.y1 - bottom
)
# 确保裁剪框在媒体框范围内
crop_box = crop_box.intersect(media_box)
page.set_cropbox(crop_box)
# 设置DPI为300
zoom = 300 / 72 # 72是默认的DPI
mat = fitz.Matrix(zoom, zoom)
pix = page.get_pixmap(matrix=mat)
try:
pix.save(output_path)
print(f"已保存: {output_path}")
except Exception as e:
print(f"保存文件 {output_path} 时出错: {str(e)}")
else:
print(f"警告: 页码 {page_num} 超出范围")
doc.close()
pdf_path = r"C:\Leon\python_project\oceanxecm\2025\04\20250410-Logan-ocr位置\pdf\力赛佳巴基斯坦赫维利投标文件(商务部分)-LISEGA.pdf"
output_folder = r"C:\Leon\python_project\oceanxecm\2025\04\20250410-Logan-ocr位置\output_images"
# 定义不同页码范围的裁剪参数
page_ranges = [
{
'pages': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
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],
'crop_margins': (55, 0, 55, 0)
},
{
'pages': [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],
'crop_margins': (100, 0, 100, 0)
}
]
save_pdf_pages_as_images(pdf_path, output_folder, page_ranges)
主要改进:
- 修改了函数参数,现在接受一个
page_ranges
列表,每个元素是一个字典,包含pages
和crop_margins
两个键 - 创建了一个页码到裁剪参数的映射字典
page_crop_map
,便于快速查找每个页面的裁剪参数 - 自动处理所有页码,确保不重复处理同一页面
- 更灵活地支持不同页码范围使用不同的裁剪参数
使用方法:
- 在
page_ranges
列表中定义不同的页码组和对应的裁剪参数 - 每个组包含
pages
(页码列表) 和crop_margins
(裁剪边距) - 函数会自动处理所有定义的页码,并应用对应的裁剪参数
这样您就可以轻松地为不同的页面范围设置不同的裁剪参数了。如果需要添加更多的页码组,只需在 page_ranges
列表中添加新的字典即可。