使用cv2转换PDF为PNG时如何将文件名德语变音字符äöü替换为ae、oe、ue
德语变音字符文件名乱码解决方案
核心逻辑
你遇到的lösung类乱码是UTF-8编码的变音字符被错误按Latin-1解析导致的,且OpenCV的imwrite接口原生对非ASCII文件名支持不好,直接替换变音字符为ASCII字符组合是最稳妥的方案。
无需修改原PDF文件,仅在生成输出PNG文件名时做字符替换即可,不会改动源文件,风险更低。
1. 德语变音字符替换函数
def replace_german_umlauts(input_str): # 覆盖大小写变音、德语ß字符的映射规则 char_map = { 'ä': 'ae', 'ö': 'oe', 'ü': 'ue', 'Ä': 'Ae', 'Ö': 'Oe', 'Ü': 'Ue', 'ß': 'ss' } for original, target in char_map.items(): input_str = input_str.replace(original, target) return input_str
2. 修改后的完整可运行代码
from pdf2image import convert_from_path import os import cv2 def replace_german_umlauts(input_str): char_map = { 'ä': 'ae', 'ö': 'oe', 'ü': 'ue', 'Ä': 'Ae', 'Ö': 'Oe', 'Ü': 'Ue', 'ß': 'ss' } for original, target in char_map.items(): input_str = input_str.replace(original, target) return input_str if __name__ == '__main__': # 初始化路径 dir_name = os.getcwd() path_pdf = os.path.join(dir_name, 'data', 'doc', 'October') save_path = os.path.join(dir_name, 'data', 'blanko') # 确保输出目录存在 os.makedirs(save_path, exist_ok=True) # 遍历PDF目录 for pdf_file in os.listdir(path_pdf): # 判断是否为PDF文件,兼容大写PDF后缀 if pdf_file.lower().endswith('.pdf'): full_pdf_path = os.path.join(path_pdf, pdf_file) images = convert_from_path(full_pdf_path, dpi=300, poppler_path='C:/Develop/poppler-0.68.0_x86/poppler-0.68.0/bin') # 处理输出文件名:替换变音字符 + 替换后缀 base_name = os.path.splitext(pdf_file)[0] processed_base_name = replace_german_umlauts(base_name) output_png_name = f"{processed_base_name}.png" output_full_path = os.path.join(save_path, output_png_name) # 保存文件 tmp_path = os.path.join(save_path, 'tmp.png') images[0].save(tmp_path, 'PNG') img = cv2.imread(tmp_path) cv2.imwrite(output_full_path, img)
3. 可选:重命名原PDF文件
如果确实需要批量修改原PDF的文件名,可在遍历文件时新增如下逻辑,操作前请务必备份原文件避免数据丢失:
for pdf_file in os.listdir(path_pdf): if pdf_file.lower().endswith('.pdf'): # 处理原文件名 processed_pdf_name = replace_german_umlauts(pdf_file) old_full_path = os.path.join(path_pdf, pdf_file) new_full_path = os.path.join(path_pdf, processed_pdf_name) # 重命名原文件 os.rename(old_full_path, new_full_path) # 后续转换逻辑直接使用new_full_path即可
内容的提问来源于stack exchange,提问作者Miyn
相关产品推荐
相关产品推荐

