如何用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()
验证与注意事项
- 检查标签结构:可以用Adobe Acrobat的「辅助工具检查器」验证拆分后的PDF标签是否完整,或通过
doc_subset.get_page_tags(page_idx)在代码中查看页面标签树。 - 书签跳转验证:确认拆分后的书签能正确跳转到对应页面,避免因页码偏移导致的跳转错误。
- 元数据完整性:确保原文档的
/Lang(语言)、/Title等元数据被正确复制,这些是屏幕阅读器识别文档的关键信息。 - 避免单页循环插入:批量插入页面比循环单页插入更能保证文档结构的连续性,减少属性丢失的概率。
内容的提问来源于stack exchange,提问作者LHHAR
相关产品推荐
相关产品推荐

