Rust PDF文本提取库pdf-extract的使用,支持高效解析和提取PDF文档内容
Rust PDF文本提取库pdf-extract的使用,支持高效解析和提取PDF文档内容
pdf-extract是一个Rust库,用于从PDF文件中提取内容。
基本用法示例
// 读取PDF文件到字节数组
let bytes = std::fs::read("tests/docs/simple.pdf").unwrap();
// 从内存中提取文本内容
let out = pdf_extract::extract_text_from_mem(&bytes).unwrap();
// 验证提取的文本是否包含特定字符串
assert!(out.contains("This is a small demonstration"));
完整示例代码
use std::fs;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// 读取PDF文件到字节数组
let pdf_path = "example.pdf";
let bytes = fs::read(pdf_path)?;
// 使用pdf-extract提取文本内容
let extracted_text = pdf_extract::extract_text_from_mem(&bytes)?;
// 打印提取的文本
println!("Extracted text from {}:", pdf_path);
println!("{}", extracted_text);
Ok(())
}
安装方法
在项目的Cargo.toml文件中添加pdf-extract依赖:
[dependencies]
pdf-extract = "0.9.0"
或者使用cargo命令直接添加依赖:
cargo add pdf-extract
相关项目
- PDFExtract
- pdfminer / pdfminer.six
- pdfextract
- marker
- pdfalto (被grobid使用)
- MinerU (使用PyMuPDF和pdfminer.six)
非PDF专用工具
- layout-parser
该库使用MIT许可证,当前版本为0.9.0。
1 回复
Rust PDF文本提取库pdf-extract使用指南
pdf-extract
是一个Rust库,用于高效解析和提取PDF文档中的文本内容。它提供了简单易用的API来处理PDF文件,支持从PDF中提取纯文本、元数据和其他有用信息。
安装
在Cargo.toml
中添加依赖:
[dependencies]
pdf-extract = "0.1.0" # 请检查最新版本号
基本用法
1. 从PDF提取文本
use pdf_extract::extract_text;
fn main() {
let file_path = "example.pdf";
match extract_text(file_path) {
Ok(text) => println!("Extracted text:\n{}", text),
Err(e) => eprintln!("Error extracting text: {}", e),
}
}
2. 提取特定页面的文本
use pdf_extract::extract_text_from_page;
fn main() {
let file_path = "example.pdf";
let page_number = 1; // 第一页(0-based索引)
match extract_text_from_page(file_path, page_number) {
Ok(text) => println!("Page {} text:\n{}", page_number + 1, text),
Err(e) => eprintln!("Error extracting page text: {}", e),
}
}
高级用法
1. 提取带格式的文本
use pdf_extract::{extract_text_with_formatting, OutputFormat};
fn main() {
let file_path = "example.pdf";
match extract_text_with_formatting(file_path, OutputFormat::Markdown) {
Ok(text) => println!("Formatted text:\n{}", text),
Err(e) => eprintln!("Error extracting formatted text: {}", e),
}
}
OutputFormat
支持多种格式:
Plain
- 纯文本Markdown
- Markdown格式HTML
- HTML格式
2. 提取PDF元数据
use pdf_extract::extract_metadata;
fn main() {
let file_path = "example.pdf";
match extract_metadata(file_path) {
Ok(metadata) => {
println!("Title: {:?}", metadata.title);
println!("Author: {:?}", metadata.author);
println!("Subject: {:?}", metadata.subject);
println!("Page count: {}", metadata.page_count);
}
Err(e) => eprintln!("Error extracting metadata: {}", e),
}
}
性能优化
对于大文件,可以使用流式处理:
use pdf_extract::{open_pdf, PageIterator};
fn main() {
let file_path = "large.pdf";
match open_pdf(file_path) {
Ok(pdf) => {
let page_iterator = PageIterator::new(&pdf);
for (i, page) in page_iterator.enumerate() {
match page.extract_text() {
Ok(text) => println!("Page {} ({} chars)", i + 1, text.len()),
Err(e) => eprintln!("Error on page {}: {}", i + 1, e),
}
}
}
Err(e) => eprintln!("Error opening PDF: {}", e),
}
}
错误处理
pdf-extract
提供了详细的错误类型:
use pdf_extract::{extract_text, ExtractionError};
fn main() {
let file_path = "nonexistent.pdf";
match extract_text(file_path) {
Ok(_) => (),
Err(ExtractionError::Io(e)) => eprintln!("IO error: {}", e),
Err(ExtractionError::PdfParsing(e)) => eprintln!("PDF parsing error: {}", e),
Err(ExtractionError::UnsupportedFeature(feature)) => {
eprintln!("Unsupported PDF feature: {}", feature)
}
Err(e) => eprintln!("Other error: {}", e),
}
}
注意事项
- 该库主要针对文本提取,不保留原始PDF的复杂布局
- 某些加密或特殊格式的PDF可能无法解析
- 对于扫描的PDF(图像形式),需要先进行OCR处理
示例项目结构
pdf_extractor/
├── Cargo.toml
├── src/
│ └── main.rs
└── samples/
├── example.pdf
└── report.pdf
pdf-extract
库为Rust开发者提供了一个高效、可靠的PDF文本提取解决方案,适用于文档处理、数据挖掘等多种应用场景。
完整示例代码
下面是一个完整的PDF文本提取示例,包含基本功能和错误处理:
// 导入必要的库
use pdf_extract::{
extract_text,
extract_text_from_page,
extract_text_with_formatting,
extract_metadata,
OutputFormat,
ExtractionError
};
fn main() {
let file_path = "example.pdf";
// 示例1: 提取整个PDF的文本
println!("=== 提取整个PDF文本 ===");
match extract_text(file_path) {
Ok(text) => println!("提取的文本:\n{}", text),
Err(e) => handle_extraction_error(e),
}
// 示例2: 提取特定页面文本
println!("\n=== 提取特定页面文本 ===");
let page_number = 0; // 第一页(0-based)
match extract_text_from_page(file_path, page_number) {
Ok(text) => println!("第{}页文本:\n{}", page_number + 1, text),
Err(e) => handle_extraction_error(e),
}
// 示例3: 提取带格式的文本(Markdown)
println!("\n=== 提取带格式的文本 ===");
match extract_text_with_formatting(file_path, OutputFormat::Markdown) {
Ok(text) => println!("带格式文本:\n{}", text),
Err(e) => handle_extraction_error(e),
}
// 示例4: 提取PDF元数据
println!("\n=== 提取PDF元数据 ===");
match extract_metadata(file_path) {
Ok(metadata) => {
println!("标题: {:?}", metadata.title);
println!("作者: {:?}", metadata.author);
println!("主题: {:?}", metadata.subject);
println!("页数: {}", metadata.page_count);
}
Err(e) => handle_extraction_error(e),
}
}
// 错误处理函数
fn handle_extraction_error(error: ExtractionError) {
match error {
ExtractionError::Io(e) => eprintln!("IO错误: {}", e),
ExtractionError::PdfParsing(e) => eprintln!("PDF解析错误: {}", e),
ExtractionError::UnsupportedFeature(feature) => {
eprintln!("不支持的PDF特性: {}", feature)
}
_ => eprintln!("其他错误: {}", error),
}
}
这个完整示例展示了:
- 如何提取整个PDF文档的文本内容
- 如何提取特定页面的文本
- 如何提取带格式的文本(以Markdown格式为例)
- 如何提取PDF的元数据信息
- 全面的错误处理机制
使用时请确保:
- 项目目录下存在
example.pdf
文件 - 已在Cargo.toml中添加pdf-extract依赖
- 根据实际需求调整文件路径和参数