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

如何从含非拉丁文字的可搜索PDF提取无多余空格的hOCR?

提取无多余空格的亚美尼亚语PDF hOCR解决方案(Mac + Python3.7)

针对你遇到的亚美尼亚语PDF OCR编码错误、hOCR提取空格冗余问题,以下是几种可行的解决方法:

一、优化PyMuPDF(fitz)提取代码,去除多余空格并修复编码

如果继续使用Python脚本,可以通过按行合并文本块、过滤冗余空格、直接替换编码错误字符的方式生成干净的hOCR:

import fitz  # PyMuPDF

def extract_clean_hocr(pdf_path, output_hocr):
    doc = fitz.open(pdf_path)
    # 初始化hOCR基础结构
    hocr_header = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>\n<title>Cleaned Armenian hOCR</title>\n</head>\n<body>\n'
    hocr_footer = '</body>\n</html>'
    hocr_content = hocr_header

    for page_idx in range(len(doc)):
        page = doc.load_page(page_idx)
        # 获取所有文本块,按垂直坐标排序确保行顺序正确
        text_blocks = sorted(page.get_text("blocks"), key=lambda b: (b[1], b[0]))
        hocr_content += f'<div class="ocr_page" id="page_{page_idx+1}">\n'
        
        current_line_y = None
        current_line_text = []

        for block in text_blocks:
            if block[6] == 0:  # 跳过非文本块
                continue
            block_text = block[4].strip()
            # 修复已知编码错误:替换错误字符为正确亚美尼亚字母
            block_text = block_text.replace('²', 'Ա')
            # 按行合并:当块的垂直坐标与当前行差异超过阈值时,视为新行
            if current_line_y is None or abs(block[1] - current_line_y) > 5:
                if current_line_text:
                    # 合并行内文本,去除多余空格
                    merged_line = ' '.join(current_line_text).replace('  ', ' ')
                    hocr_content += f'<span class="ocr_line">{merged_line}</span>\n'
                    current_line_text = []
                current_line_y = block[1]
            current_line_text.append(block_text)
        
        # 处理最后一行
        if current_line_text:
            merged_line = ' '.join(current_line_text).replace('  ', ' ')
            hocr_content += f'<span class="ocr_line">{merged_line}</span>\n'
        
        hocr_content += '</div>\n'

    hocr_content += hocr_footer
    # 写入UTF-8编码的hOCR文件
    with open(output_hocr, 'w', encoding='utf-8') as f:
        f.write(hocr_content)

# 调用示例
extract_clean_hocr("your_armenian_dictionary.pdf", "cleaned_armenian.hocr")

关键逻辑:通过文本块的垂直坐标判断是否属于同一行,合并后去除连续空格;同时直接替换已知的编码错误字符(如²→Ա)。

二、使用Tesseract重新生成标准hOCR(推荐)

如果原PDF的OCR质量不佳,直接用Tesseract针对亚美尼亚语重新生成hOCR是更可靠的方案,步骤如下:

  1. 安装依赖工具:

    # 安装Poppler(用于PDF转图片)和Tesseract及亚美尼亚语语言包
    brew install poppler tesseract tesseract-lang
    
  2. 转换PDF为图片并生成hOCR:

    # 将PDF每页转为PNG图片
    pdftoppm your_armenian_dictionary.pdf armenian_page -png
    # 批量生成单页hOCR文件
    for img in armenian_page-*.png; do
      tesseract "$img" "${img%.png}" -l hy hocr
    done
    # 合并所有单页hOCR为一个完整文件
    cat armenian_page-1.hocr | head -n -2 > combined_armenian.hocr
    for img in armenian_page-*.png; do
      if [ "$img" != "armenian_page-1.png" ]; then
        cat "${img%.png}.hocr" | grep -v "<!DOCTYPE" | grep -v "<html>" | grep -v "<head>" | grep -v "</head>" | grep -v "<body>" | grep -v "</body>" | grep -v "</html>" >> combined_armenian.hocr
      fi
    done
    echo "</body></html>" >> combined_armenian.hocr
    

Tesseract的亚美尼亚语模型会正确识别字符编码,生成的hOCR无冗余空格,且结构标准。

三、修复ocrodjvu环境问题

如果坚持使用ocrodjvu,可通过Homebrew解决依赖问题:

# 安装djvulibre依赖和ocrodjvu
brew install djvulibre ocrodjvu
# 若需Python绑定,额外安装
pip install ocrodjvu

安装完成后,即可用命令提取hOCR:

ocrodjvu --language hy your_document.djvu output.hocr

(注意:若原文件是PDF,需先转为DJVU格式:pdf2djvu your.pdf > your.djvu)

四、批量修复编码错误

如果提取后的hOCR仍有零散编码问题,可通过字符映射批量替换:

def fix_armenian_encoding(hocr_path, output_path):
    # 扩展这个字典覆盖所有错误字符映射
    error_char_map = {
        '²': 'Ա',
        '³': 'Բ',
        '´': 'Գ',
        # 添加更多错误-正确字符对
    }
    with open(hocr_path, 'r', encoding='utf-8') as f:
        content = f.read()
    for wrong_char, correct_char in error_char_map.items():
        content = content.replace(wrong_char, correct_char)
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write(content)

# 调用示例
fix_armenian_encoding("extracted.hocr", "fixed_encoding.hocr")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:27:51