尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

当上传的pdf文件不是纯文本时,包含表格时,PyPDFLoader最终找到的文件时空文件,导致输出报错

当上传的pdf文件不是纯文本时,包含表格时,PyPDFLoader最终找到的文件时空文件,导致输出报错 PyPDFLoader底层使用pypdf主要是通过提取 PDF 的矢量文本流来工作的。对于扫描版 PDF、纯图片 PDF 或包含复杂排版/渲染表格的 PDFPyPDFLoader往往提取不到任何有效文本或只能提取出大量空白从而触发空文档报错。要彻底解决包含表格、扫描件或复杂图文 PDF的解析问题通常有以下3 种主流解决方案方案 1使用unstructured模块解析推荐支持表格结构提取LangChain 官方推荐使用UnstructuredPDFLoader它能够识别复杂的文档结构包括表格、列表、标题等并将其转化为清晰的文本描述。1. 安装依赖pipinstallunstructured[pdf]2. 替换加载器代码将from langchain_community.document_loaders import PyPDFLoader替换为UnstructuredPDFLoaderfromlangchain_community.document_loadersimportUnstructuredPDFLoader# 替换原来的 PyPDFLoader# modesingle 表示将整份文档合并解析也可设为 elements 按表格/段落拆分loaderUnstructuredPDFLoader(tmp_file_path,modesingle)pagesloader.load()方案 2使用pdfplumber解析针对带表格的电子版 PDF如果 PDF 是电子生成的非扫描件但因为里面有表格导致PyPDFLoader抓取失败或乱码pdfplumber是提取表格和文本最精准的工具。1. 安装依赖pipinstallpdfplumber2. 使用pdfplumber编写增强版 PDF 加载函数可以直接替换原代码中的PyPDFLoader部分importpdfplumberfromlangchain_core.documentsimportDocumentdefload_pdf_with_tables(pdf_path):docs[]withpdfplumber.open(pdf_path)aspdf:forpage_num,pageinenumerate(pdf.pages):# 1. 提取普通文本textpage.extract_text()or# 2. 提取表格并转化为 Markdown 格式的文本tablespage.extract_tables()table_texts[]fortableintables:# 过滤全空行clean_table[[cellifcellelseforcellinrow]forrowintableifany(row)]ifclean_table:# 将二维数组表格转换为简单的 Markdown 文本形式forrowinclean_table:table_texts.append( | .join(row))full_contenttext\n\n\n.join(table_texts)iffull_content.strip():docs.append(Document(page_contentfull_content,metadata{page:page_num1}))returndocs在主流程中调用# 3. 加载与解析 PDF 文本支持表格提取pagesload_pdf_with_tables(tmp_file_path)os.remove(tmp_file_path)# 清理临时文件方案 3开启 OCR 支持针对纯图片/扫描版 PDF如果上传的 PDF 是图片扫描件即没有任何文本层则必须依赖OCR光学字符识别。1. 安装依赖需要安装pdf2image和pytesseract同时需在操作系统安装tesseract引擎pipinstallpdf2image pytesseract2. 结合pdf2imagepytesseract的备用提取逻辑可以在文本提取为空时自动降级到 OCR 模式importpytesseractfrompdf2imageimportconvert_from_pathfromlangchain_core.documentsimportDocumentdefload_pdf_with_ocr_fallback(pdf_path):# 先尝试用 pdfplumber 提取docsload_pdf_with_tables(pdf_path)# 如果提取出的内容为空说明可能是扫描件/纯图片 PDF启用 OCR 提取ifnotdocs:imagesconvert_from_path(pdf_path)docs[]fori,imageinenumerate(images):# 使用 OCR 识别图片内容chi_sim 识别中文eng 识别英文textpytesseract.image_to_string(image,langchi_simeng)iftext.strip():docs.append(Document(page_contenttext,metadata{page:i1}))returndocs总结如果主要是带有数据表格的电子版 PDF优先选择方案 2 (pdfplumber)无需额外安装复杂的系统 C 库能精准提取表格内容。如果是复杂的排版文档优先选择方案 1 (unstructured)。如果包含图片扫描件 PDF选择方案 3 (OCR 降级处理)。
返回列表