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

如何在PyMuPDF中按任意角度旋转PDF页面?

如何在PyMuPDF中按任意角度旋转PDF页面?

嘿,你提的这个问题确实戳中了PyMuPDF的一个小局限——自带的page.set_rotation()确实只支持90°的整数倍旋转,没法直接实现任意角度的旋转。不过不用急,咱们有两种可行的办法,而且优先推荐的那种还能保留文本的可编辑性,不用非得转成图片~

最优方案:保留文本可编辑性的任意角度旋转

核心思路是:新建一个适配旋转后尺寸的页面,然后用变换矩阵把原页面的内容完整绘制到新页面上。这样既实现了任意角度旋转,又不会丢失文本的可编辑属性。

直接上代码,每一步我都给你标清楚了:

import pymupdf

# 打开原PDF文档
doc = pymupdf.open("Rest.pdf")
src_page = doc[0]  # 获取需要旋转的第一页

# 定义你要的旋转角度
rotate_angle = 2.5  # 这里是2.5度,你可以改成任意数值

# 1. 计算旋转后的页面尺寸,避免内容被裁剪
src_rect = src_page.rect  # 原页面的边界矩形
# 创建绕原点旋转的矩阵
rot_matrix = pymupdf.Matrix.prerotate(rotate_angle)
# 计算原页面旋转后的边界范围
rotated_rect = src_rect * rot_matrix

# 2. 新建一个空文档和适配的目标页面
new_doc = pymupdf.open()
# 新页面的尺寸用旋转后的边界框大小,确保内容完整显示
dst_page = new_doc.new_page(width=rotated_rect.width, height=rotated_rect.height)

# 3. 计算偏移量,让旋转后的内容居中显示在新页面上
# 因为默认旋转是绕原点,得把内容平移到新页面的中心位置
offset_x = (rotated_rect.width - src_rect.width * abs(rot_matrix.a)) / 2 - rotated_rect.x0
offset_y = (rotated_rect.height - src_rect.height * abs(rot_matrix.d)) / 2 - rotated_rect.y0
# 把平移参数加入变换矩阵
rot_matrix.translate(offset_x, offset_y)

# 4. 把原页面内容用变换矩阵绘制到新页面
dst_page.show_pdf_page(dst_page.rect, doc, src_page.number, matrix=rot_matrix)

# 保存结果并关闭文档
new_doc.save("Test_rotated.pdf")
doc.close()
new_doc.close()

备选方案:转成图片后旋转(不推荐,除非你不在意文本可编辑性)

如果你对文本是否可编辑完全没要求,转成图片再旋转也是一种思路,操作起来更简单,但代价是PDF内容会变成位图,没法选中复制文本,文件体积也可能变大。

代码示例如下:

import pymupdf

doc = pymupdf.open("Rest.pdf")
page = doc[0]
rotate_angle = 2.5

# 把页面转换成Pixmap(即图片格式)
pix = page.get_pixmap()
# 创建旋转矩阵
rot_matrix = pymupdf.Matrix.prerotate(rotate_angle)
# 对图片执行旋转
rotated_pix = pix.transform(rot_matrix)

# 新建页面并插入旋转后的图片
new_doc = pymupdf.open()
new_page = new_doc.new_page(width=rotated_pix.width, height=rotated_pix.height)
new_page.insert_image(new_page.rect, pixmap=rotated_pix)

# 保存并关闭
new_doc.save("Test_rotated_image.pdf")
doc.close()
new_doc.close()

两种方法你可以根据自己的需求选,优先选第一种哦,毕竟保留文本可编辑性太重要了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 06:42:56