如何用Python从PDF文件夹提取干净日文文本?乱码问题求助
问题背景
我需要用Python从指定PDF文件夹中提取干净的日文文本,先后尝试两段代码均未达到预期:
- PyPDF2库批量处理:遍历目录提取文本并保存为同名TXT,但输出全为乱码,示例乱码如下:
gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003/gai003/gai004/gai003
খࢢදொͷ࠶։ൃϏϧɾαϯϓϥβớຊࣾখỜͷখࢁ౻ࢢձͱ੪౻ਗ਼͕ࣾҰỏब͍͋ͭ͞ͷͨΊখຽใࣾΛ๚Εỏ தࣾ࣍ܒͱ࠙ஊỐủத৺֗ͷ֩ళฮͱͯ͠ỏ
ޙࠓؤுΓ·͢Ứͱ๊ෛΛड़ͨỐ
Ӻલ࠶։ൃϏϧͱͯ͠ҰࣣࣣʹΦồϓϯͨ͠αϯϓϥβỏࠓۀೋेೋỐ֩ςφϯτͷμΠΤồͱͷेؒͷܖΛऴ
͑ỏࡢશؗϦχỿồΞϧͨ͠ỐҰ෦ỏςφϯτ༠க͕Ε͕ͨỏ͜ͷ΄ͲΊͲ͕͍ͭͨͨΊỏখࢁલࣾࡢेೋ݄ͷגओ૯ձͰୀΛਃ͠ೖΕỐࡾ݄ࡾेͷऔకձͰঝೝ͞ΕͨỐ৽ࣾʹࡾͷ੪౻ਗ਼ࠪΛબỐখࢯࢁձʹबͨ͠Ố
খࢁձủࢥ͍ग़Λ͖ͤΓ͕ͳ͍ỨͱΛࡉΊủαϯϓϥβమೆͷ֩Ͱͳ͚ΕͳΒͳ͍Ứͱޙࠓͷళͮ͘ΓʹҙཉỐ੪౻ࣾủখࢁձͷԿͷҰͰ͖ͳ͍ͱࢥ͏͕ỏैۀһʹڠྗͯ͠Βỳͯؤுỳ͍͖͍ͯͨỨͱܾҙΛड़ͨỐݩ͔Βٿͷ۱
ʑ
·ͰỏڥѱԽ͕ਂࠁͷ߹͍Λ૿͍ͯ͠ΔỐμΠΦΩγϯỏ ԹஆԽỏࢎੑӍỏΦκϯഁյỏੜछݮগỏީؾมಈ
/gai007ỐڥࠃΛ͑ỏͦ͢Λ͛ͯ࣍ʑʹಥ͖͚ΒΕΔҟมʹỏҬͲ͏ཱ͔ͪ͏͔Ố͔ͭͯओʹެۀ࢈ͷࢹʹҙΛ͏͚ͩͩ
- PyMuPDF(fitz)单文件处理:提取结果包含日文,但夹杂大量无效字符。
之前的尝试代码
第一段(PyPDF2批量处理)
import os import PyPDF2 # 设置PDF文件所在目录 pdf_directory = '/Users/humnerohit/Desktop/test_pdf_files' # 遍历目录下的所有文件 for filename in os.listdir(pdf_directory): if filename.endswith('.pdf'): # 创建PDF文件对象 pdf_file = open(os.path.join(pdf_directory, filename), 'rb') # 创建PDF读取器对象 pdf_reader = PyPDF2.PdfFileReader(pdf_file) # 遍历PDF的每一页提取文本 text = '' for page_num in range(pdf_reader.numPages): page = pdf_reader.getPage(page_num) text += page.extractText() # 关闭PDF文件 pdf_file.close() # 创建同名TXT文件并写入文本 text_file = open(os.path.join(pdf_directory, filename[:-4] + '.txt'), 'w') text_file.write(text) text_file.close()
第二段(PyMuPDF单文件处理)
import fitz from mecab_text_cleaner import to_reading, to_ascii_clean def pdf_to_text(pdf_path, txt_path): # 打开PDF pdf_document = fitz.open(pdf_path) # 创建文本文件保存提取内容 with open(txt_path, "w", encoding="utf-8") as text_file: for page_number in range(len(pdf_document)): page = pdf_document.load_page(page_number) text = page.get_text() text_file.write(text) # 关闭PDF pdf_document.close() # 示例调用 pdf_path = "/Users/humnerohit/python_pdf_to_text/S19990401A10010001001.pdf" txt_path = "/Users/humnerohit/python_pdf_to_text/S19990401A10010001001.txt" pdf_to_text(pdf_path, txt_path) print("PDF转换为文本成功!")
解决方案
优化思路
PyMuPDF对CJK字符的支持比PyPDF2更稳定,乱码概率低,核心问题是过滤无效字符。通过正则表达式筛选日文相关字符(汉字、平假名、片假名、日文标点),同时保留必要的英文数字,实现批量提取干净文本。
完整实现代码
import os import fitz import re def extract_clean_japanese_text(pdf_path): # 打开PDF文档 doc = fitz.open(pdf_path) full_text = "" # 遍历每一页提取原始文本 for page in doc: text = page.get_text() full_text += text doc.close() # 正则匹配日文及必要字符:覆盖汉字、平假名、片假名、日文标点,可按需调整 pattern = re.compile(r'[\u3000-\u303F\u3040-\u30FF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFFa-zA-Z0-9\s。、,!?;:「」『』()]+') matches = pattern.findall(full_text) # 拼接过滤后的文本,清理多余空白 clean_text = ' '.join(matches).strip() clean_text = re.sub(r'\s+', '\n', clean_text) return clean_text def process_pdf_folder(input_dir, output_dir): # 创建输出目录(不存在则自动创建) os.makedirs(output_dir, exist_ok=True) # 批量处理目录下所有PDF for filename in os.listdir(input_dir): if filename.lower().endswith('.pdf'): pdf_path = os.path.join(input_dir, filename) txt_filename = os.path.splitext(filename)[0] + '.txt' txt_path = os.path.join(output_dir, txt_filename) # 提取并过滤文本 clean_text = extract_clean_japanese_text(pdf_path) # 写入TXT文件(指定UTF-8编码避免乱码) with open(txt_path, 'w', encoding='utf-8') as f: f.write(clean_text) print(f"已处理:{filename} -> {txt_filename}") # 示例调用 input_directory = '/Users/humnerohit/Desktop/test_pdf_files' output_directory = '/Users/humnerohit/Desktop/clean_japanese_texts' process_pdf_folder(input_directory, output_directory) print("所有PDF处理完成!")
代码说明
- 文本提取:依赖PyMuPDF的
get_text()方法,对日文字符的识别准确性优于PyPDF2。 - 正则过滤:通过正则表达式精准筛选有效字符,可根据实际需求调整匹配范围。
- 批量处理:遍历目标文件夹,将处理后的文本保存到独立输出目录,避免覆盖原文件。
- 编码保障:写入文件时指定
utf-8编码,确保日文字符正确存储。
额外提示
- 若PDF为扫描件(图片格式),需使用OCR工具(如
pytesseract配合日文语言包)先识别图片内容,再提取文本。 - 若过滤后仍有少量无效字符,可根据实际出现的字符更新正则表达式的匹配规则。
内容的提问来源于stack exchange,提问作者rohit

