当前位置: 首页 > article >正文

# 026 Agent 的文件处理:PDF、Excel、图片、音频的解析与生成

一、从一次线上事故说起去年冬天凌晨两点我被值班电话吵醒。客户那边一个自动化报表Agent跑崩了日志里只有一行MemoryError: cannot fit int into an index-sized integer。查了半天发现是Agent在处理一个300MB的Excel文件时用pandas.read_excel()直接全量加载把32GB的服务器内存吃光了。更坑的是这个Excel里还混着图片嵌入的批注——openpyxl解析时直接抛了InvalidFileException。从那以后我给自己定了个规矩Agent处理文件第一原则不是“能解析”而是“怎么优雅地崩”。今天这篇笔记就把我这两年踩过的坑、试过的方案从PDF到音频从解析到生成全盘托出。二、PDF别信“一行代码搞定”网上很多教程教你用PyPDF2或pdfplumber说“三行代码提取文本”。但真实场景里PDF是个大坑集合体。2.1 文本提取的“三座大山”第一座扫描件PDF你拿到的PDF可能根本不是文本而是一张张图片。PyPDF2提取出来全是空字符串。这时候得祭出OCRpytesseractpdf2image。但注意pdf2image依赖popplerWindows用户装起来能劝退一半人。我一般这样写frompdf2imageimportconvert_from_pathimportpytesseract# 这里踩过坑DPI设太低中文识别率暴跌设太高内存爆炸imagesconvert_from_path(report.pdf,dpi300,fmtjpeg)textforimginimages:# 别这样写直接传原图背景噪点会让OCR结果惨不忍睹# 先做预处理灰度化 二值化grayimg.convert(L)bwgray.point(lambdax:0ifx128else255)textpytesseract.image_to_string(bw,langchi_simeng)第二座表格PDFpdfplumber提取表格还行但遇到合并单元格、跨页表格结果就乱成一锅粥。我的经验是别指望一次提取完美。先提取原始表格数据再用规则修正importpdfplumberwithpdfplumber.open(invoice.pdf)aspdf:forpageinpdf.pages:tablespage.extract_tables()fortableintables:# 这里踩过坑空单元格返回None直接拼接会报错row_data[]forcellintable:# 别这样写cell.strip() 如果cell是None会AttributeErrorrow_data.append(cell.strip()ifcellelse)第三座加密PDF很多财务PDF有打开密码或权限密码。PyPDF2可以解密但只支持40位和128位RC4加密。遇到256位AES加密换pikepdfimportpikepdf# 别这样写硬编码密码在代码里被审计查到就凉了# 应该从环境变量或密钥管理服务读取passwordos.environ.get(PDF_PASSWORD)withpikepdf.open(encrypted.pdf,passwordpassword)aspdf:# 保存为无密码版本注意覆盖原文件有风险pdf.save(decrypted.pdf)2.2 PDF生成别用reportlab手写reportlab功能强大但API设计反人类。生成一个带中文的PDF字体配置能折腾半天。我现在只用fpdf2轻量且中文支持好fromfpdfimportFPDFclassPDF(FPDF):defheader(self):# 这里踩过坑set_font必须在add_page之后调用self.set_font(NotoSansSC,,12)self.cell(0,10,报告标题,alignC)pdfPDF()pdf.add_font(NotoSansSC,,NotoSansSC-Regular.ttf,uniTrue)pdf.add_page()pdf.set_font(NotoSansSC,,10)# 别这样写直接写长文本超出页面不会自动换行# 用multi_cell代替cellpdf.multi_cell(0,10,这是一段很长的中文文本会自动换行...)pdf.output(output.pdf)三、Excel从“读爆内存”到“流式处理”回到开头的故事。300MB的Excel用pandas.read_excel()直接读相当于把整个文件解压到内存。Excel本质是ZIP压缩包里面是XML文件。openpyxl的read_only模式可以流式读取fromopenpyxlimportload_workbook# 这里踩过坑不指定read_onlyTrue大文件直接OOMwbload_workbook(huge.xlsx,read_onlyTrue,data_onlyTrue)wswb.activeforrowinws.iter_rows(min_row1,max_row10000):# 别这样写row[0].value 如果单元格是公式且data_onlyTrue可能返回None# 应该先判断类型values[]forcellinrow:ifcell.valueisNone:values.append()elifisinstance(cell.value,datetime):values.append(cell.value.strftime(%Y-%m-%d))else:values.append(str(cell.value))# 处理这一行数据比如写入数据库process_row(values)wb.close()# 别忘了关闭否则文件句柄泄漏3.1 写入Excel别用pandas.to_excelpandas.to_excel方便但遇到大数据量写入速度慢得令人发指。而且它依赖openpyxl或xlsxwriter但默认配置下写入100万行数据内存占用会飙升。我改用xlsxwriter直接操作importxlsxwriter workbookxlsxwriter.Workbook(output.xlsx,{constant_memory:True})worksheetworkbook.add_worksheet()# 这里踩过坑不设置列宽中文可能显示不全worksheet.set_column(A:A,20)worksheet.set_column(B:B,30)# 写入表头header_formatworkbook.add_format({bold:True,bg_color:#D9E1F2})worksheet.write(A1,姓名,header_format)worksheet.write(B1,邮箱,header_format)# 流式写入内存恒定fori,rowinenumerate(data,start2):worksheet.write(i,0,row[name])worksheet.write(i,1,row[email])workbook.close()3.2 处理嵌入对象Excel里可能嵌着图片、PDF甚至视频。openpyxl可以读取图片但注意图片是作为PIL.Image对象存在的fromopenpyxlimportload_workbookfromopenpyxl.drawing.imageimportImageasXLImage wbload_workbook(with_images.xlsx)wswb.activeforimageinws._images:# 这里踩过坑image.ref 可能不存在需要先判断ifhasattr(image,ref):img_dataimage.ref# 这是BytesIO对象# 保存到文件withopen(extracted.png,wb)asf:f.write(img_data.getvalue())四、图片Agent的“眼睛”不能瞎Agent处理图片最常见的是OCR和分类。但图片格式、分辨率、色彩空间每个细节都能坑你。4.1 图片解析统一格式是第一步用户上传的图片可能是PNG、JPG、WebP甚至BMP。我习惯先统一转成RGB模式的PNGfromPILimportImageimportiodefnormalize_image(image_bytes):# 这里踩过坑直接Image.open(BytesIO)可能遇到截断的图片try:imgImage.open(io.BytesIO(image_bytes))exceptExceptionase:# 别这样写直接抛异常应该返回错误信息给AgentreturnNone,f图片损坏:{str(e)}# 转换色彩模式ifimg.mode!RGB:imgimg.convert(RGB)# 限制最大尺寸防止OCR时内存溢出max_size(2048,2048)img.thumbnail(max_size,Image.LANCZOS)# 保存为PNG字节流outputio.BytesIO()img.save(output,formatPNG)returnoutput.getvalue(),None4.2 OCR增强不是所有图片都适合直接识别对于扫描件、票据直接OCR效果很差。我总结了一套预处理流程importcv2importnumpyasnpdefpreprocess_for_ocr(image_path):imgcv2.imread(image_path)# 1. 灰度化graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 2. 去噪高斯模糊核大小根据图片分辨率调整blurredcv2.GaussianBlur(gray,(5,5),0)# 3. 二值化OTSU自动阈值_,binarycv2.threshold(blurred,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU)# 4. 去边框很多票据有表格线干扰OCR# 这里踩过坑直接腐蚀膨胀会丢失文字细节kernelnp.ones((2,2),np.uint8)cleanedcv2.morphologyEx(binary,cv2.MORPH_CLOSE,kernel)returncleaned4.3 图片生成别用PIL画复杂图表Agent需要生成图表时matplotlib是首选但注意中文字体问题importmatplotlib.pyplotaspltimportmatplotlibfrommatplotlib.font_managerimportFontProperties# 这里踩过坑不指定字体中文显示为方框fontFontProperties(fname/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc)matplotlib.rcParams[font.family]font.get_name()fig,axplt.subplots()ax.plot(x,y)ax.set_title(销售趋势图,fontpropertiesfont)# 别这样写直接plt.savefig背景默认白色但透明背景在某些场景更好plt.savefig(chart.png,dpi150,bbox_inchestight,transparentFalse)plt.close()五、音频从语音到文本的“最后一公里”音频处理在Agent场景里越来越常见比如语音助手、会议记录。但音频格式、采样率、噪声每个环节都可能翻车。5.1 音频解析格式转换是必修课用户上传的音频可能是MP3、WAV、FLAC甚至AMR。pydub可以处理大部分格式但依赖ffmpegfrompydubimportAudioSegment# 这里踩过坑不指定采样率语音识别模型可能报错audioAudioSegment.from_file(input.mp3)audioaudio.set_frame_rate(16000)# 大多数ASR模型要求16kHzaudioaudio.set_channels(1)# 单声道audioaudio.set_sample_width(2)# 16位PCM# 导出为WAV方便后续处理audio.export(output.wav,formatwav)5.2 语音识别别用免费API做生产环境很多教程推荐speech_recognition库但它底层调的是Google、IBM的免费API有调用次数限制而且延迟不稳定。生产环境我推荐两种方案方案一本地模型Vosk适合离线场景但模型文件较大~50MB中文识别率一般fromvoskimportModel,KaldiRecognizerimportwave modelModel(vosk-model-cn-0.22)wfwave.open(output.wav,rb)recKaldiRecognizer(model,wf.getframerate())whileTrue:datawf.readframes(4000)iflen(data)0:breakifrec.AcceptWaveform(data):resultrec.Result()# 解析JSON提取文本textjson.loads(result)[text]方案二云端API阿里云/腾讯云延迟低准确率高但注意并发限制和费用。我一般封装成异步调用importasyncioimportaiohttpasyncdefrecognize_audio(audio_bytes):# 这里踩过坑不设置超时网络波动时请求会挂起timeoutaiohttp.ClientTimeout(total30)asyncwithaiohttp.ClientSession(timeouttimeout)assession:# 假设是阿里云语音识别APIurlhttps://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/asrheaders{Authorization:Bearer get_token()}asyncwithsession.post(url,dataaudio_bytes,headersheaders)asresp:ifresp.status200:resultawaitresp.json()returnresult[result]else:# 别这样写直接返回空字符串应该记录错误并重试returnNone5.3 音频生成TTS的坑Agent需要语音回复时pyttsx3是离线方案但声音机械感强。在线TTS如Azure、百度效果好但注意流式播放importazure.cognitiveservices.speechasspeechsdk speech_configspeechsdk.SpeechConfig(subscriptionos.environ[AZURE_KEY],regioneastasia)speech_config.speech_synthesis_voice_namezh-CN-XiaoxiaoNeuralsynthesizerspeechsdk.SpeechSynthesizer(speech_configspeech_config)# 这里踩过坑不设置SSML语速、音调无法控制ssmlf speak version1.0 xmlnshttp://www.w3.org/2001/10/synthesis xml:langzh-CN voice namezh-CN-XiaoxiaoNeural prosody rate10% pitch5%{text}/prosody /voice /speak resultsynthesizer.speak_ssml_async(ssml).get()ifresult.reasonspeechsdk.ResultReason.SynthesizingAudioCompleted:audio_dataresult.audio_data# 保存或播放六、个人经验性建议文件处理一定要有超时和大小限制。Agent面对的是不可控的用户输入一个100MB的PDF、10小时的音频如果不加限制能把整个系统拖垮。我一般在入口处就做校验文件大小超过50MB直接拒绝处理时间超过30秒就中断。临时文件管理是隐形炸弹。解析PDF、转换音频都会产生临时文件如果不清理磁盘很快会被占满。我习惯用tempfile.NamedTemporaryFile并设置deleteTrue或者用with语句确保释放。错误处理要分层。文件损坏、格式不支持、API超时每种错误都应该有对应的降级策略。比如PDF解析失败可以尝试用OCR兜底语音识别超时可以返回“暂时无法识别请稍后重试”。日志要记录文件指纹。出问题时光看“文件解析失败”根本没法排查。我每次处理文件都会记录MD5、文件大小、处理耗时方便事后回溯。别迷信“万能解析库”。没有哪个库能处理所有文件变体。PDF有扫描件、加密、表单、注释Excel有宏、嵌入对象、数据验证。我的做法是先尝试主流库失败后用备用方案再失败就返回明确的错误信息而不是让Agent卡死。文件处理是Agent连接物理世界的桥梁也是最容易出幺蛾子的环节。记住能优雅地失败比勉强地成功更重要。

