RAG 加载 pdf 文档

加载 pdf 是复杂并且有多种不同方式的!

1. PyPDFLoader

python 复制代码
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("90-文档-Data/黑悟空/黑神话悟空.pdf")
pages = loader.load()

2. pymupdf

python 复制代码
import pymupdf
# 打开PDF文件
doc = pymupdf.open("90-文档-Data/黑悟空/黑神话悟空.pdf")
text = [page.get_text() for page in doc]

3. pdf2image + pytesseract

python 复制代码
# 扫描图片型 PDF,建议用 pytesseract + pdf2image  
# sudo apt-get install tesseract-ocr
# sudo apt-get install tesseract-ocr-chi-sim

import pdf2image
import pytesseract
import os

# 创建 output 目录
output_dir = 'output'
os.makedirs(output_dir, exist_ok=True)

# 将 PDF 转换为图片并保存
images = pdf2image.convert_from_path('90-文档-Data/黑悟空/黑神话悟空.pdf')
for i, image in enumerate(images):
    image.save(f'{output_dir}/page_{i+1}.png')

# 使用 pytesseract 提取文本
for i, image in enumerate(images):
    text = pytesseract.image_to_string(image, lang='chi_sim')

4. LlamaParse 和 MarkdownElementNodeParser

python 复制代码
# 需要LLAMA_CLOUD_API_KEY
from dotenv import load_dotenv
load_dotenv()   

# LlamaParse PDF reader for PDF Parsing
from llama_parse import LlamaParse
documents = LlamaParse(result_type="markdown").load_data(
    "90-文档-Data/黑悟空/黑神话悟空.pdf"
)
print(documents)

from llama_index.core.node_parser import MarkdownElementNodeParser
node_parser = MarkdownElementNodeParser()
nodes = node_parser.get_nodes_from_documents(documents)

print(nodes)

5. UnstructuredLoader

python 复制代码
from langchain_unstructured import UnstructuredLoader
loader = UnstructuredLoader(
    file_path="90-文档-Data/山西文旅/云冈石窟-en.pdf",  # PDF文件路径
    strategy="hi_res",    # 使用高分辨率策略进行文档处理
    # partition_via_api=True,  # 通过API进行文档分块
    # coordinates=True,     # 提取文本坐标信息
)
docs = []

# lazy_load() 是一种延迟加载方法
# 它不会一次性将所有文档加载到内存中,而是在需要时才逐个加载文档
# 这对于处理大型PDF文件时可以节省内存使用
for doc in loader.lazy_load():
    docs.append(doc)

print(docs)

6. 导入unstructured的partition函数用于PDF解析

python 复制代码
# 导入unstructured的partition函数用于PDF解析
from unstructured.partition.auto import partition

# 设置PDF文件路径
filename = "90-文档-Data/黑悟空/黑神话悟空.pdf"

# 使用partition函数解析PDF文件
# content_type指定文件类型为PDF
elements = partition(filename=filename, 
                   content_type="application/pdf"
                  )

# 展示解析出的elements的类型和内容
print("PDF解析后的Elements类型:")
for i, element in enumerate(elements[:5]):
    print(f"\nElement {i+1}:")
    print(f"类型: {type(element).__name__}")
    print(f"内容: {str(element)}")
    print("-" * 50)

# 统计不同类型elements的数量
element_types = {}
for element in elements:
    element_type = type(element).__name__
    element_types[element_type] = element_types.get(element_type, 0) + 1

print("\nElements类型统计:")
for element_type, count in element_types.items():
    print(f"{element_type}: {count}个")
相关推荐
开开心心就好3 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
M78佐菲5 小时前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习
Setsuna_F_Seiei5 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
益达丫6 小时前
Socket编程揭秘:端口、IP与进程通信的底层逻辑
linux·笔记
百万蹄蹄向前冲7 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙7 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
chicheese8 小时前
Linux 面试速查表:从初级到高级,附高频场景答题模板
linux·运维
linux_cfan9 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
Linux-lucky9 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
kyriewen9 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程