本帖最后由 nancune 于 2026-7-2 20:07 编辑
因为需要用A4纸张打印A3幅面的材料(PDF格式),同时保证纸张边缘图文不丢失,图文大小不变,需要分割原A3页面到A4页面。A3页面到A4页面转换Python程序如下:
[Python] 纯文本查看 复制代码 import fitz
import sys
def split_all_facing_pdf(input_pdf: str, output_pdf: str):
"""
所有对折页面对半拆分:
1. 原页面左右对半裁切
2. 左半页整体向左偏移8pt,右半页整体向右偏移8pt
3. 左在前、右在后输出单页,保留旋转矫正开关
"""
src_doc = fitz.open(input_pdf)
new_doc = fitz.open()
total_page_count = len(src_doc)
print(f"检测到原PDF总页数:{total_page_count}")
# 偏移量:4字符宽度对应4pt,可按需修改
offset_pt = -8
for page_idx in range(total_page_count):
page = src_doc[page_idx]
page_rect = page.rect
page_w = page_rect.width
page_h = page_rect.height
half_w = page_w / 2
# 原始左右裁切区域
orig_clip_left = fitz.Rect(0, 0, half_w, page_h)
orig_clip_right = fitz.Rect(half_w, 0, page_w, page_h)
# ========== 左半页:向左偏移4pt ==========
# 裁切区域左移offset_pt,防止页面边缘内容被裁掉
clip_left_shift = fitz.Rect(
orig_clip_left.x0 - offset_pt,
orig_clip_left.y0,
orig_clip_left.x1 - offset_pt,
orig_clip_left.y1
)
left_single = new_doc.new_page(width=half_w, height=page_h)
# 内容向右回填offset_pt,实现视觉左移效果
left_target_rect = fitz.Rect(offset_pt, 0, half_w + offset_pt, page_h)
left_single.show_pdf_page(left_target_rect, src_doc, page_idx, clip=clip_left_shift)
# left_single.set_rotation(180) # 按需开启旋转矫正颠倒
# ========== 右半页:向右偏移4pt ==========
# 裁切区域右移offset_pt
clip_right_shift = fitz.Rect(
orig_clip_right.x0 + offset_pt,
orig_clip_right.y0,
orig_clip_right.x1 + offset_pt,
orig_clip_right.y1
)
right_single = new_doc.new_page(width=half_w, height=page_h)
# 内容向左回填offset_pt,实现视觉右移效果
right_target_rect = fitz.Rect(-offset_pt, 0, half_w - offset_pt, page_h)
right_single.show_pdf_page(right_target_rect, src_doc, page_idx, clip=clip_right_shift)
# right_single.set_rotation(180) # 按需开启旋转矫正颠倒
print(f"已拆分原第{page_idx+1}页 → 生成左(左移4pt)、右(右移4pt)2张单页")
new_doc.save(output_pdf)
new_doc.close()
src_doc.close()
print(f"\n✅ 分割偏移矫正完成!文件:{output_pdf}")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("用法:python split_all_facing.py 输入.pdf 输出.pdf")
sys.exit(1)
split_all_facing_pdf(sys.argv[1], sys.argv[2])
|