如何从含非拉丁文字的可搜索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是更可靠的方案,步骤如下:
安装依赖工具:
# 安装Poppler(用于PDF转图片)和Tesseract及亚美尼亚语语言包 brew install poppler tesseract tesseract-lang转换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
相关产品推荐
相关产品推荐

