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

如何在borb库MultiColumnLayout中添加文本图片并配置布局

使用borb创建报纸风格PDF的完整实现

先修正你原代码里的几个核心问题:

  • 变量名和类名重复(比如Document = Document())会导致后续调用类方法报错
  • 未导入Decimal,也没定义w的取值
  • 布局对象初始化后没有关联内容添加逻辑

下面是完整的实现方案,包含布局配置、文本添加、图片插入的详细说明:

1. 基础导入与初始化

先导入必要模块,包括数值计算、文本样式、图片组件:

from borb.pdf import Document, Page, MultiColumnLayout, Paragraph, Image
from borb.pdf.canvas.color.color import HexColor
from decimal import Decimal
import os

正确初始化文档和页面:

# 创建PDF文档实例
doc = Document()
# 创建页面实例
page = Page()
doc.add_page(page)

2. 配置MultiColumnLayout(边距、列间距、列宽)

MultiColumnLayout的参数直接控制页面布局:

  • margin_top/margin_right/margin_bottom/margin_left:设置页面四周的边距
  • column_gap:设置列与列之间的间距
  • column_widths:传入列表定义每列宽度,支持多列(比如两列就传两个数值)

示例配置(两列等宽布局,边距50,列间距20):

# 获取页面宽度用于计算列宽
page_width = page.get_page_info().get_width()
# 计算单列宽度:(页面总宽度 - 左右边距总和 - 列间距) / 列数
column_width = (page_width - Decimal(50)*2 - Decimal(20)) / Decimal(2)

# 初始化多列布局
layout = MultiColumnLayout(
    page,
    column_widths=[column_width, column_width],  # 两列等宽
    margin_top=Decimal(50),
    margin_right=Decimal(50),
    margin_bottom=Decimal(50),
    margin_left=Decimal(50),
    column_gap=Decimal(20)  # 列间距设置
)

3. 添加标题、导语、长文本

使用Paragraph组件添加文本,通过参数自定义样式:

  • 标题:用大字号、加粗、居中样式突出
  • 导语:用灰色字体、适中字号区分正文
  • 长文本:直接传入字符串,布局会自动分栏换行

示例代码:

# 添加跨列标题
layout.add(
    Paragraph(
        "全球气候变化最新研究报告",
        font_size=Decimal(24),
        font_color=HexColor("#2c3e50"),
        bold=True,
        horizontal_alignment="CENTER"
    )
)

# 添加导语
layout.add(
    Paragraph(
        "近日,联合国气候变化框架公约发布最新研究,指出全球平均气温上升速度超出预期,极端天气事件频率显著增加。",
        font_size=Decimal(12),
        font_color=HexColor("#7f8c8d"),
        margin_top=Decimal(10),
        margin_bottom=Decimal(15)
    )
)

# 添加长文本(自动分栏流转)
long_text = """
气候变化是当前全球面临的最严峻挑战之一。随着工业化进程的加速,人类活动排放的温室气体不断累积,导致地球大气层的保温效应增强,引发全球气温升高。

研究显示,过去一个世纪以来,全球平均气温已经上升了约1.1摄氏度,而过去十年是有记录以来最热的十年。气温升高带来的影响包括冰川融化、海平面上升、极端干旱、暴雨洪涝等极端天气事件频发。

为应对气候变化,各国需要采取更加积极的措施,包括减少温室气体排放、发展可再生能源、加强生态保护等。同时,公众也需要提高环保意识,从日常生活中的小事做起,共同守护我们的地球家园。

此外,气候变化还对全球生态系统造成了严重破坏,许多物种面临灭绝的危险。珊瑚礁白化、森林火灾频发、海洋酸化等问题日益严重,给生物多样性带来了巨大威胁。

国际社会已经达成了多项应对气候变化的协议,如《巴黎协定》,旨在将全球气温上升控制在2摄氏度以内,最好是1.5摄氏度。然而,要实现这一目标,需要各国共同努力,加大减排力度,推动可持续发展。
"""
layout.add(Paragraph(long_text, font_size=Decimal(10), margin_bottom=Decimal(10)))

