Skip to main content
Open In ColabOpen on GitHub

PyMuPDF4LLMLoader

这个笔记本提供了快速入门如何使用 PyMuPDF4LLM 文档加载器。要查看所有 PyMuPDF4LLMLoader 特性和配置的详细文档,请访问 GitHub 仓库

概览

集成细节

Class本地序列化JS支持
PyMuPDF4LLMLoaderlangchain_pymupdf4llm

加载器功能

来源文档延迟加载原生异步支持提取图像提取表格
PyMuPDF4LLMLoader

设置

要访问PyMuPDF4LLM文档加载器,您需要安装langchain-pymupdf4llm集成包。

Credentials

无需凭证即可使用PyMuPDF4LLMLoader。

要启用对您的模型调用的自动跟踪,请设置您的LangSmith API密钥:

# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
# os.environ["LANGSMITH_TRACING"] = "true"

安装

安装 langchain_communitylangchain-pymupdf4llm

%pip install -qU langchain_community langchain-pymupdf4llm
Note: you may need to restart the kernel to use updated packages.

初始化

现在我们可以实例化我们的模型对象并加载文档:

from langchain_pymupdf4llm import PyMuPDF4LLMLoader

file_path = "./example_data/layout-parser-paper.pdf"
loader = PyMuPDF4LLMLoader(file_path)

加载

docs = loader.load()
docs[0]
Document(metadata={'producer': 'pdfTeX-1.40.21', 'creator': 'LaTeX with hyperref', 'creationdate': '2021-06-22T01:27:10+00:00', 'source': './example_data/layout-parser-paper.pdf', 'file_path': './example_data/layout-parser-paper.pdf', 'total_pages': 16, 'format': 'PDF 1.5', 'title': '', 'author': '', 'subject': '', 'keywords': '', 'moddate': '2021-06-22T01:27:10+00:00', 'trapped': '', 'modDate': 'D:20210622012710Z', 'creationDate': 'D:20210622012710Z', 'page': 0}, page_content='\`\`\`\nLayoutParser: A Unified Toolkit for Deep\n\n## Learning Based Document Image Analysis\n\n\`\`\`\n\nZejiang Shen[1] (�), Ruochen Zhang[2], Melissa Dell[3], Benjamin Charles Germain\nLee[4], Jacob Carlson[3], and Weining Li[5]\n\n1 Allen Institute for AI\n\`\`\`\n              shannons@allenai.org\n\n\`\`\`\n2 Brown University\n\`\`\`\n             ruochen zhang@brown.edu\n\n\`\`\`\n3 Harvard University\n_{melissadell,jacob carlson}@fas.harvard.edu_\n4 University of Washington\n\`\`\`\n              bcgl@cs.washington.edu\n\n\`\`\`\n5 University of Waterloo\n\`\`\`\n              w422li@uwaterloo.ca\n\n\`\`\`\n\n**Abstract. Recent advances in document image analysis (DIA) have been**\nprimarily driven by the application of neural networks. Ideally, research\noutcomes could be easily deployed in production and extended for further\ninvestigation. However, various factors like loosely organized codebases\nand sophisticated model configurations complicate the easy reuse of important innovations by a wide audience. Though there have been on-going\nefforts to improve reusability and simplify deep learning (DL) model\ndevelopment in disciplines like natural language processing and computer\nvision, none of them are optimized for challenges in the domain of DIA.\nThis represents a major gap in the existing toolkit, as DIA is central to\nacademic research across a wide range of disciplines in the social sciences\nand humanities. This paper introduces LayoutParser, an open-source\nlibrary for streamlining the usage of DL in DIA research and applications. The core LayoutParser library comes with a set of simple and\nintuitive interfaces for applying and customizing DL models for layout detection, character recognition, and many other document processing tasks.\nTo promote extensibility, LayoutParser also incorporates a community\nplatform for sharing both pre-trained models and full document digitization pipelines. We demonstrate that LayoutParser is helpful for both\nlightweight and large-scale digitization pipelines in real-word use cases.\n[The library is publicly available at https://layout-parser.github.io.](https://layout-parser.github.io)\n\n**Keywords: Document Image Analysis · Deep Learning · Layout Analysis**\n\n    - Character Recognition · Open Source library · Toolkit.\n\n### 1 Introduction\n\n\nDeep Learning(DL)-based approaches are the state-of-the-art for a wide range of\ndocument image analysis (DIA) tasks including document image classification [11,\n\n')
import pprint

