PDF转XML后如何识别并仅保留原PDF中的可见空格
清理PDF转XML中的非预期空格并识别空格类型
一、识别XML中的不同空格类型
XML里的空格分多种,可通过字符编码或编辑器的「显示不可见字符」功能区分:
- 普通可见空格:Unicode编码U+0020(ASCII 32),就是常规输入的空格,原PDF中可见。
- 非断空格(Non-breaking Space):U+00A0,XML中常显示为
 或看似普通空格,原PDF中用于防止换行但无可见显示。 - 零宽空格(Zero-width Space):U+200B,XML中为
​,完全不可见,仅用于排版换行控制。 - 全角空格:U+3000,XML中为
 ,是可见的全角空格,若原PDF无此排版则属于非预期内容。
你也可以用Python的ord()函数获取字符的Unicode编码,直接判断空格类型。
二、修改代码保留仅可见空格
针对你的PDF转XML代码,添加特殊空格清理逻辑,同时修正原代码的页码处理bug:
import io from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter, HTMLConverter, XMLConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage def convert(case, input_file_path, targetfilepath, pages=None): # 修正页码处理:pages为None时处理所有页面,支持单个页码或页码列表 if pages is None: pagenums = set() else: pagenums = set(pages) if isinstance(pages, (list, tuple)) else {pages} manager = PDFResourceManager() codec = 'utf-8' caching = True if case == 'text': output = io.StringIO() converter = TextConverter(manager, output, codec=codec, laparams=LAParams()) elif case == 'HTML': output = io.BytesIO() converter = HTMLConverter(manager, output, codec=codec, laparams=LAParams()) elif case == 'XML': output = io.BytesIO() converter = XMLConverter(manager, output, codec=codec, laparams=LAParams()) else: raise ValueError("Unsupported conversion type. Choose 'text', 'HTML', or 'XML'.") interpreter = PDFPageInterpreter(manager, converter) with open(input_file_path, 'rb') as infile: for page in PDFPage.get_pages(infile, pagenums, caching=caching, check_extractable=True): interpreter.process_page(page) convertedPDF = output.getvalue() converter.close() output.close() # 新增:清理XML中的非预期空格 if case == 'XML': converted_str = convertedPDF.decode(codec) # 定义特殊空格处理规则:替换或移除不可见空格 special_space_map = { '\u00A0': ' ', # 非断空格替换为普通空格 '\u200B': '', # 零宽空格直接移除 '\u200C': '', # 零宽非连接空格 '\u200D': '', # 零宽连接空格 '\u3000': ' ' # 全角空格替换为普通空格(不需要可改为'') } for space_char, replacement in special_space_map.items(): converted_str = converted_str.replace(space_char, replacement) convertedPDF = converted_str.encode(codec) # 写入目标文件 with open(targetfilepath, 'wb') as convertedFile: convertedFile.write(convertedPDF) # 调用示例 convert('XML', input_file_path, directory_path_xml1, pages=None)
关键修改点:
- 修复页码逻辑:原代码
set(100)会报错,现在兼容单个页码或页码列表,pages=None时处理所有页面。 - 空格清理逻辑:将XML内容解码为字符串后,替换/移除不可见的特殊空格,仅保留普通可见空格。
- 资源管理优化:用
with语句管理文件,避免手动关闭遗漏。
三、验证效果
处理完成后,你可以:
- 用VS Code等编辑器开启「显示控制字符」选项,确认XML中无不可见空格。
- 用Python读取XML内容,通过
ord()检查字符编码,确保仅存在U+0020类型的空格。
内容的提问来源于stack exchange,提问作者Strategic Gamer
相关产品推荐
相关产品推荐