4. 插入图片

使用Image组件插入图片,设置宽度适配列宽,通过margin控制上下间距:

# 插入图片(确保图片路径正确)
if os.path.exists("climate.jpg"):
    layout.add(
        Image(
            "climate.jpg",
            width=column_width,  # 图片宽度适配列宽
            margin_top=Decimal(10),
            margin_bottom=Decimal(10)
        )
    )

完整可运行代码

将上述部分整合,最后保存PDF:

from borb.pdf import Document, Page, MultiColumnLayout, Paragraph, Image
from borb.pdf.canvas.color.color import HexColor
from decimal import Decimal
import os

# 1. 初始化文档和页面
doc = Document()
page = Page()
doc.add_page(page)

# 2. 配置多列布局
page_width = page.get_page_info().get_width()
column_width = (page_width - Decimal(50)*2 - Decimal(20)) / Decimal(2)
layout = MultiColumnLayout(
    page,
    column_widths=[column_width, column_width],
    margin_top=Decimal(50),
    margin_right=Decimal(50),
    margin_bottom=Decimal(50),
    margin_left=Decimal(50),
    column_gap=Decimal(20)
)

# 3. 添加标题
layout.add(
    Paragraph(
        "全球气候变化最新研究报告",
        font_size=Decimal(24),
        font_color=HexColor("#2c3e50"),
        bold=True,
        horizontal_alignment="CENTER"
    )
)

# 4. 添加导语
layout.add(
    Paragraph(
        "近日,联合国气候变化框架公约发布最新研究,指出全球平均气温上升速度超出预期,极端天气事件频率显著增加。",
        font_size=Decimal(12),
        font_color=HexColor("#7f8c8d"),
        margin_top=Decimal(10),
        margin_bottom=Decimal(15)
    )
)

# 5. 添加长文本
long_text = """
气候变化是当前全球面临的最严峻挑战之一。随着工业化进程的加速,人类活动排放的温室气体不断累积,导致地球大气层的保温效应增强,引发全球气温升高。

研究显示,过去一个世纪以来,全球平均气温已经上升了约1.1摄氏度,而过去十年是有记录以来最热的十年。气温升高带来的影响包括冰川融化、海平面上升、极端干旱、暴雨洪涝等极端天气事件频发。

为应对气候变化,各国需要采取更加积极的措施,包括减少温室气体排放、发展可再生能源、加强生态保护等。同时,公众也需要提高环保意识,从日常生活中的小事做起,共同守护我们的地球家园。

此外,气候变化还对全球生态系统造成了严重破坏,许多物种面临灭绝的危险。珊瑚礁白化、森林火灾频发、海洋酸化等问题日益严重,给生物多样性带来了巨大威胁。

国际社会已经达成了多项应对气候变化的协议,如《巴黎协定》,旨在将全球气温上升控制在2摄氏度以内,最好是1.5摄氏度。然而,要实现这一目标,需要各国共同努力,加大减排力度,推动可持续发展。
"""
layout.add(Paragraph(long_text, font_size=Decimal(10), margin_bottom=Decimal(10)))

# 6. 插入图片
if os.path.exists("climate.jpg"):
    layout.add(
        Image(
            "climate.jpg",
            width=column_width,
            margin_top=Decimal(10),
            margin_bottom=Decimal(10)
        )
    )

# 7. 保存PDF
with open("newspaper_style.pdf", "wb") as out_file:
    doc.save(out_file)

关键注意事项

  • 变量名不要和导入的类名重复(比如不要用Document = Document(),应该用doc = Document())
  • 所有布局数值建议用Decimal,避免浮点精度问题
  • 图片路径要确保正确,若图片宽度超过列宽,会自动缩放适配
  • 长文本会自动在多列中流转,无需手动拆分

内容的提问来源于stack exchange,提问作者taga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:35:54