logo

如何用Python读取多语言PDF并转为字符串:中日泰文处理全攻略

作者:carzy2025.09.19 15:12浏览量:0

简介:本文详细介绍如何用Python读取含中文、日文、泰文等亚洲语言的PDF文件,提取文本并转为字符串,重点解决OCR识别与编码处理难题,提供完整代码示例与优化建议。

一、背景与需求分析

在全球化信息处理场景中,企业与开发者常面临多语言PDF文本提取需求。例如,日企需将产品说明书PDF转为可编辑文本,中文文献机构需数字化古籍PDF,泰语旅游资料需翻译为多语言版本。传统PDF解析工具对亚洲语言支持不足,主要存在两大痛点:

  1. 编码兼容性:中日泰文使用Unicode多字节编码,普通解析器易出现乱码
  2. 布局识别:竖排日文、复杂中文排版导致文本顺序错乱

本文将系统讲解从PDF读取到字符串存储的全流程,重点解决OCR识别与编码处理两大核心问题。

二、技术方案选型

1. 原生PDF文本提取(适用于可复制文本的PDF)

当PDF包含可复制的文本层时,优先使用PyPDF2或pdfminer.six库:

  1. # 使用PyPDF2提取文本(适用于结构化PDF)
  2. from PyPDF2 import PdfReader
  3. def extract_text_from_pdf(pdf_path):
  4. reader = PdfReader(pdf_path)
  5. text = ""
  6. for page in reader.pages:
  7. text += page.extract_text()
  8. return text
  9. # 使用示例
  10. japanese_text = extract_text_from_pdf("japanese_doc.pdf")
  11. print(japanese_text[:200]) # 打印前200字符验证

局限性:对扫描件或图片型PDF无效,中日泰文混排时可能出现编码错误。

2. OCR识别方案(适用于扫描件PDF)

对于图片型PDF,需结合OCR引擎:

方案一:Tesseract OCR(开源首选)

  1. # 安装依赖:pip install pytesseract pdf2image
  2. import pytesseract
  3. from pdf2image import convert_from_path
  4. def ocr_pdf_to_text(pdf_path, lang='jpn+chi_sim+tha'):
  5. # 将PDF转为图像列表
  6. images = convert_from_path(pdf_path)
  7. # 配置Tesseract路径(根据系统调整)
  8. # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
  9. full_text = ""
  10. for i, image in enumerate(images):
  11. # 多语言混合识别
  12. text = pytesseract.image_to_string(
  13. image,
  14. lang=lang,
  15. config='--psm 6' # 自动页面分割模式
  16. )
  17. full_text += f"\n=== Page {i+1} ===\n" + text
  18. return full_text
  19. # 使用示例
  20. mixed_text = ocr_pdf_to_text("multilingual.pdf")
  21. print(mixed_text[:500])

关键参数说明

  • lang参数:jpn(日文)、chi_sim(简体中文)、tha(泰文)的组合
  • psm模式:6表示假设为统一文本块,适合排版规整的文档

方案二:商业OCR API(高精度场景)

对于专业场景,可考虑以下商业API:

  • 百度OCR:支持中日韩泰等20+语言,提供PDF整体识别接口
  • ABBYY FineReader Engine:企业级OCR,对复杂排版支持优秀
  1. # 伪代码示例(百度OCR需申请API Key)
  2. import requests
  3. def baidu_ocr_pdf(pdf_path, api_key, secret_key):
  4. # 1. 上传PDF获取access_token
  5. # 2. 调用PDF识别接口
  6. # 3. 解析返回的JSON
  7. pass

三、编码处理与字符串存储

1. 编码问题解决方案

亚洲语言处理常见编码问题:

  • 乱码:未正确声明文件编码
  • 截断:字符串处理时未考虑多字节字符

最佳实践

  1. # 显式指定编码读写文件
  2. with open("output.txt", "w", encoding="utf-8") as f:
  3. f.write(mixed_text)
  4. # 安全截取字符串(避免中文字符截断)
  5. def safe_substr(text, max_len):
  6. if len(text.encode('utf-8')) <= max_len:
  7. return text
  8. # 回溯查找最后一个完整字符
  9. for i in range(max_len, 0, -1):
  10. if len(text[:i].encode('utf-8')) <= max_len:
  11. return text[:i]
  12. return ""

2. 结构化存储建议

对于多语言文本,推荐采用JSON格式存储:

  1. import json
  2. data = {
  3. "metadata": {
  4. "source_file": "multilingual.pdf",
  5. "languages": ["jpn", "chi_sim", "tha"],
  6. "page_count": 5
  7. },
  8. "content": {
  9. "page_1": "こんにちは...你好...สวัสดี",
  10. "page_2": "続きのテキスト..."
  11. }
  12. }
  13. with open("output.json", "w", encoding="utf-8") as f:
  14. json.dump(data, f, ensure_ascii=False, indent=2)

四、性能优化与工程实践

1. 大文件处理技巧

