-
加载PDF文件:通过
PdfReader
类加载两个PDF文件,一个是底.pdf
,另一个是顶.pdf
。 -
创建PDF写入器:实例化
PdfWriter
类,用于写入最终的输出PDF文件。 -
获取页面对象:访问每个PDF文件的第一页,分别命名为
tree_page
和legend_page
。 -
调整顶图页面的MediaBox:
- 首先获取底图页面的媒体框(
mediabox
)。 - 将顶图页面的媒体框调整为与底图页面相同宽度,但右侧额外增加了3000个单位,可能使页面超出原尺寸。
- 首先获取底图页面的媒体框(
-
缩小顶图页面:顶图页面被缩放至原大小的35%,实现尺寸的减小。
-
平移顶图页面:应用变换使顶图页面在X轴上移动,移动的距离等于底图页面右边界减去170个单位。
-
合并页面:经过变换的顶图页面被合并到底图页面之上。
-
添加页面并保存输出:合并后的页面被添加到
PdfWriter
实例中,然后将整个文档写入名为结果.pdf
的新文件中。
这个脚本有效地将两个页面结合在一起,顶图页面被调整大小、位置,并叠加在底图页面上,形成一个复合的PDF页面
from pypdf import PdfReader, PdfWriter, Transformation
from pypdf.generic import RectangleObject
# 加载底图和顶图PDF文件
tree_pdf = PdfReader(open('底.pdf', 'rb'))
legend_pdf = PdfReader(open('顶.pdf', 'rb'))
# 初始化PDF写入器,用于创建新的PDF文件
output_writer = PdfWriter()
# 获取底图的第一页
base_page = tree_pdf.pages[0]
# 获取顶图的第一页
overlay_page = legend_pdf.pages[0]
# 使用底图页面的媒体框尺寸来调整顶图页面的尺寸
# 这样做是为了确保顶图页面与底图页面的尺寸匹配
base_media_box = base_page.mediabox
overlay_page.mediabox = RectangleObject((base_media_box.left, base_media_box.bottom, base_media_box.right + 3000, base_media_box.top))
# 缩小顶图页面的尺寸,缩放比例为0.35
# 这使得顶图页面在合并到底图页面上时不会占据过多空间
overlay_page.scale_by(0.35)
# 定义平移变换,将顶图页面在X轴方向上移动
# 移动的距离等于底图页面右边界减去170单位
translation = Transformation().translate(tx=base_media_box.right - 170)
# 应用平移变换到顶图页面
overlay_page.add_transformation(translation)
# 合并顶图页面到底图页面上
# 这一步将顶图页面的内容叠加到底图页面相应的位置上
base_page.merge_page(overlay_page)
# 将合并后的页面添加到输出的PDF写入器中
output_writer.add_page(base_page)
# 写入最终的PDF文件
# '结果.pdf'是输出文件名
with open('结果.pdf', 'wb') as output_stream:
output_writer.write(output_stream)