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

如何用Python拆分PDF并保留WCAG网页可访问性?

如何拆分PDF时保留WCAG可访问性?

我写了一个Python脚本用PyMuPDF拆分PDF,拆分功能正常,但原PDF符合WCAG的可访问性属性(比如结构化标签、书签、阅读顺序等)都丢失了。原先是用PyPDF2,后来换成PyMuPDF,简化版代码如下:

import os
import fitz  # PyMuPDF

def split_pdf():
    file_path = "path_to_pdf"
    chunk_size = "pages_per_chunk"
    output_folder = f"{file_path[:-4]}_output"

    pdf_document = fitz.open(file_path)
    total_pages = pdf_document.page_count

    for start in range(0, total_pages, chunk_size):
        end = min(start + chunk_size, total_pages)
        output_filename = f"{output_folder}/pages_{start+1}_to_{end}.pdf"

        doc_subset = fitz.open()  # Create a new PDF to hold the subset
        for page_num in range(start, end):
            doc_subset.insert_pdf(pdf_document, from_page=page_num, to_page=page_num)

        doc_subset.save(output_filename)
        doc_subset.close()

    pdf_document.close()

需要解决的是如何让拆分后的PDF保留原有的可访问性特征,符合WCAG标准。


解决方案

要保留WCAG可访问性,核心是确保拆分过程中不丢失结构化标签、书签(大纲)、无障碍元数据、注释/链接这些关键元素,以下是调整后的实现:

关键优化点

  • 完整复制原文档的无障碍元数据到拆分后的文档
  • 批量插入页面时显式启用属性保留参数
  • 提取并映射对应页面范围的书签到新文档

修改后的代码

import os
import fitz  # PyMuPDF

def split_pdf_with_accessibility():
    file_path = "path_to_pdf"
    chunk_size = 5  # 替换为实际拆分页数,需设为整数
    output_folder = f"{file_path[:-4]}_output"
    os.makedirs(output_folder, exist_ok=True)

    pdf_document = fitz.open(file_path)
    total_pages = pdf_document.page_count
    # 复制原文档的所有元数据(包含WCAG相关属性,如语言、标题等)
    original_metadata = pdf_document.metadata

    for start in range(0, total_pages, chunk_size):
        end = min(start + chunk_size, total_pages)
        output_filename = f"{output_folder}/pages_{start+1}_to_{end}.pdf"

        doc_subset = fitz.open()
        # 同步原文档元数据
        doc_subset.set_metadata(original_metadata)
        
        # 批量插入页面,保留所有可访问性相关属性
        doc_subset.insert_pdf(
            pdf_document,
            from_page=start,
            to_page=end - 1,  # PyMuPDF页码为0-based,对应原range(start, end)的范围
            keep_props=True,
            annotations=True,
            links=True,
            keep_together=True
        )

        # 提取并添加当前拆分范围内的书签
        for level, title, page_num in pdf_document.get_toc():
            # 书签页码为1-based,判断是否在当前拆分页范围内
            if start + 1 <= page_num <= end:
                # 转换为新文档的相对页码(1-based)
                new_page = page_num - start
                doc_subset.add_toc_item(title, new_page, level)

        # 保存时保留结构,避免清理必要的无障碍标签
        doc_subset.save(
            output_filename,
            garbage=3,
            deflate=True,
            clean=True
        )
        doc_subset.close()

    pdf_document.close()

验证与注意事项

  1. 检查标签结构:可以用Adobe Acrobat的「辅助工具检查器」验证拆分后的PDF标签是否完整,或通过doc_subset.get_page_tags(page_idx)在代码中查看页面标签树。
  2. 书签跳转验证:确认拆分后的书签能正确跳转到对应页面,避免因页码偏移导致的跳转错误。
  3. 元数据完整性:确保原文档的/Lang(语言)、/Title等元数据被正确复制,这些是屏幕阅读器识别文档的关键信息。
  4. 避免单页循环插入:批量插入页面比循环单页插入更能保证文档结构的连续性,减少属性丢失的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:25:36