相关文章:

# 026 Agent 的文件处理:PDF、Excel、图片、音频的解析与生成

一、从一次线上事故说起 去年冬天凌晨两点,我被值班电话吵醒。客户那边一个自动化报表Agent跑崩了,日志里只有一行:MemoryError: cannot fit int into an index-sized integer。查了半天,发现是Agent在处理一个300MB的Excel文件时…...

桶排序、堆排序、奇偶排序、计数排序、阿坤老师的独特瓷器、封闭图形个数、二进制王国【算法赛】

桶排序import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collections; import java.util.LinkedList;public class Main {static int N100010,idx;//res0;static String s[]new String[N];static boolean num[…...

#24 Agent 的浏览器自动化:Playwright、Selenium 与网页交互

从一次凌晨三点的事故说起 去年冬天,我负责的一个自动化脚本在凌晨三点突然崩了。日志里只有一行:ElementClickInterceptedException。点一个“确认”按钮,被一个弹窗遮住了。Selenium 的 WebDriverWait 等了十秒,弹窗刚好在点击前…...

免费文本挖掘神器KH Coder:三步掌握多语言内容分析技巧

免费文本挖掘神器KH Coder:三步掌握多语言内容分析技巧 【免费下载链接】khcoder KH Coder: for Quantitative Content Analysis or Text Mining 项目地址: https://gitcode.com/gh_mirrors/kh/khcoder 面对海量文本数据不知从何入手?想从用户评论…...

CANN具身智能优化样例

CANN Recipes for Embodied Intelligence 【免费下载链接】cann-recipes-embodied-intelligence 本项目针对具身智能业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-embodied-intelligence &#…...

如何10分钟快速搭建Sunshine游戏串流服务器:完整实战指南

如何10分钟快速搭建Sunshine游戏串流服务器:完整实战指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款开源的自托管游戏串流服务器,专为M…...

抖音批量下载工具:5分钟搞定无水印内容保存

抖音批量下载工具:5分钟搞定无水印内容保存 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批…...

解锁全平台直播录制:DouyinLiveRecorder让你永不错过精彩瞬间

解锁全平台直播录制:DouyinLiveRecorder让你永不错过精彩瞬间 【免费下载链接】DouyinLiveRecorder 可循环值守和多人录制的直播录制软件,支持抖音、TikTok、Youtube、快手、虎牙、斗鱼、B站、小红书、pandatv、sooplive、flextv、popkontv、twitcasting…...

企业级即时通讯「删除消息」:六个场景叠加之后,复杂性超出你的想象

本文不是一上来就讲方案,而是带你还原真实的业务场景,看清楚复杂性是如何一层一层叠加上来的。每加一个场景,原来的解法就出现新的漏洞,直到六个场景同时存在,你才会明白为什么"删除一条消息"在企业级系统里…...

bili2text:如何用3个步骤将B站视频转换为可搜索的文本知识库?

bili2text:如何用3个步骤将B站视频转换为可搜索的文本知识库? 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在信息过载的数字时代&a…...

TranslucentTB - Windows任务栏透明化技术配置手册

TranslucentTB - Windows任务栏透明化技术配置手册 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是一款专为Windows 10/1…...

Taotoken模型广场如何帮助开发者快速对比与选择合适模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken模型广场如何帮助开发者快速对比与选择合适模型 当开发者需要为大语言模型应用选择基础模型时,常常面临一个现…...

解决Wireshark安装 无法显示USB接口

密评实施过程中,会使用到Wireshark抓取智能密码钥匙的通信流量,但是某些情况下安装Wireshark之后,无法找到USB的捕获接口,重启Wireshark和电脑后还是无法正常显示。如下图。解决办法如下:将“USBPcapCMD.exe”复制到“…...

3D高斯泼溅优化:多项式核函数与高效剔除算法

1. 3D高斯泼溅技术背景与挑战在实时神经渲染领域,3D高斯泼溅(3D Gaussian Splatting, 3DGS)已成为近年来最具突破性的技术之一。这项技术通过将场景表示为大量各向异性高斯基元的集合,实现了高质量的实时渲染效果。每个高斯基元包含位置(μ)、协方差矩阵…...

基于GSAP与线性插值实现丝滑自定义光标动画

1. 项目概述:一个丝滑的现代自定义光标如果你厌倦了浏览器那个千篇一律的箭头指针,想为你的个人作品集、创意网站或者某个酷炫的着陆页注入一点灵动的生命力,那么这个名为“Cuberto Cursor”的项目绝对值得你花时间研究。它不是一个简单的图片…...

如何5分钟搞定抖音无水印视频下载:douyin-downloader完整指南

如何5分钟搞定抖音无水印视频下载:douyin-downloader完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…...

Zotero中文文献识别难题终结者:Jasminum插件深度解析

Zotero中文文献识别难题终结者:Jasminum插件深度解析 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 告别乱码与信息缺…...

Blender MMD Tools终极指南:高效导入导出MMD模型与动作数据的完整解决方案

Blender MMD Tools终极指南:高效导入导出MMD模型与动作数据的完整解决方案 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blend…...

当你的智能体需要处理高并发请求时如何保障 API 稳定性

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 当你的智能体需要处理高并发请求时如何保障 API 稳定性 在智能体应用的实际部署中,用户量的增长或特定时段的高并发请求…...

期末复习方法:从知识树到 AI 闪卡,一套更适合大学生的资料整理法

期末复习最常见的误区,是把“资料看完”当成“知识掌握”。很多学生会把课件、教材、PDF、课堂笔记全部打开,从第一页看到最后一页。看时觉得都懂,合上资料却想不起来;刷题时看到熟悉概念,还是不知道该从哪里入手。这不…...

Arm Neoverse V3AE性能监控架构与PMU寄存器详解

1. Arm Neoverse V3AE性能监控架构深度解析在处理器微架构设计中,性能监控单元(PMU)如同汽车的仪表盘,为开发人员提供观察硬件行为的直接窗口。Arm Neoverse V3AE作为面向基础设施的高性能核心,其PMU实现包含一组精密的…...

增量备份为什么还是这么慢?KingbaseES块级永久增量备份给出答案!

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C知识内容》 《Linux系统知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 ✨逆境不吐心中苦,顺境不忘来时路!✨ 🎬 博主简介: 增量备…...

单例模式:C++实现与多线程安全

1. 核心定义与作用(精准版)定义单例模式是一种创建型设计模式,确保一个类有且仅有一个实例,并向整个系统提供唯一的全局访问点。核心作用控制实例数量:严格保证类在程序生命周期内只有一个对象全局访问:无需…...

C++虚函数机制深度解析:从原理到实战

1. 核心概念与多态实现多态的定义:多态是指“以一个接口,多种实现”的能力。在 C 中,通过在基类中使用 virtual 关键字声明函数,可以实现动态绑定(Dynamic Binding),即在运行时根据对象的实际类…...

Sunshine游戏串流完全指南:打造你的私人游戏云服务

Sunshine游戏串流完全指南:打造你的私人游戏云服务 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否梦想着在任何设备上都能流畅地玩PC游戏?Sunshine正…...

工业物联网实战:从预测性维护到系统优化,制造业数字化转型核心解析

1. 制造业的“静默革命”:当产线开始“思考”如果你在制造业干了十年以上,最近几年可能会有一个越来越强烈的感觉:车间里的机器好像“活”过来了。这不再是科幻电影的桥段,而是一场正在发生的、静默但深刻的革命。过去&#xff0c…...

N_m3u8DL-RE如何深度解析加密流媒体:架构设计与实战优化指南

N_m3u8DL-RE如何深度解析加密流媒体:架构设计与实战优化指南 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL…...

2026中国DevOps平台选型全景洞察:技术适配与效能跃升的深层思考

在中国企业数字化转型浪潮中,DevOps平台作为技术基础设施的核心组件,其选型决策正经历从单纯功能对比向多维度综合评估的转变。2026年,这一选择不再是简单的工具采购,而是关乎企业技术战略、业务发展和合规安全的关键决策。通过对…...

CANN/oam-tools安全声明

安全声明 【免费下载链接】oam-tools 本项目为开发者提供故障定位工具,包含故障信息收集,软硬件信息展示,AI core error报错分析等能力,提升故障问题定位效率,文档可在昇腾社区搜索“故障处理简介”(选择社…...

Gitee与OpenSCA的深度整合:构建企业级开源治理新范式

在数字化转型浪潮中,开源技术已成为企业创新的重要驱动力。然而,伴随开源组件广泛应用而来的安全风险与合规挑战也日益严峻。Gitee作为国内领先的代码托管平台,选择与OpenSCA深度集成,打造了一套完整的开源治理解决方案&#xff0…...