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

使用Rust及pdfium-render给PDF加红色波浪线编译报错求助

问题解决与代码调整

错误原因

你遇到的E0499错误是Rust借用规则的典型表现:当你通过page.objects_mut().iter()获取页面对象的可变迭代器时,已经持有了page的可变借用;此时再调用page.annotations_mut()尝试再次获取page的可变借用,违反了“同一时间只能存在一个可变引用”的规则。

修复后的代码

核心思路是先收集所有页面对象的引用,释放对page的借用后,再逐个添加注解:

use pdfium_render::prelude::*;

fn main() -> Result<(), PdfiumError> {
    let pdfium = Pdfium::default();
    let mut document = pdfium.load_pdf_from_file("test/pdf-in.pdf", None)?;
    
    for (page_index, mut page) in document.pages_mut().iter().enumerate() {
        println!("=============== Page {} ===============", page_index);
        
        // 先收集所有页面对象的不可变引用,完成后释放对page的借用
        let page_objects: Vec<_> = page.objects().iter().collect();
        
        // 遍历收集到的对象,逐个创建波浪线注解
        for object in page_objects {
            let mut annotations = page.annotations_mut();
            annotations.create_squiggly_annotation_under_object(
                object,
                PdfColor::DARK_RED,
                Some("This is a squiggly annotation"),
            )?;
        }
    }
    
    document.save_to_file("test/pdf-out.pdf")
}

代码说明

  1. 收集对象引用:使用page.objects().iter().collect()将所有页面对象的不可变引用存入Vec,此时page的不可变借用会在collect完成后自动释放。
  2. 添加注解:遍历Vec中的对象时,每次调用page.annotations_mut()都是单独获取page的可变借用,操作完成后借用立即释放,不会触发冲突。
  3. 注解创建正确性:create_squiggly_annotation_under_object方法的用法是正确的,它会自动根据目标对象的位置生成红色波浪下划线注解。

学习资源指引

  • Rust核心规则:反复研读《Rust程序设计语言》中的「所有权」「引用与借用」章节,重点理解可变引用的排他性——同一时间只能有一个可变引用,且不可与不可变引用共存。
  • pdfium-render使用:通过cargo doc --open命令生成并查看crate的本地文档,里面包含所有API的详细说明、参数解释和示例代码,尤其是注解相关的模块。
  • 借用冲突解决技巧:
    • 提前收集数据:将需要遍历的元素存入容器,释放原对象的借用后再执行修改操作,这是解决此类冲突最常用的方法。
    • 拆分可变边界:如果操作的是结构体,可以针对不同字段分别获取可变引用(Rust允许同时借用结构体的不同可变字段)。
    • 内部可变性:对于无法通过调整借用顺序解决的场景,可以使用RefCell或Mutex实现内部可变性,但需注意运行时的借用检查开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:19:52