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

如何用PDFBOX或ITEXT将PDF全页字体设为18/24pt粗体并自动分页?

PDF文本放大重排(支持自动分页)实现方案

要实现将PDF所有文本调整为18pt/24pt粗体并自动分页的需求,直接修改原PDF的文本属性无法解决分页和布局溢出问题——因为PDF的文本是固定位置的静态元素。正确的思路是提取原PDF文本后,用专业排版引擎重新生成符合要求的PDF,这和InDesign的重排逻辑一致。

工具选择

推荐使用以下Python库组合:

  • PyMuPDF(fitz):高效提取PDF文本(支持可编辑PDF和扫描件OCR提取)
  • ReportLab:成熟的PDF排版引擎,支持自动分页、字体样式自定义

核心实现步骤

  1. 提取原PDF的所有文本内容(尽量保留段落结构)
  2. 配置排版样式:指定18pt/24pt粗体字体、行高、段落间距
  3. 用排版引擎自动分页生成新PDF

代码示例

1. 安装依赖

pip install pymupdf reportlab pytesseract pillow  # pytesseract用于扫描件OCR

2. 完整实现代码

import fitz  # PyMuPDF
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
import pytesseract
from PIL import Image

def extract_editable_pdf_text(pdf_path):
    """提取可编辑PDF的文本,保留段落结构"""
    doc = fitz.open(pdf_path)
    text_content = []
    for page in doc:
        # 获取文本块,过滤非文本内容
        blocks = page.get_text("blocks")
        for block in blocks:
            if block[6] == 0:  # 标记为文本块的内容
                text = block[4].strip()
                if text:
                    text_content.append(text)
    doc.close()
    return "\n\n".join(text_content)

def extract_scanned_pdf_text(pdf_path):
    """提取扫描件PDF的文本(需OCR)"""
    doc = fitz.open(pdf_path)
    text_content = []
    for page in doc:
        # 将PDF页面转为图片
        pix = page.get_pixmap()
        img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
        # OCR识别文本
        text = pytesseract.image_to_string(img)
        text_content.append(text.strip())
    doc.close()
    return "\n\n".join(text_content)

def generate_styled_pdf(input_text, output_path, font_size=24, use_bold=True):
    """生成指定字体大小的粗体PDF,自动处理分页"""
    doc = SimpleDocTemplate(output_path, pagesize=letter)
    styles = getSampleStyleSheet()

    # 配置字体:默认使用Helvetica粗体,可替换为自定义字体
    font_name = "Helvetica-Bold" if use_bold else "Helvetica"

    # 自定义段落样式:控制字号、行高、边距
    custom_style = ParagraphStyle(
        name='AccessibleStyle',
        fontName=font_name,
        fontSize=font_size,
        leading=font_size * 1.2,  # 行高设置为字号的1.2倍,提升可读性
        spaceAfter=12,  # 段落间空白
        leftIndent=25,
        rightIndent=25
    )

    # 构建PDF内容流
    story = []
    paragraphs = input_text.split("\n\n")
    for para in paragraphs:
        if para.strip():
            story.append(Paragraph(para, custom_style))
            story.append(Spacer(1, 8))

    # 生成PDF,自动分页
    doc.build(story)

if __name__ == "__main__":
    # 示例:处理可编辑PDF,生成24pt粗体版本
    input_pdf = "original.pdf"
    extracted_text = extract_editable_pdf_text(input_pdf)
    generate_styled_pdf(extracted_text, "output_24pt_bold.pdf", font_size=24, use_bold=True)

    # 生成18pt粗体版本
    generate_styled_pdf(extracted_text, "output_18pt_bold.pdf", font_size=18, use_bold=True)

    # 如果是扫描件PDF,替换为以下代码
    # extracted_text = extract_scanned_pdf_text(input_pdf)
    # generate_styled_pdf(extracted_text, "output_scanned_24pt.pdf", font_size=24)

关键注意事项

  • 扫描件处理:如果原PDF是图片型扫描件,必须依赖OCR工具(如Tesseract)提取文本,需提前安装Tesseract引擎并配置环境变量。
  • 字体兼容性:如果需要确保目标设备能正常显示粗体,可以嵌入自定义字体(比如系统自带的微软雅黑粗体、Arial Bold),示例代码如下:
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

# 注册并嵌入自定义粗体字体
pdfmetrics.registerFont(TTFont('MicrosoftYaHeiBold', 'path/to/msyhbd.ttf'))
# 在custom_style中设置fontName='MicrosoftYaHeiBold'
  • 复杂格式适配:如果原PDF包含表格、图片等复杂元素,纯文本提取会丢失结构,这种情况需要额外处理(比如用PyMuPDF提取图片并插入到新PDF中)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:48:22