You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从PDF提取文本时遇?Identity-H Unimplemented?错误的解决问询

解决PDF文本提取中Identity-H Unimplemented错误的方案

错误原因

Identity-H是PDF中用于CID字体的水平编码方案,你使用的lopdf库的extract_text方法对这类编码的字体处理不完善,导致抛出未实现的错误,且仅在包含此类字体的PDF中触发。

解决方法

方案1:替换为更成熟的Rust PDF文本提取库

由于lopdf的文本提取功能偏向基础,对复杂字体支持有限,推荐使用依赖专业PDF渲染引擎的crates,以下是两个常用选项:

选项A:使用pdftotext(依赖Poppler)

pdftotext是Poppler工具的Rust绑定,Poppler是成熟的PDF处理库,对各类字体编码支持完善。

  1. 添加依赖到Cargo.toml:
[dependencies]
pdftotext = "0.8"
  1. 替换后的提取代码:
use pdftotext::Pdf;
use std::error::Error;

fn extract_text_from_pdf(file_path: &str) -> Result<String, Box<dyn Error>> {
    let mut pdf = Pdf::open(file_path)?;
    // 提取全文档文本,若需要按页处理可使用pdf.pages()遍历
    let text = pdf.text()?;
    Ok(text)
}

fn main() {
    let file_path = "src/data/temp_storage/DAN.pdf";
    match extract_text_from_pdf(file_path) {
        Ok(text) => println!("Extracted text:\n{}", text),
        Err(e) => eprintln!("Failed to extract text: {}", e),
    }
}

注意:需要先在系统中安装Poppler依赖:

  • Ubuntu/Debian:sudo apt-get install libpoppler-dev
  • macOS:brew install poppler

选项B:使用pdfium-render(依赖Google PDFium)

PDFium是Google开发的PDF渲染引擎,对复杂PDF的兼容性极佳。

  1. 添加依赖到Cargo.toml:
[dependencies]
pdfium-render = "0.18"
  1. 替换后的提取代码:
use pdfium_render::prelude::*;
use std::error::Error;

fn extract_text_from_pdf(file_path: &str) -> Result<String, Box<dyn Error>> {
    // 绑定系统PDFium库,若系统未安装,可使用预编译版本(参考crate文档)
    let pdfium = Pdfium::new(Pdfium::bind_to_system_library()?);
    let document = pdfium.load_pdf_from_file(file_path, None)?;
    
    let mut extracted_text = String::new();
    // 遍历每页提取文本
    for page in document.pages() {
        extracted_text.push_str(&page.text()?);
        extracted_text.push('\n');
    }

    Ok(extracted_text)
}

fn main() {
    let file_path = "src/data/temp_storage/DAN.pdf";
    match extract_text_from_pdf(file_path) {
        Ok(text) => println!("Extracted text:\n{}", text),
        Err(e) => eprintln!("Failed to extract text: {}", e),
    }
}

方案2:尝试修补lopdf的字体处理(不推荐)

若坚持使用lopdf,需要手动处理CID字体的字符映射,但过程繁琐且需要深入理解PDF字体规范,仅适合对PDF格式有一定了解的开发者,不推荐作为快速解决方案。


内容的提问来源于stack exchange,提问作者Oliver Bregneberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:56:13