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),
    }
}

注意事项

  1. 该库主要针对文本提取,不保留原始PDF的复杂布局
  2. 某些加密或特殊格式的PDF可能无法解析
  3. 对于扫描的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),
    }
}

这个完整示例展示了:

  1. 如何提取整个PDF文档的文本内容
  2. 如何提取特定页面的文本
  3. 如何提取带格式的文本(以Markdown格式为例)
  4. 如何提取PDF的元数据信息
  5. 全面的错误处理机制

使用时请确保:

  1. 项目目录下存在example.pdf文件
  2. 已在Cargo.toml中添加pdf-extract依赖
  3. 根据实际需求调整文件路径和参数
回到顶部