如何用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,提问作者Дмитрий Федулов
相关产品推荐
相关产品推荐

