从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处理库,对各类字体编码支持完善。
- 添加依赖到
Cargo.toml:
[dependencies] pdftotext = "0.8"
- 替换后的提取代码:
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的兼容性极佳。
- 添加依赖到
Cargo.toml:
[dependencies] pdfium-render = "0.18"
- 替换后的提取代码:
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
相关产品推荐
相关产品推荐

