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

如何用Python从PDF文件夹提取干净日文文本?乱码问题求助

从PDF文件夹提取干净日文文本的解决方案

问题背景

我需要用Python从指定PDF文件夹中提取干净的日文文本,先后尝试两段代码均未达到预期:

  1. 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ỐڥࠃΛ௒͑ỏͦ͢໺Λ޿͛ͯ࣍ʑʹಥ͖෇͚ΒΕΔҟมʹỏ஍Ҭ͸Ͳ͏ཱͪ޲͔͏͔Ố͔ͭͯ͸ओʹ֐ެۀ࢈ͷࢹ؂ʹ஫ҙΛ෷͏͚ͩͩ

  1. 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处理完成!")

代码说明

  1. 文本提取:依赖PyMuPDF的get_text()方法,对日文字符的识别准确性优于PyPDF2。
  2. 正则过滤:通过正则表达式精准筛选有效字符,可根据实际需求调整匹配范围。
  3. 批量处理:遍历目标文件夹,将处理后的文本保存到独立输出目录,避免覆盖原文件。
  4. 编码保障:写入文件时指定utf-8编码,确保日文字符正确存储。

额外提示

  • 若PDF为扫描件(图片格式),需使用OCR工具(如pytesseract配合日文语言包)先识别图片内容,再提取文本。
  • 若过滤后仍有少量无效字符,可根据实际出现的字符更新正则表达式的匹配规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:09:51