对于超过100页的PDF:

  1. # 分块处理示例
  2. def process_large_pdf(pdf_path, chunk_size=10):
  3. reader = PdfReader(pdf_path)
  4. all_text = []
  5. for i in range(0, len(reader.pages), chunk_size):
  6. chunk_text = ""
  7. for page_num in range(i, min(i+chunk_size, len(reader.pages))):
  8. chunk_text += reader.pages[page_num].extract_text()
  9. all_text.append(chunk_text)
  10. # 此处可添加异步处理或存储逻辑
  11. return all_text

2. 质量验证方法

实施三步验证法:

  1. 字符覆盖率检查:统计识别文本中的语言特征字符
  2. 格式一致性验证:检查换行符、标点符号分布
  3. 抽样人工核对:随机抽取1%内容进行人工验证
  1. def validate_text(text, expected_lang):
  2. lang_features = {
  3. 'jpn': ['の', 'は', 'を'],
  4. 'chi_sim': ['的', '了', '是'],
  5. 'tha': ['ก', 'ข', 'ค']
  6. }
  7. if expected_lang not in lang_features:
  8. return False
  9. feature_chars = lang_features[expected_lang]
  10. return any(char in text for char in feature_chars)

五、完整解决方案示例

综合方案实现:

  1. import pytesseract
  2. from pdf2image import convert_from_path
  3. import json
  4. import os
  5. class MultilingualPDFExtractor:
  6. def __init__(self, tesseract_path=None):
  7. if tesseract_path:
  8. pytesseract.pytesseract.tesseract_cmd = tesseract_path
  9. def extract(self, pdf_path, output_format='txt', lang='jpn+chi_sim+tha'):
  10. # 尝试原生文本提取
  11. try:
  12. from PyPDF2 import PdfReader
  13. reader = PdfReader(pdf_path)
  14. text = "\n".join([page.extract_text() for page in reader.pages])
  15. if text.strip(): # 如果提取到文本
  16. return self._save_result(text, pdf_path, output_format)
  17. except:
  18. pass
  19. # 回退到OCR方案
  20. images = convert_from_path(pdf_path)
  21. full_text = ""
  22. for i, img in enumerate(images):
  23. text = pytesseract.image_to_string(
  24. img,
  25. lang=lang,
  26. config='--psm 6'
  27. )
  28. full_text += f"\n=== Page {i+1} ===\n" + text
  29. return self._save_result(full_text, pdf_path, output_format)
  30. def _save_result(self, text, source_file, output_format):
  31. base_name = os.path.splitext(source_file)[0]
  32. result = {
  33. "source": source_file,
  34. "content": text,
  35. "stats": {
  36. "char_count": len(text),
  37. "byte_size": len(text.encode('utf-8'))
  38. }
  39. }
  40. if output_format == 'json':
  41. output_path = f"{base_name}.json"
  42. with open(output_path, 'w', encoding='utf-8') as f:
  43. json.dump(result, f, ensure_ascii=False, indent=2)
  44. return output_path
  45. else: # txt
  46. output_path = f"{base_name}.txt"
  47. with open(output_path, 'w', encoding='utf-8') as f:
  48. f.write(text)
  49. return output_path
  50. # 使用示例
  51. extractor = MultilingualPDFExtractor()
  52. result_path = extractor.extract("multilingual_doc.pdf", output_format='json')
  53. print(f"处理完成,结果保存至: {result_path}")

六、常见问题解决方案

1. 日文竖排文本识别

解决方案:

  • 使用Tesseract的--psm 0模式(自动页面分割)
  • 对竖排文本进行预处理旋转
  1. from PIL import Image
  2. import numpy as np
  3. def rotate_vertical_text(image_path, output_path):
  4. img = Image.open(image_path)
  5. # 转换为numpy数组处理
  6. arr = np.array(img)
  7. # 旋转90度(根据实际排版调整)
  8. rotated = np.rot90(arr, k=3) # k=3表示270度旋转
  9. rotated_img = Image.fromarray(rotated)
  10. rotated_img.save(output_path)
  11. return output_path

2. 泰文字符识别优化

泰文特点:

  • 包含特殊字符和合字
  • 无空格分隔单词

优化建议:

  • 使用泰文专用训练数据(Tesseract的tha.traineddata
  • 后处理添加词边界识别
  1. def post_process_thai(text):
  2. # 简单示例:添加泰文词间空格(实际需更复杂逻辑)
  3. thai_chars = "กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะาำิีึืฺุูเแโใไํ๊์๋์็๎"
  4. processed = []
  5. for char in text:
  6. if char in thai_chars and len(processed) > 0 and processed[-1] not in thai_chars:
  7. processed.append(" ")
  8. processed.append(char)
  9. return "".join(processed)

七、总结与展望

本文提出的解决方案实现了:

  1. 多语言支持:覆盖中日泰文等主要亚洲语言
  2. 双模式处理:原生文本提取与OCR识别自动切换
  3. 企业级实践:包含质量验证、大文件处理等工程优化

未来发展方向:

  • 深度学习模型微调:针对特定领域文本优化识别率
  • 实时处理架构:结合流式PDF解析与增量OCR
  • 多模态处理:同时提取文本、表格和图片信息

通过合理组合现有工具与自定义处理逻辑,开发者可以构建高效可靠的多语言PDF文本提取系统,满足全球化信息处理需求。

相关文章推荐

发表评论