根据不同的页码范围应用不同的裁剪参数

可以根据不同的页码范围应用不同的裁剪参数:

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)

主要改进:

  1. 修改了函数参数,现在接受一个 page_ranges 列表,每个元素是一个字典,包含 pagescrop_margins 两个键
  2. 创建了一个页码到裁剪参数的映射字典 page_crop_map,便于快速查找每个页面的裁剪参数
  3. 自动处理所有页码,确保不重复处理同一页面
  4. 更灵活地支持不同页码范围使用不同的裁剪参数

使用方法:

  • page_ranges 列表中定义不同的页码组和对应的裁剪参数
  • 每个组包含 pages (页码列表) 和 crop_margins (裁剪边距)
  • 函数会自动处理所有定义的页码,并应用对应的裁剪参数

这样您就可以轻松地为不同的页面范围设置不同的裁剪参数了。如果需要添加更多的页码组,只需在 page_ranges 列表中添加新的字典即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值