pprint.pp(docs[0].metadata)
{'producer': 'pdfTeX-1.40.21',
'creator': 'LaTeX with hyperref',
'creationdate': '2021-06-22T01:27:10+00:00',
'source': './example_data/layout-parser-paper.pdf',
'file_path': './example_data/layout-parser-paper.pdf',
'total_pages': 16,
'format': 'PDF 1.5',
'title': '',
'author': '',
'subject': '',
'keywords': '',
'moddate': '2021-06-22T01:27:10+00:00',
'trapped': '',
'modDate': 'D:20210622012710Z',
'creationDate': 'D:20210622012710Z',
'page': 0}

懒加载

pages = []
for doc in loader.lazy_load():
pages.append(doc)
if len(pages) >= 10:
# do some paged operation, e.g.
# index.upsert(page)

pages = []
len(pages)
6
from IPython.display import Markdown, display

part = pages[0].page_content[778:1189]
print(part)
# Markdown rendering
display(Markdown(part))
pprint.pp(pages[0].metadata)
{'producer': 'pdfTeX-1.40.21',
'creator': 'LaTeX with hyperref',
'creationdate': '2021-06-22T01:27:10+00:00',
'source': './example_data/layout-parser-paper.pdf',
'file_path': './example_data/layout-parser-paper.pdf',
'total_pages': 16,
'format': 'PDF 1.5',
'title': '',
'author': '',
'subject': '',
'keywords': '',
'moddate': '2021-06-22T01:27:10+00:00',
'trapped': '',
'modDate': 'D:20210622012710Z',
'creationDate': 'D:20210622012710Z',
'page': 10}

metadata属性至少包含以下键:

  • 来源
  • 页面(如果在page模式中)
  • total_page
  • 创建日期
  • creator
  • producer

额外的元数据针对每个解析器都是特定的。 这些信息可能很有帮助(例如,对您的PDF文件进行分类)。

Splitting模式 & 自定义页面分隔符

加载PDF文件时,您可以使用两种不同的方式对其进行拆分:

  • By 页
  • 作为单一流程文本

PyMuPDF4LLMLoader 默认会按页分割PDF。

提取PDF的每一页。每一页都被提取为一个langchain Document对象:

loader = PyMuPDF4LLMLoader(
"./example_data/layout-parser-paper.pdf",
mode="page",
)
docs = loader.load()

print(len(docs))
pprint.pp(docs[0].metadata)
16
{'producer': 'pdfTeX-1.40.21',
'creator': 'LaTeX with hyperref',
'creationdate': '2021-06-22T01:27:10+00:00',
'source': './example_data/layout-parser-paper.pdf',
'file_path': './example_data/layout-parser-paper.pdf',
'total_pages': 16,
'format': 'PDF 1.5',
'title': '',
'author': '',
'subject': '',
'keywords': '',
'moddate': '2021-06-22T01:27:10+00:00',
'trapped': '',
'modDate': 'D:20210622012710Z',
'creationDate': 'D:20210622012710Z',
'page': 0}

在该模式下,PDF将按页面拆分,并且生成的文档元数据包含page(页码)。但在某些情况下,我们可能希望将PDF作为单个文本流来处理(这样就不会把一些段落分成两半)。在这种情况下,您可以使用single模式:

将整个PDF提取为单个langchain Document对象:

loader = PyMuPDF4LLMLoader(
"./example_data/layout-parser-paper.pdf",
mode="single",
)
docs = loader.load()

print(len(docs))
pprint.pp(docs[0].metadata)
1
{'producer': 'pdfTeX-1.40.21',
'creator': 'LaTeX with hyperref',
'creationdate': '2021-06-22T01:27:10+00:00',
'source': './example_data/layout-parser-paper.pdf',
'file_path': './example_data/layout-parser-paper.pdf',
'total_pages': 16,
'format': 'PDF 1.5',
'title': '',
'author': '',
'subject': '',
'keywords': '',
'moddate': '2021-06-22T01:27:10+00:00',
'trapped': '',
'modDate': 'D:20210622012710Z',
'creationDate': 'D:20210622012710Z'}

在该模式下,page(page_number)元数据消失了。这里是如何清晰地识别文本流中页面结束的位置:

添加自定义pages_delimiter以在单页模式中识别页面的结束位置:

