# -*- coding: utf-8 -*-
import os
import re
from pptx import Presentation
# 输入文件夹
input_folder = r"C:\Users\yl\\兴茂"
# 常见错别字 (GIS 相关优先)
typo_dict = {
'帐单': '账单',
'登路': '登录',
'登陆': '登录',
'帐户': '账户',
'在现': '在线',
'再线': '在线',
'以经': '已经',
'在次': '再次',
'工做': '工作',
'做业': '作业',
'须要': '需要',
'必需': '必须',
'带替': '代替',
'佩带'
: '佩戴',
'配带': '佩戴',
'暴发': '爆发',
'报歉': '抱歉',
'爆光': '曝光',
'编缉': '编辑',
'辨论': '辩论',
'布署': '部署',
'材华': '才华',
'仓慌': '仓皇',
'沉缅': '沉湎',
'成诺': '承诺',
'重迭': '重叠',
'穿流不息': '川流不息',
'粗旷': '粗犷',
'大才小用': '大材小用',
'担误': '耽误',
'导至'
: '导致',
'地止': '地址',
'颠复': '颠覆',
'定婚': '订婚',
'定货': '订单',
'斗欧': '斗殴',
'对恃': '对峙',
'恶梦': '噩梦',
'发韧': '发轫',
'法码': '砝码',
'反醒': '反省',
'防碍': '妨碍',
'分岐': '分歧',
'愤概': '愤慨',
'风彩': '风采',
'风糜': '风靡',
'蜂涌': '蜂拥',
'浮浅':
'肤浅',
'幅射': '辐射',
'复盖': '覆盖',
'付业': '副业',
'附合': '附和',
'改斜归正': '改邪归正',
'甘败下风': '甘拜下风',
'感概': '感慨',
'高朝': '高潮',
'告戒': '告诫',
'格守': '恪守',
'各书己见': '各抒己见',
'各行其事': '各行其是',
'功亏一匮': '功亏一篑',
'沟能': '沟通',
'蛊或': '蛊惑',
'故名思义': '顾名思义',
'关健':
'关键',
'观查': '观察',
'贯例': '惯例',
'鬼计': '诡计',
'过份': '过分',
'哈蜜瓜': '哈密瓜',
'含胡': '含糊',
'寒喧': '寒暄',
'汗流夹背': '汗流浃背',
'好高鹜远': '好高骛远',
'和霭': '和蔼',
'宏扬': '弘扬',
'宏亮': '洪亮',
'侯车': '候车',
'侯选': '候选',
'胡涂': '糊涂',
'花辨': '花瓣',
'怀凝':
'怀疑',
'欢渡': '欢度',
'换然': '焕然',
'灰谐': '诙谐',
'混肴': '混淆',
'火中取粟': '火中取栗',
'激流': '激流',
'及使': '即使',
'即然': '既然',
'急燥': '急躁',
'集思广议': '集思广益',
'记念': '纪念',
'技俩': '伎俩',
'佳宾': '嘉宾',
'坚苦': '艰苦',
'艰决': '坚决',
'见义思迁': '见异思迁',
'骄健':
'矫健',
'矫往过正': '矫枉过正',
'秸杆': '秸秆',
'结骨眼': '节骨眼',
'竭泽而鱼': '竭泽而渔',
'戒骄戒燥': '戒骄戒躁',
'今霄': '今宵',
'金壁辉煌': '金碧辉煌',
'禁若寒蝉': '噤若寒蝉',
'进级': '晋级',
'进升': '晋升',
'精兵减政': '精兵简政',
'精采': '精彩',
'痉孪': '痉挛',
'竟赛': '竞赛',
'竟争': '竞争',
'纠分': '纠纷',
'决择': '
抉择',
'决对': '绝对',
'决窍': '诀窍',
'峻工': '竣工',
'开原节流': '开源节流',
'看风驶舵': '看风使舵',
'慷概': '慷慨',
'克苦': '刻苦',
'刻服': '克服',
'枯躁': '枯燥',
'苦思瞑想': '苦思冥想',
'夸夸奇谈': '夸夸其谈',
'脍灸人口': '脍炙人口',
'宽洪大量': '宽宏大量',
'困或': '困惑',
'拉笼': '拉拢',
'烂调': '滥调',
'浪废': '
浪费',
'劳骚': '牢骚',
'乐此不皮': '乐此不疲',
'雷励风行': '雷厉风行',
'冷不妨': '冷不防',
'冷寞': '冷漠',
'礼上往来': '礼尚往来',
'厉精图治': '励精图治',
'厉厉在目': '历历在目',
'立杆见影': '立竿见影',
'立既': '立即',
'连惯': '连贯',
'连系': '联系',
'良晨': '良辰',
'两全齐美': '两全其美',
'了望': '瞭望',
'林阴': '林荫',
'临摩': '
临摹',
'临危不具': '临危不惧',
'灵珑': '玲珑',
'流览': '浏览',
'流恋': '留恋',
'留连': '流连',
'龙盘虎据': '龙盘虎踞',
'拢络': '笼络',
'录相': '录像',
'绿阴': '绿荫',
'轮阔': '轮廓',
'罗辑': '逻辑',
'满腹经伦': '满腹经纶',
'漫骂': '谩骂',
'冒然': '贸然',
'眉青目秀': '眉清目秀',
'媒气': '煤气',
'门坎': '门槛
',
'蒙懂': '懵懂',
'迷或': '迷惑',
'迷团': '谜团',
'密诀': '秘诀',
'面面具到': '面面俱到',
'名信片': '明信片',
'明查暗访': '明察暗访',
'明枪暗剑': '明枪暗箭',
'摸糊': '模糊',
'磨擦': '摩擦',
'莫明其妙': '莫名其妙',
'莫中一是': '莫衷一是',
'墨守陈规': '墨守成规',
'母指': '拇指',
'内哄': '内讧',
'能奈': '能耐',
'能屈能申': '能屈能伸
',
'年背': '年辈',
'宁缺勿滥': '宁缺毋滥',
'扭扣': '纽扣',
'弄巧成绌': '弄巧成拙',
'暖昧': '暧昧',
'诺大': '偌大',
'呕气': '怄气',
'盘据': '盘踞',
'蹒姗': '蹒跚',
'旁证博引': '旁征博引',
'泡漠': '泡沫',
'陪尝': '赔偿',
'喷簿': '喷薄',
'砰击': '抨击',
'烹任': '烹饪',
'披星带月': '披星戴月',
'漂渺': '缥缈
',
'凭心而论': '平心而论',
'破斧沉舟': '破釜沉舟',
'扑溯迷离': '扑朔迷离',
'葡陶': '葡萄',
'七窍生烟': '七窍生烟',
'其貌不洋': '其貌不扬',
'企求': '企求',
'气冲宵汉': '气冲霄汉',
'气慨': '气概',
'气式': '气势',
'恰如其份': '恰如其分',
'牵就': '迁就',
'牵强付会': '牵强附会',
'前扑后继': '前仆后继',
'欠收': '歉收',
'强词夺礼': '强词夺理',
'敲榨': '敲诈
',
'切蹉': '切磋',
'亲睐': '青睐',
'勤肯': '勤恳',
'清彻': '清澈',
'清淅': '清晰',
'情不自尽': '情不自禁',
'穷兵渎武': '穷兵黩武',
'秋后算帐': '秋后算账',
'趋之若骛': '趋之若鹜',
'取谛': '取缔',
'去逝': '去世',
'全神灌注': '全神贯注',
'让位': '让位',
'饶幸': '侥幸',
'惹事生非': '惹是生非',
'热忠': '热衷',
'人才倍出': '人才辈出
',
'人才挤挤': '人才济济',
'人至义尽': '仁至义尽',
'认劳认怨': '任劳任怨',
'融汇贯通': '融会贯通',
'如法泡制': '如法炮制',
'如虎填翼': '如虎添翼',
'如雷灌耳': '如雷贯耳',
'如失重负': '如释重负',
'儒子牛': '孺子牛',
'入不付出': '入不敷出',
'入场卷': '入场券',
'三翻四次': '三番四次',
'杀戳': '杀戮',
'山青水秀': '山清水秀',
'善长': '擅长',
'伤心病狂': '丧心病狂',
'舍身取义': '舍生取义
',
'申张': '伸张',
'深明大意': '深明大义',
'神彩': '神采',
'神密': '神秘',
'审迅': '审讯',
'升官进爵': '升官晋爵',
'生杀与夺': '生杀予夺',
'生死悠关': '生死攸关',
'声音宏亮': '声音洪亮',
'胜卷在握': '胜券在握',
'师付': '师傅',
'时过景迁': '时过境迁',
'识实务者': '识时务者',
'食不裹腹': '食不果腹',
'史无前列': '史无前例',
'使终': '始终',
'誓不两立': '势不两立
',
'收关': '收官',
'手屈一指': '首屈一指',
'受与': '授予',
'书藉': '书籍',
'书声朗朗': '书声琅琅',
'熟视无赌': '熟视无睹',
'水泻不通': '水泄不通',
'水蒸汽': '水蒸气',
'睡眼醒松': '睡眼惺忪',
'说长到短': '说长道短',
'死心踏地': '死心塌地',
'诵扬': '颂扬',
'俗不可奈': '俗不可耐',
'随声附合': '随声附和',
'贪脏': '贪赃',
'坦护': '袒护',
'涛涛不绝': '滔滔不绝
',
'提拨': '提拔',
'题纲': '提纲',
'天翻地复': '天翻地覆',
'天方夜谈': '天方夜谭',
'天经地仪': '天经地义',
'天赖': '天籁',
'天崖': '天涯',
'舔犊情深': '舐犊情深',
'调济': '调剂',
'通谍': '通牒',
'通辑': '通缉',
'通迅': '通讯',
'同仇敌慨': '同仇敌忾',
'同舟共计': '同舟共济',
'偷工减料': '偷工减料',
'投笔从容': '投笔从戎',
'突如奇来': '突如其来
',
'推委': '推诿',
'脱颍而出': '脱颖而出',
'歪风斜气': '歪风邪气',
'完壁归赵': '完璧归赵',
'万赖俱寂': '万籁俱寂',
'万马齐暗': '万马齐喑',
'万事享通': '万事亨通',
'妄费心机': '枉费心机',
'望而怯步': '望而却步',
'微言大意': '微言大义',
'唯妙唯肖': '惟妙惟肖',
'尾大不调': '尾大不掉',
'温文而雅': '温文尔雅',
'文过是非': '文过饰非',
'文恬武嘻': '文恬武嬉',
'稳操胜卷': '稳操胜券',
'翁中捉鳖': '
瓮中捉鳖',
'污告': '诬告',
'无计于事': '无济于事',
'无礼取闹': '无理取闹',
'无微不致': '无微不至',
'无望之灾': '无妄之灾',
'无原无故': '无缘无故',
'五体头地': '五体投地',
'舞蔽': '舞弊',
'物事人非': '物是人非',
'希奇': '稀奇',
'嘻皮笑脸': '嬉皮笑脸',
'洗耳躬听': '洗耳恭听',
'喜出忘外': '喜出望外',
'细水常流': '细水长流',
'暇疵': '瑕疵',
'相形见拙': '相形见绌',
'相辅相承': '
相辅相成',
'相儒以沫': '相濡以沫',
'相得益章': '相得益彰',
'响彻云宵': '响彻云霄',
'消声匿迹': '销声匿迹',
'消毁': '销毁',
'销脏': '销赃',
'协从': '胁从',
'心恢意冷': '心灰意冷',
'心旷神宜': '心旷神怡',
'心劳日绌': '心劳日拙',
'辛亏': '幸亏',
'信口词黄': '信口雌黄',
'信口开合': '信口开河',
'兴高彩烈': '兴高采烈',
'形消骨立': '形销骨立',
'形影相掉': '形影相吊',
'凶相必露': '
凶相毕露',
'秀色可参': '秀色可餐',
'悬梁刺骨': '悬梁刺股',
'眩耀': '炫耀',
'学尔不厌': '学而不厌',
'血气方钢': '血气方刚',
'寻人启示': '寻人启事',
'寻物启示': '寻物启事',
'训戒': '训诫',
'训兽': '驯兽',
'压诈': '压榨',
'严加防犯': '严加防范',
'严历': '严厉',
'言简意骇': '言简意赅',
'研摩': '研磨',
'掩旗息鼓': '偃旗息鼓',
'眼急手快': '眼疾手快',
'扬常而去': '
扬长而去',
'摇控': '遥控',
'摇蓝': '摇篮',
'要言不繁': '要言不烦',
'野性难训': '野性难驯',
'一暴十寒': '一暴十寒',
'一愁莫展': '一筹莫展',
'一蹶不振': '一蹶不振',
'一令': '一令',
'一莫展': '一筹莫展',
'一年之际': '一年之计',
'一偏概全': '一概而论',
'一窍不道': '一窍不通',
'一如继往': '一如既往',
'一视同人': '一视同仁',
'一塌糊涂': '一塌糊涂',
'一相情愿': '一厢情愿',
'一叶障目':
'一叶障目',
'依懒': '依赖',
'依然固我': '依然故我',
'依山旁水': '依山傍水',
'衣蓝褴褛': '衣衫褴褛',
'遗笑大方': '贻笑大方',
'已后': '以后',
'以老卖老': '倚老卖老',
'以偏盖全': '以偏概全',
'以身作责': '以身作则',
'以逸代劳': '以逸待劳',
'义愤填鹰': '义愤填膺',
'义无返顾': '义无反顾',
'异曲同功': '异曲同工',
'抑扬顿错': '抑扬顿挫',
'意兴阑姗': '意兴阑珊',
'意正词严': '义正词严',
'因地治宜':
'因地制宜',
'因才施教': '因材施教',
'阴庇': '荫庇',
'阴谋鬼计': '阴谋诡计',
'引亢高歌': '引吭高歌',
'饮鸠止渴': '饮鸩止渴',
'隐诲': '隐晦',
'英雄倍出': '英雄辈出',
'英雄气慨': '英雄气概',
'营私舞敝': '营私舞弊',
'影牒': '影碟',
'应接不遐': '应接不暇',
'庸人自忧': '庸人自扰',
'永保青春': '永葆青春',
'优柔寡断': '优柔寡断',
'忧柔寡断': '优柔寡断',
'由然而生': '油然而生',
'犹柔寡断':
'优柔寡断',
'犹豫不绝': '犹豫不决',
'有持无恐': '有恃无恐',
'有口皆杯': '有口皆碑',
'有口难辨': '有口难辩',
'有目共赌': '有目共睹',
'有侍无恐': '有恃无恐',
'鱼龙浑杂': '鱼龙混杂',
'鱼目浑珠': '鱼目混珠',
'与日剧增': '与日俱增',
'羽扇伦巾': '羽扇纶巾',
'欲盖弥彰': '欲盖弥彰',
'冤屈': '冤屈',
'原气大伤': '元气大伤',
'原形必露': '原形毕露',
'缘份': '缘分',
'远见灼识': '远见卓识',
'怨天忧人':
'怨天尤人',
'怨天由人': '怨天尤人',
'月晕而风': '月晕而风',
'再接再励': '再接再厉',
'在劫难逃': '在劫难逃',
'脏款': '赃款',
'脏物': '赃物',
'责无旁代': '责无旁贷',
'瞻养': '赡养',
'斩钉接铁': '斩钉截铁',
'占为已有': '占为己有',
'战战惊惊': '战战兢兢',
'张冠李带': '张冠李戴',
'张慌失措': '张皇失措',
'张灯结采': '张灯结彩',
'照像': '照相',
'遮天避日': '遮天蔽日',
'针贬时弊'
: '针砭时弊',
'真知卓见': '真知灼见',
'震奋': '振奋',
'震聋发聩': '振聋发聩',
'争辨': '争辩',
'争研斗艳': '争妍斗艳',
'正襟威坐': '正襟危坐',
'支离破破碎': '支离破碎',
'知迷不悟': '执迷不悟',
'直接了当': '直截了当',
'直言不晦': '直言不讳',
'只尺天涯': '咫尺天涯',
'指高气扬': '趾高气扬',
'至理明言': '至理名言',
'致关重要': '至关重要',
'置若惘闻': '置若罔闻',
'置知罔闻': '置若罔闻',
'中流抵柱'
: '中流砥柱',
'中西合壁': '中西合璧',
'忠贞不逾': '忠贞不渝',
'众口烁金': '众口铄金',
'众说纷云': '众说纷纭',
'众志诚城': '众志成城',
'重蹈复辙': '重蹈覆辙',
'重峦叠障': '重峦叠嶂',
'诛连': '株连',
'珠联壁合': '珠联璧合',
'煮豆燃箕': '煮豆燃萁',
'贮立': '伫立',
'著陆': '着陆',
'转危为安': '转危为安',
'装黄': '装潢',
'装祯': '装帧',
'追朔': '追溯',
'惴惴不安'
: '惴惴不安',
'捉襟见肘': '捉襟见肘',
'卓而不群': '卓尔不群',
'自抱自弃': '自暴自弃',
'自甘堕洛': '自甘堕落',
'自鸣不凡': '自命不凡',
'自命得意': '自鸣得意',
'自怨自哎': '自怨自艾',
'自做自受': '自作自受',
'走头无路': '走投无路',
'罪愧祸首': '罪魁祸首',
'尊循': '遵循',
'作茧自缚': '作茧自缚',
'坐壁上观': '作壁上观',
'坐收鱼利': '坐收渔利',
'做贼心虚': '做贼心虚',
'象': '像', # 图像、影像等
}
# 大小写规范 (GIS 相关优先)
case_patterns = [
(r'\barcGis\b', 'ArcGIS'),
(r'\bArcGis\b', 'ArcGIS'),
(r'\bARCGIS\b', 'ArcGIS'),
(r'\bArcgis\b', 'ArcGIS'),
(r'\barc gis\b', 'ArcGIS'),
(r'\bArc GIS\b', 'ArcGIS'),
(r'\bArcGIS Pro\b', 'ArcGIS Pro'),
(r'\bArcgis Pro\b', 'ArcGIS Pro'),
(r'\bARCGIS Pro\b', 'ArcGIS Pro'),
(r'\bArcMap\b', 'ArcMap'),
(r'\bArcmap\b', 'ArcMap'),
(r'\bARCMAP\b', 'ArcMap'),
(r'\bPYTHON\b', 'Python'),
(r'\bpython\b', 'Python'),
(r'\bWINDOWS\b', 'Windows'),
(r'\bwindows\b', 'Windows'),
(r'\bEXCEL\b', 'Excel'),
(r'\bexcel\b', 'Excel'),
(r'\bWORD\b', 'Word'),
(r'\bword\b', 'Word'),
(r'\bPOWERPOINT\b', 'PowerPoint'),
(r'\bpowerpoint\b', 'PowerPoint'),
(r'\bppt\b', 'PPT'),
(r'\bPDF\b', 'PDF'),
(r'\bpdf\b', 'PDF'),
(r'\bgis\b', 'GIS'),
(r'\bGis\b', 'GIS'),
(r'\bgps\b', 'GPS'),
(r'\bGps\b', 'GPS'),
(r'\bcad\b', 'CAD'),
(r'\bCad\b', 'CAD'),
(r'\bshapefile\b', 'Shapefile'),
(r'\bShapeFile\b', 'Shapefile'),
(r'\bgeodatabase\b', 'Geodatabase'),
(r'\bGeoDatabase\b', 'Geodatabase'),
(r'\bModelBuilder\b', 'ModelBuilder'),
(r'\bModel builder\b', 'ModelBuilder'),
(r'\bArcPy\b', 'arcpy'),
(r'\bARCPY\b', 'arcpy'),
]
def check_and_fix_text(text):
"""检查并修复文本中的问题"""
issues = []
fixed_text = text
if not text or not text.strip():
return fixed_text, issues
# 修复错别字
for wrong, correct in typo_dict.items():
if wrong in fixed_text:
count = fixed_text.count(wrong)
if count >
0:
issues.append({
'type': '错别字',
'original': wrong,
'suggestion': correct,
'count': count,
'context': get_context(fixed_text, wrong)
})
fixed_text = fixed_text.replace(wrong, correct)
# 修复大小写
for pattern, correct in case_patterns:
matches = list(re.finditer(pattern, fixed_text, re.IGNORECASE))
for match in matches:
original = match.group()
if original != correct:
issues.append({
'type': '大小写',
'original': original,
'suggestion': correct,
'count': 1,
'context': get_context(fixed_text, original)
})
fixed_text = fixed_text[:match.start()] + correct + fixed_text[match.end():]
return fixed_text, issues
def get_context(text, target, window=15):
"""获取上下文"""
idx = text.find(target)
if idx == -1:
return text[:40]
start = max(0, idx - window)
end = min(len(text), idx + len(target) + window)
context = text[start:end]
if start > 0:
context = '...' + context
if end < len(text):
context = context + '...'
return context.replace('\n', ' ').strip()
def process_pptx(filepath):
"""处理 PPTX 文件"""
print(f"
\n{'='*70}")
print(f"文件:{os.path.basename(filepath)}")
print('='*70)
prs = Presentation(filepath)
all_issues = []
changes_made = False
for slide_idx, slide in enumerate(prs.slides, 1):
slide_issues = []
# 检查标题
try:
title = slide.shapes.title
if title and title.text:
fixed_text, issues = check_and_fix_text(title.text)
if issues:
for issue in issues:
issue['slide'] = slide_idx
issue['element'] = '标题'
slide_issues.extend(issues)
title.text = fixed_text
changes_made = True
except (AttributeError, KeyError):
pass # 无标题
# 检查形状中的文本
for shape_idx, shape in enumerate(slide.shapes, 1):
if hasattr(shape, "text") and shape.text:
fixed_text, issues = check_and_fix_text(shape.text)
if issues:
for issue in issues:
issue['slide'] = slide_idx
issue['element'] = f'文本框{shape_idx}'
slide_issues.extend(issues)
shape.text = fixed_text
changes_made = True
# 检查表格
for
shape in slide.shapes:
if shape.has_table:
table = shape.table
for row_idx, row in enumerate(table.rows, 1):
for col_idx, cell in enumerate(row.cells, 1):
if cell.text:
fixed_text, issues = check_and_fix_text(cell.text)
if issues:
for issue in issues:
issue['slide'] = slide_idx
issue['element'] = f'表格 R{row_idx}C{col_idx}'
slide_issues.extend(issues)
cell.text = fixed_text
changes_made = True
if slide_issues:
all_issues.extend(slide_issues)
print(f"\n第 {slide_idx} 页 - {len(slide_issues)} 个问题:")
for issue in slide_issues:
print(f" [{issue['type']}] {issue['element']}: '{issue['original']}' → '{issue['suggestion']}' (×{issue['count']})")
print(f" 上下文:{issue['context']}")
if not
all_issues:
print("[OK] 无问题")
return prs, all_issues, changes_made
# 主程序
if __name__ == '__main__':
pptx_files = []
for f in os.listdir(input_folder):
if f.endswith('.pptx'):
pptx_files.append(os.path.join(input_folder, f))
if not pptx_files:
print("未找到 PPTX 文件!")
exit(1)
print(f"找到 {len(pptx_files)} 个 PPTX 文件")
print("将自动检查并修复错别字、大小写不规范等问题")
all_files_issues = {}
total_changes = 0
for pptx in pptx_files:
prs, issues, changed = process_pptx(pptx)
all_files_issues[pptx] = issues
total_changes += len(issues)
if changed:
# 备份
backup_path = pptx.replace('.pptx', '_backup.pptx')
prs.save(backup_path)
print(f"\n[备份] {os.path.basename(backup_path)}")
# 保存修复
prs.save(pptx)
print(f"[修复] {os.path.basename(pptx)}")
else:
print("\n无需修改")
# 汇总报告
print("
\n" + "="*70)
print("汇总报告")
print("="*70)
for filepath, issues in all_files_issues.items():
filename = os.path.basename(filepath)
if issues:
print(f"\n{filename}:")
# 按类型统计
typo_count = sum(1 for i in issues if i['type'] == '错别字')
case_count = sum(1 for i in issues if i['type'] == '大小写')
print(f" 错别字:{typo_count} 处")
print(f" 大小写:{case_count} 处")
print(f" 合计:{len(issues)} 处")
print(f"\n{'='*70}")
print(f"总计修改:{total_changes} 处")
print("="*70)
