使用Rust的lopdf crate读取PDF时遇Unicode mismatch日志问题求助
解决lopdf读取PDF时的Unicode mismatch日志问题
一、关闭Unicode mismatch日志
这些日志是lopdf库在处理字符映射时输出的调试信息(属于debug级别),可以通过Rust日志系统过滤关闭:
1. 环境变量快速控制
运行程序时设置RUST_LOG环境变量,过滤掉lopdf的低级别日志:
# 只保留info及以上级别日志,lopdf仅输出error级内容 RUST_LOG=info,lopdf=error ./your_program
2. 代码内配置日志
如果使用env_logger crate,在程序启动时初始化并设置过滤规则:
use env_logger::Builder; use log::LevelFilter; fn main() { // 初始化日志,限制lopdf仅输出error级内容 Builder::new() .filter_level(LevelFilter::Info) .filter_module("lopdf", LevelFilter::Error) .init(); // 你的PDF读取逻辑 let reader = std::io::Cursor::new(buffer); let doc = lopdf::Document::load_from(reader).unwrap(); let mut output = PagePlainTextOutput::new(); output_doc(&doc, &mut output).unwrap(); println!("Output {:?}", output); }
需要在Cargo.toml中添加依赖:
[dependencies] env_logger = "0.10" log = "0.4" lopdf = "0.32" pdf_extract = "0.8"
二、替代的PDF读取方案
如果不想处理日志问题,可尝试更稳定的第三方PDF文本提取库:
1. 使用pdfium-render(基于Google PDFium引擎)
use pdfium_render::prelude::*; fn main() -> Result<(), PdfiumError> { // 初始化PDFium let pdfium = Pdfium::new( Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name())? ); // 加载PDF并提取文本 let document = pdfium.load_document_from_bytes(&buffer, None)?; let mut full_text = String::new(); for page in document.pages() { full_text.push_str(&page.text()?); full_text.push('\n'); } println!("Output {}", full_text); Ok(()) }
依赖配置:
[dependencies] pdfium-render = "0.11"
2. 使用poppler绑定(成熟PDF处理库)
use poppler::Document; fn main() { let document = Document::from_data(&buffer, None).unwrap(); let mut full_text = String::new(); for i in 0..document.n_pages() { let page = document.page(i).unwrap(); full_text.push_str(&page.text().unwrap()); full_text.push('\n'); } println!("Output {}", full_text); }
依赖配置:
[dependencies] poppler = "0.18"
内容的提问来源于stack exchange,提问作者Ansh Joshi
相关产品推荐
相关产品推荐