loader = PyMuPDF4LLMLoader(
"./example_data/layout-parser-paper.pdf",
mode="single",
pages_delimiter="\n-------THIS IS A CUSTOM END OF PAGE-------\n\n",
)
docs = loader.load()

part = docs[0].page_content[10663:11317]
print(part)
display(Markdown(part))

The default pages_delimiter is ----- But this could simply be , or to clearly indicate a page change, or <!-- PAGE BREAK --> for seamless injection in a Markdown viewer without a visual effect.

提取PDF中的图片

您可以从PDF中提取图像(以文本形式),有三种不同的解决方案可供选择:

  • rapidOCR(轻量级光学字符识别工具)
  • Tesseract(具有高精度的OCR工具)
  • 多模态语言模型

The result is inserted at the end of text of the page.

使用rapidOCR从PDF中提取图像:

%pip install -qU rapidocr-onnxruntime pillow
Note: you may need to restart the kernel to use updated packages.
from langchain_community.document_loaders.parsers import RapidOCRBlobParser

loader = PyMuPDF4LLMLoader(
"./example_data/layout-parser-paper.pdf",
mode="page",
extract_images=True,
images_parser=RapidOCRBlobParser(),
)
docs = loader.load()

part = docs[5].page_content[1863:]
print(part)
display(Markdown(part))

请小心,RapidOCR 设计用于识别中文和英文,不支持其他语言。

使用Tesseract从PDF中提取图片:

%pip install -qU pytesseract
Note: you may need to restart the kernel to use updated packages.
from langchain_community.document_loaders.parsers import TesseractBlobParser

loader = PyMuPDF4LLMLoader(
"./example_data/layout-parser-paper.pdf",
mode="page",
extract_images=True,
images_parser=TesseractBlobParser(),
)
docs = loader.load()

print(docs[5].page_content[1863:])

从PDF中提取图像:

%pip install -qU langchain_openai
Note: you may need to restart the kernel to use updated packages.
import os

from dotenv import load_dotenv

load_dotenv()
True
from getpass import getpass

if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass("OpenAI API key =")
from langchain_community.document_loaders.parsers import LLMImageBlobParser
from langchain_openai import ChatOpenAI

loader = PyMuPDF4LLMLoader(
"./example_data/layout-parser-paper.pdf",
mode="page",
extract_images=True,
images_parser=LLMImageBlobParser(
model=ChatOpenAI(model="gpt-4o-mini", max_tokens=1024)
),
)
docs = loader.load()

print(docs[5].page_content[1863:])

从PDF中提取表格

使用 PyMUPDF4LLM,您可以从您的PDF中提取表格,并以Markdown格式呈现:

loader = PyMuPDF4LLMLoader(
"./example_data/layout-parser-paper.pdf",
mode="page",
# "lines_strict" is the default strategy and
# is the most accurate for tables with column and row lines,
# but may not work well with all documents.
# "lines" is a less strict strategy that may work better with
# some documents.
# "text" is the least strict strategy and may work better
# with documents that do not have tables with lines.
table_strategy="lines",
)
docs = loader.load()

part = docs[4].page_content[3210:]
print(part)
display(Markdown(part))

处理文件

许多文档加载器涉及解析文件。此类加载器之间的差异通常源于文件的解析方式,而非文件的加载方式。例如,您可以使用 open 读取 PDF 文件或 Markdown 文件的二进制内容,但您需要不同的解析逻辑将这些二进制数据转换为文本。

作为结果,可以从加载逻辑中分离出解析逻辑,这使得即使数据的加载方式不同,也可以更容易地重用给定的解析器。 您可以使用此策略来分析不同的文件,并且可以使用相同的解析参数。

from langchain_community.document_loaders import FileSystemBlobLoader
from langchain_community.document_loaders.generic import GenericLoader
from langchain_pymupdf4llm import PyMuPDF4LLMParser

loader = GenericLoader(
blob_loader=FileSystemBlobLoader(
path="./example_data/",
glob="*.pdf",
),
blob_parser=PyMuPDF4LLMParser(),
)
docs = loader.load()

part = docs[0].page_content[:562]
print(part)
display(Markdown(part))

API 参考

详细介绍了所有PyMuPDF4LLMLoader功能和配置的文档,请访问GitHub仓库:https://github.com/lakinduboteju/langchain-pymupdf4llm