如何使用pypdf围绕中心旋转+缩放PDF页面?

问题描述 投票:0回答:1

我想在 PDF 文档中围绕中心旋转 PDF 页面(不仅仅是 90° 的倍数),并可选择缩放它们以适合原始页面。

在 StackOverflow 上,我发现了一些类似的问题,但主要是关于过时的 PyPDF2。 在最新的 pypdf 文档中,我找不到(或忽略)围绕中心旋转页面的方法,例如适用于稍微倾斜的扫描文档,需要旋转几度。

我知道有

Transformation Class
,但标准旋转是围绕左下角的,并且文档没有详细解释矩阵元素实际上是什么。

如何围绕中心旋转 PDF 页面并可选择缩放它以适合原始页面?

python pdf rotation pypdf
1个回答
1
投票

我花了一些时间才弄清楚如何围绕中心旋转页面并缩放它以适合原始页面。虽然,它只需要一个在正确位置具有正确元素的矩阵和一些三角函数,但这对我来说并不是太明显。 因此,我发布了我最终得到的脚本以供自己回忆,也许这对其他人有帮助,而不必重新发明轮子。

毕竟,您也可以通过

rotate()
translate()
scale()
的组合来实现它。

如果有人有简化或改进以下脚本的想法,请告诉我。

脚本:

### rotate around center (and optional scale) pdf pages
from pypdf import PdfReader, PdfWriter, Transformation
from math import sin, cos, atan, sqrt, radians

pdf_input  = PdfReader("Test.pdf")
pdf_output = PdfWriter()

rotation_angle = 7.3   # in degrees
shrink_page    = True

for page in pdf_input.pages:
    x0 = (page.mediabox.right - page.mediabox.left)/2
    y0 = (page.mediabox.top   - page.mediabox.bottom)/2
    a0 = radians(rotation_angle)
    s0 = min(x0,y0)/cos(atan(y0/x0)-a0)/sqrt(x0**2 + y0**2) if shrink_page else 1
    rotate_center = Transformation((
        s0*cos(a0), s0*sin(a0), -s0*sin(a0),
        s0*cos(a0), s0*(-x0*cos(a0)+y0*sin(a0))+x0, s0*(-x0*sin(a0)-y0*cos(a0))+y0))
    pdf_output.add_page(page).add_transformation(rotate_center)

pdf_output.write("Test_out.pdf")
### end of script

结果:(截图来自

Test_out.pdf

© www.soinside.com 2019 - 2024. All rights reserved.