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

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)

关键修改点:

  1. 修复页码逻辑:原代码set(100)会报错,现在兼容单个页码或页码列表,pages=None时处理所有页面。
  2. 空格清理逻辑:将XML内容解码为字符串后,替换/移除不可见的特殊空格,仅保留普通可见空格。
  3. 资源管理优化:用with语句管理文件,避免手动关闭遗漏。

三、验证效果

处理完成后,你可以:

  • 用VS Code等编辑器开启「显示控制字符」选项,确认XML中无不可见空格。
  • 用Python读取XML内容,通过ord()检查字符编码,确保仅存在U+0020类型的空格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:25:53