如何在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
相关产品推荐
相关产品推荐

