You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyMuPDF识别PDF页面是否旋转90度并正确插入文本

如何识别PDF页面旋转角度并修正文本插入方向(PyMuPDF)

1. 识别页面旋转角度

PyMuPDF的Page对象自带rotation属性,直接读取就能拿到当前页面的旋转角度,返回值为0、90、180、270,分别对应无旋转、顺时针90度、顺时针180度、顺时针270度。

示例代码:

for page in document:
    rot = page.rotation  # 获取当前页面旋转角度
    print(f"当前页面旋转角度:{rot}")

2. 解决文本随页面旋转的问题

最简单的处理方式是临时将页面旋转回0度,插入文本后再恢复原旋转角度。这样插入的文本会保持正常方向,不会跟着页面旋转。

修改后的完整代码:

import fitz

if __name__ == '__main__':
    src_pdf_filename = "original.pdf"
    dst_pdf_filename = "destination.pdf"

    document = fitz.open(src_pdf_filename)

    ss2 = u"В производство работ"
    ss3 = u"29.11.2023"
    ss4 = u"главный инженер проекта"
    ss5 = u"Бендер О.О."

    font = fitz.Font("tiro")  # 加载字体文件

    for page in document:
        # 保存原旋转角度
        original_rot = page.rotation
        # 临时将页面旋转回0度
        if original_rot != 0:
            page.set_rotation(0)
        
        page.insert_font(fontname="F0", fontbuffer=font.buffer)

        # 插入文本(此时页面是正常方向,文本不会旋转)
        page.insert_text((page.mediabox.width-250, page.mediabox.height-280), ss2, fontname="F0", fontsize=18,
                         encoding=fitz.TEXT_ENCODING_CYRILLIC, color=(0, 0, 1), overlay=False)
        page.insert_text((page.mediabox.width - 200, page.mediabox.height - 260), ss3, fontname="F0", fontsize=18,
                         encoding=fitz.TEXT_ENCODING_CYRILLIC, color=(0, 0, 1), overlay=False)
        page.insert_text((page.mediabox.width - 250, page.mediabox.height - 240), ss4, fontname="F0", fontsize=18,
                         encoding=fitz.TEXT_ENCODING_CYRILLIC, color=(0, 0, 1), overlay=False)
        page.insert_text((page.mediabox.width - 250, page.mediabox.height - 220), ss5, fontname="F0", fontsize=18,
                         encoding=fitz.TEXT_ENCODING_CYRILLIC, color=(0, 0, 1), overlay=False)
        
        # 恢复原旋转角度
        if original_rot != 0:
            page.set_rotation(original_rot)

    document.save(dst_pdf_filename)
    document.close()

补充说明

  • 如果不想改变页面的旋转状态,也可以通过计算旋转后的坐标,并在insert_text中指定rotate参数匹配文本方向,但这种方式需要手动转换坐标,逻辑相对复杂,不如临时重置旋转来得直接。
  • mediabox是页面的原始尺寸,临时转0度后用它计算坐标是准确的,恢复旋转后页面的显示也会正常。

内容的提问来源于stack exchange,提问作者Дмитрий Федулов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:49:59