#pdf-document #jpeg #image #pdf-file #page #file-path

pdfium-render

基于 Pdfium(Google Chromium 项目使用的 C++ PDF 库)的高层 Rust 风格包装

71 个版本

0.8.24 2024 年 8 月 11 日
0.8.22 2024 年 6 月 16 日
0.8.20 2024 年 3 月 16 日
0.8.17 2023 年 12 月 29 日
0.5.5 2022 年 2 月 24 日

#26图像

Download history 3786/week @ 2024-05-04 2896/week @ 2024-05-11 2903/week @ 2024-05-18 2451/week @ 2024-05-25 2174/week @ 2024-06-01 1625/week @ 2024-06-08 2013/week @ 2024-06-15 1616/week @ 2024-06-22 1159/week @ 2024-06-29 1387/week @ 2024-07-06 1173/week @ 2024-07-13 1549/week @ 2024-07-20 2123/week @ 2024-07-27 1758/week @ 2024-08-03 2322/week @ 2024-08-10 2055/week @ 2024-08-17

8,479 每月下载量
8 crate 中使用

MIT/Apache

9.5MB
149K SLoC

Pdfium 的 idiomatic Rust 绑定

pdfium-render 为 Pdfium(Google Chromium 项目使用的 C++ PDF 库)提供了一个 idiomatic 的高层 Rust 接口。Pdfium 可以将 PDF 文件中的页面渲染为位图,加载、编辑和提取现有 PDF 文件中的文本和图像,并从头创建新的 PDF 文件。

    use pdfium_render::prelude::*;

    fn export_pdf_to_jpegs(path: &impl AsRef<Path>, password: Option<&str>) -> Result<(), PdfiumError> {
        // Renders each page in the PDF file at the given path to a separate JPEG file.

        // Bind to a Pdfium library in the same directory as our Rust executable.
        // See the "Dynamic linking" section below.

        let pdfium = Pdfium::default();

        // Load the document from the given path...

        let document = pdfium.load_pdf_from_file(path, password)?;

        // ... set rendering options that will be applied to all pages...

        let render_config = PdfRenderConfig::new()
            .set_target_width(2000)
            .set_maximum_height(2000)
            .rotate_if_landscape(PdfPageRenderRotation::Degrees90, true);

        // ... then render each page to a bitmap image, saving each image to a JPEG file.

        for (index, page) in document.pages().iter().enumerate() {
            page.render_with_config(&render_config)?
                .as_image() // Renders this page to an image::DynamicImage...
                .into_rgb8() // ... then converts it to an image::Image...
                .save_with_format(
                    format!("test-page-{}.jpg", index), 
                    image::ImageFormat::Jpeg
                ) // ... and saves it to a file.
                .map_err(|_| PdfiumError::ImageError)?;
        }

        Ok(())
    }

pdfium-render 在运行时绑定到 Pdfium 库,允许灵活选择系统提供的或捆绑的 Pdfium 库,并在 Pdfium 库不可用的情况下提供 idiomatic Rust 错误处理。在运行时而不是编译时绑定到 Pdfium 的一个关键优势是,使用 pdfium-render 的 Rust 应用程序可以被编译为 WASM,以便在浏览器中与 Pdfium 的 WASM 打包版本一起运行。

pdfium-render 致力于最终提供对 Pdfium 提供的所有非交互功能进行绑定。这是一个正在进行的工作,将在本 crate 的 1.0 版本中完成。

示例

https://github.com/ajrcarey/pdfium-render/tree/master/examples 提供了简短、带注释的示例,演示了所有主要的 Pdfium 文档处理功能。这些示例包括

  • 将页面和页面部分渲染为位图。
  • 文本和图像提取。
  • 表单字段检查和填充表单字段。
  • 文档签名检查。
  • 创建和检查文档附件。
  • 文档连接。
  • 页面对象检查。
  • 页面注释检查。
  • 页面链接检查。
  • 创建新文档和新页面。
  • 为文本、路径和位图创建页面对象。
  • 页面对象变换。
  • 多页瓦片渲染。
  • 水印。
  • 线程安全。
  • 编译为 WASM。

新增功能

注意:即将发布的 0.9.0 版本将删除所有已弃用的项。有关已弃用项的完整列表,请参阅 https://github.com/ajrcarey/pdfium-render/issues/36

版本 0.8.24 修复了 WASM 绑定实现中某些字符串处理操作中的错误,并引入了控制 pdfium-render 使用的 Pdfium API 版本的能力。默认情况下,pdfium-render 使用 Pdfium API 的最新发布版本,可能需要您升级 Pdfium 库,如果最新版本包含破坏性更改,这可能不方便!要显式使用较旧的 API 版本,请在将 pdfium-render 作为依赖项添加到项目的 Cargo.toml 时选择该crate的 Pdfium 版本功能标志。有关更多信息,请参阅下方的“crate功能”部分。

版本 0.8.23 将 Pdfium 绑定更新到最新上游版本,添加了新的函数 PdfPageTextChar::text_object(),用于检索包含特定字符的文本页面的页面对象,弃用了 PdfFont::name() 函数,改用 PdfFont::family() 以匹配上游命名更改,添加了新的函数 PdfFont::is_embedded()PdfFont::data(),用于检索嵌入的字体数据,更新了 examples/fonts.rs 示例以展示新功能,并根据上游更改调整了一些内部函数的实现。弃用的项目将在 0.9.0 版本中删除。

版本 0.8.22 更新了所有引用来自 image crate 的功能的示例和测试,以使用兼容 image 0.25.x 和 0.24.x 的调用,添加了在编译时静态链接到动态 Pdfium 库的支持,添加了 PdfPages::page_size()PdfPages::page_sizes() 函数以检索一个或所有页面的尺寸,而无需首先将这些页面加载到内存中,并移除了对 iter_tools crate 的不必要内部依赖,这归功于来自 https://github.com/DorianRudolphhttps://github.com/aruediger 的出色贡献。

版本 0.8.21 添加了 PdfFormFieldText::set_value() 函数,用于设置文本表单字段的值,这是由于 https://github.com/liammcdermott 的出色贡献。新的 examples/fill_form_field.rs 示例演示了新功能。

绑定到 Pdfium

pdfium-render 不包含 Pdfium 本身。您有几个选择

  • 绑定到操作系统提供的动态构建的 Pdfium 库。
  • 绑定到与您的 Rust 可执行文件打包在一起的动态构建的 Pdfium 库。
  • 绑定到在编译时链接到您的可执行文件的静态构建的 Pdfium 库。

当编译到 WASM 时,将外部构建的 Pdfium 打包为单独的 WASM 模块是至关重要的。

动态链接

在运行时绑定到预构建的Pdfium动态库是最简单的选项。在Android上,预构建的libpdfium.so已作为操作系统的一部分打包(尽管Android的最新版本不再允许用户应用程序访问它);或者,您可以将适合您操作系统的动态库与您的Rust可执行文件一起打包。

适用于运行时绑定的预构建Pdfium动态库可以从多个来源获得

如果您正在编译原生(即非WASM)构建,并且将适当的Pdfium库放置在您的编译应用程序相同的文件夹中,那么在运行时绑定到它就像这样简单

    use pdfium_render::prelude::*;

    let pdfium = Pdfium::new(
        Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./")).unwrap()
    );

https://github.com/ajrcarey/pdfium-render/tree/master/examples中的示例中,常用的模式是首先尝试绑定到与编译示例相同的文件夹中的Pdfium库,如果失败,则回退到系统提供的库

    use pdfium_render::prelude::*;

    let pdfium = Pdfium::new(
        Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
            .or_else(|_| Pdfium::bind_to_system_library())
            .unwrap() // Or use the ? unwrapping operator to pass any error up to the caller
    );

此模式用于提供Default trait的实现,因此上述内容可以更简单地写成

    use pdfium_render::prelude::*;

    let pdfium = Pdfium::default();

静态链接

static crate功能提供了在编译时将Pdfium直接链接到您的可执行文件的动态链接的替代方案。这启用了Pdfium::bind_to_statically_linked_library()函数,该函数直接绑定到编译到您的可执行文件中的Pdfium函数

    use pdfium_render::prelude::*;

    let pdfium = Pdfium::new(Pdfium::bind_to_statically_linked_library().unwrap());

作为便利,pdfium-render可以指示cargo为您链接到动态构建或静态构建的Pdfium库。要链接到动态构建的库,在运行cargo build时设置PDFIUM_DYNAMIC_LIB_PATH环境变量,如下所示

    PDFIUM_DYNAMIC_LIB_PATH="/path/containing/your/dynamic/pdfium/library" cargo build

pdfium-render将向cargo传递以下标志

    cargo:rustc-link-lib=dylib=pdfium
    cargo:rustc-link-search=native=$PDFIUM_DYNAMIC_LIB_PATH

要链接到静态构建的库,在运行cargo build时使用PDFIUM_STATIC_LIB_PATH环境变量设置包含您的库的目录路径,如下所示

    PDFIUM_STATIC_LIB_PATH="/path/containing/your/static/pdfium/library" cargo build

pdfium-render将向cargo传递以下标志

    cargo:rustc-link-lib=static=pdfium
    cargo:rustc-link-search=native=$PDFIUM_STATIC_LIB_PATH

这两个环境变量可以为您节省编写自定义build.rs的时间。如果您有自己的构建管道,该管道将Pdfium静态链接到您的可执行文件中,只需简单地不要设置这些环境变量。

请注意,您在PDFIUM_DYNAMIC_LIB_PATHPDFIUM_STATIC_LIB_PATH中设置的路径不应包含库本身的文件名;它应该是包含目录的路径。您必须确保您的库以适合您的目标平台的方式命名(例如,Linux和macOS上的libpdfium.solibpdfium.a),以便Rust编译器可以找到它。

根据您的Pdfium库是如何构建的,您可能还需要链接到C++标准库。要链接到GNU C++标准库(libstdc++),请使用可选的libstdc++功能。pdfium-render将向cargo传递以下附加标志。

    cargo:rustc-link-lib=dylib=stdc++

要链接到LLVM C++标准库(libc++),请使用可选的libc++功能。pdfium-render将向cargo传递以下附加标志。

    cargo:rustc-link-lib=dylib=c++

或者,使用link-cplusplus crate来链接到C++标准库。link-cplusplus提供了更多选项来决定应该选择哪个标准库,包括自动选择构建平台的默认安装。

pdfium-render不会为您构建Pdfium;您必须自行构建Pdfium、从其他地方获取预构建的静态存档或使用从上述“动态链接”部分列出的某个来源下载的动态构建库。如果您想自己构建静态库,构建过程的概述(包括示例构建脚本)可在https://github.com/ajrcarey/pdfium-render/issues/53找到。

编译到WASM

请参阅https://github.com/ajrcarey/pdfium-render/tree/master/examples,以了解如何使用pdfium-render捆绑Rust应用程序,并在Web浏览器中检查和渲染PDF文件的预构建Pdfium WASM模块的完整示例。

当编译到WASM时,某些访问文件系统的函数不可用。在所有情况下,都提供了浏览器特定的替代方案,具体细节请参阅上述链接。

在撰写本文时,位于https://github.com/bblanchon/pdfium-binaries/releases的Pdfium的WASM构建使用了非可增长的WASM堆内存分配器。这意味着尝试打开超过几页的PDF文档将导致无法恢复的内存不足错误。位于https://github.com/paulocoutinhox/pdfium-lib/releases的Pdfium的WASM构建推荐使用,因为它没有这个问题。

多线程

Pdfium不对线程安全性做出保证,应假定不是线程安全的。Pdfium的作者特别建议使用并行处理而不是多线程来同时处理多个文档。

pdfium-render通过锁定对Pdfium的互斥锁来保证线程安全;每个线程必须获取对此互斥锁的独占访问权,才能对Pdfium进行任何调用。这会将所有对Pdfium的调用顺序化,就像它们是单线程的一样,即使使用pdfium-render从多个线程中。这种方法没有性能优势,但它确保了当作为多线程应用程序的一部分运行时,Pdfium不会崩溃。

有关如何安全地将pdfium-render作为多线程并行迭代器的一部分使用的示例,请参阅https://github.com/ajrcarey/pdfium-render/tree/master/examples

Crate功能

此crate提供以下可选功能

  • bindings:每次运行cargo build时,使用cbindgen生成Rust绑定到在include/*.h文件中定义的Pdfium函数。如果cbindgen或其任何依赖项不可用,则构建将失败。
  • image:控制image crate是否应由pdfium-render使用以提供页面和页面对象渲染功能。不需要页面或页面对象渲染的项目可以禁用此功能,以避免将image crate编译到它们的二进制文件中。
  • libstdc++:在编译时链接GNU C++标准库。需要static功能。请参阅上面的“静态链接”部分。
  • libc++:在编译时链接LLVM C++标准库。需要static功能。请参阅上面的“静态链接”部分。
  • static:启用绑定到静态链接的Pdfium构建。请参阅上面的“静态链接”部分。
  • sync:为PdfiumPdfDocument结构体提供SendSync特质的实现。这对于创建可以使用lazy_staticonce_cell的静态实例很有用,尽管这些实例不一定线程安全。完全自行承担风险。需要thread_safe功能。
  • thread_safe:将Pdfium的访问封装在互斥锁中,以确保对Pdfium的线程安全访问。请参阅上面的“多线程”部分。

版本0.8.24引入了新功能,可显式控制pdfium-render使用的Pdfium API版本

  • pdfium_future:将PdfiumLibraryBindings绑定到最新发布的Pdfium API,无论这些更改是否已构建到https://pdfium.googlesource.com/pdfium/+/refs/heads/main/public的版本中,当前为6611。这对于测试未发布更改很有用。自动激活bindings功能。
  • pdfium_latest:将PdfiumLibraryBindings绑定到https://github.com/bblanchon/pdfium-binaries/releases中最新发布的Pdfium构建,目前为6611。
  • pdfium_6611pdfium_6569pdfium_6555pdfium_6490pdfium_6406pdfium_6337pdfium_6295pdfium_6259pdfium_6164pdfium_6124pdfium_6110pdfium_6084pdfium_6043pdfium_6015pdfium_5961:将PdfiumLibraryBindings绑定到指定的Pdfium API版本。

imagethread_safepdfium_latest功能默认启用。所有其他功能默认禁用。

将现有Pdfium代码从其他语言移植过来

pdfium-render提供的Rust高级惯用语接口建立在定义在PdfiumLibraryBindings特质的Pdfium API原始FFI绑定之上。如果您愿意,可以直接使用这些原始FFI绑定,这使得移植使用Pdfium API的现有代码变得简单,同时仍然获得晚期绑定和WASM兼容性的好处。例如,以下代码片段(来自C++示例)

    string test_doc = "test.pdf";

    FPDF_InitLibrary();
    FPDF_DOCUMENT doc = FPDF_LoadDocument(test_doc, NULL);
    // ... do something with doc
    FPDF_CloseDocument(doc);
    FPDF_DestroyLibrary();

将转换为以下Rust代码

    let pdfium = Pdfium::default();
    let bindings = pdfium.bindings();
    let test_doc = "test.pdf";

    bindings.FPDF_InitLibrary();
    let doc = bindings.FPDF_LoadDocument(test_doc, None);
    // ... do something with doc
    bindings.FPDF_CloseDocument(doc);
    bindings.FPDF_DestroyLibrary();

Pdfium的API使用三种不同的字符串类型:经典的C风格以null终止的字符数组、UTF-8字节数组以及名为FPDF_WIDESTRING的UTF-16LE字节数组类型。对于接受C风格字符串或UTF-8字节数组的函数,pdfium-render的绑定将使用标准的Rust str类型。对于接受FPDF_WIDESTRING的函数,pdfium-render公开了两个函数:一个接受FPDF_WIDESTRING的纯FPDF_*函数,以及一个额外的辅助函数FPDF__str,它接受一个标准的Rust str并在调用Pdfium之前将其内部转换为FPDF_WIDESTRING。带有额外FPDF__str辅助函数的函数示例包括FPDFBookmark_FindFPDFText_SetTextFPDFText_FindStartFPDFDoc_AddAttachmentFPDFAnnot_SetStringValueFPDFAttachment_SetStringValue

提供了两个实用函数PdfiumLibraryBindings::get_pdfium_utf16le_bytes_from_strPdfiumLibraryBindings::get_string_from_pdfium_utf16le_bytes,用于在您的代码中将数据转换为和从FPDF_WIDESTRING

一些Pdfium函数返回经典的C风格整数布尔值,别名FPDF_BOOL。提供了实用函数TRUEFALSEis_trueto_resultbool_to_pdfium,用于在您的代码中将数据转换为和从FPDF_BOOL

在Pdfium中,图像像素数据以三通道BGR或四通道BGRA进行编码。提供了以下实用函数,用于在您的代码中在RGB和BGR图像数据之间进行转换:PdfiumLibraryBindings::bgr_to_rgba()PdfiumLibraryBindings::bgra_to_rgba()PdfiumLibraryBindings::rgb_to_bgra(),和PdfiumLibraryBindings::rgba_to_bgra()

开发状态

这个crate的最初重点是渲染PDF文件中的页面;因此,与页面渲染相关的FPDF_*函数被优先考虑。到1.0版本,所有Pdfium模块导出的FPDF_*函数的功能都将可用,但交互式脚本、用户交互和打印等特定函数除外。

  • 0.4.x版本的发布增加了对基本页面渲染Pdfium函数的支持到pdfium-render
  • 0.5.x-0.6.x版本的发布增加了对大多数只读Pdfium函数的支持到pdfium-render
  • 0.7.x版本的发布增加了对大多数Pdfium页面对象创建和编辑函数的支持到pdfium-render
  • 0.8.x版本的发布旨在逐步将所有剩余的Pdfium编辑函数添加到pdfium-render
  • 0.9.x版本的发布旨在在1.0之前填补高级接口中的任何剩余空白。

Pdfium API中有377个FPDF_*函数。截至版本0.8.24,其中334个(89%)在PdfiumLibraryBindings中提供了绑定,大多数这些功能通过pdfium-render高级接口可用。

自最初实现以来,高级接口中的一些函数和类型定义已被重命名或修改。最初实现仍然可用,但已标记为弃用。这些弃用项将在0.9.0版本中删除。

如果您需要绑定当前不可用的Pdfium函数,请只需在https://github.com/ajrcarey/pdfium-render/issues上提出问题。

版本历史

  • 0.8.24:引入了crate功能标志,用于在PdfiumLibraryBindings中选择要使用的Pdfium API版本;重新工作了build.rs以输出多个Pdfium头文件的绑定;重新工作了绑定实现以区分包含0.8.23中添加的FPDFFont_*FPDFText_GetTextObject()函数的API版本,以及不包含这些函数的API版本;内部重新组织源代码布局以使代码结构更清晰。
  • 0.8.23: 将Pdfium API头文件与主线同步;根据上游变更(在https://github.com/ajrcarey/pdfium-render/issues/151中描述)移除对函数FPDFText_GetTextRenderMode()的绑定;添加对FPDFText_GetTextObject()FPDFFont_GetFamilyName()FPDFFont_GetIsEmbedded()FPDFFont_GetFontData()函数的绑定;弃用PdfFont::name()函数,改为使用PdfFont::family()以匹配上游的命名更改;添加新的函数PdfFont::is_embedded()PdfFont::data()以检索嵌入的字体数据;更新examples/fonts.rs示例;添加用于检索包含特定字符的页面对象的新的函数PdfPageTextChar::text_object();添加WASM绑定实用函数copy_string_to_pdfium(),以便正确地将FPDF_WIDESTRING的字符串数据复制到Pdfium的WASM内存模块中,而不是仅仅复制指针位置。弃用的项目将在0.9.0版本中移除。
  • 0.8.22: 添加对FPDFPage_TransformAnnots()的绑定,感谢https://github.com/liammcdermott的出色贡献;添加对FPDF_GetPageSizeByIndexF()的绑定,感谢https://github.com/DorianRudolph的出色贡献;更新所有引用了来自imagecrate的功能的所有示例和测试,使其兼容image 0.25.x和0.24.x,感谢https://github.com/DorianRudolph的出色贡献;添加对在编译时静态链接到动态构建的Pdfium库以及动态绑定缓存的动态链接支持,以提高运行时性能,感谢https://github.com/DorianRudolph的出色贡献;添加PdfPages::get_page_size()PdfPages::get_page_sizes()函数的支持,感谢https://github.com/DorianRudolph的出色贡献;移除对iter_toolscrate的不必要内部依赖,感谢https://github.com/aruediger的出色贡献。
  • 0.8.21: 添加用于设置文本表单字段值的函数PdfFormFieldText::set_value(),感谢https://github.com/liammcdermott的出色贡献;添加新的examples/fill_form_field.rs示例。
  • 0.8.20: 增加了结构体 PdfPageAnnotationAttachmentPoints 和对应的迭代器;在 PdfPageAnnotationCommon 中增加了新的注释函数,包括在 PdfPageAnnotationPrivate 中的对应实现,例如 PdfPageAnnotationCommon::set_bounds()PdfPageAnnotationCommon::set_position()PdfPageAnnotationCommon::set_width()PdfPageAnnotationCommon::set_height()PdfPageAnnotationCommon::set_creation_date()PdfPageAnnotationCommon::set_modification_date()PdfPageAnnotationCommon::stroke_color()PdfPageAnnotationCommon::set_stroke_color()PdfPageAnnotationCommon::fill_color()PdfPageAnnotationCommon::set_fill_color() 函数;增加了访问函数 PdfPageAnnotationCommon::attachment_points();将 chrono::DateTime 类型转换为 PDF 日期字符串的功能,在 utils::dates 中;向 PdfPageAnnotations 集合中添加了可变性和注释创建函数;添加了新的 create_annotations.rs 示例;添加了便利函数 PdfPageTextSegment::chars()
  • 0.8.19: 增加了 FORM_OnAfterLoadPage()FORM_OnBeforeClosePage()FPDFCatalog_IsTagged()FPDFBookmark_GetCount()FPDF_GetPageAAction() 函数的绑定;增加了函数 PdfBookmark::children_len();调整了 PdfPage::flatten() 的行为,使得在调用 FPDFPage_Flatten() 之后页面会重新加载。这确保了 flatten 操作的效果立即对调用者可见;之前,调用者需要显式地卸载和重新加载页面。更多详情请见 https://github.com/ajrcarey/pdfium-render/issues/140
  • 0.8.18: 调整 PdfiumRenderWasmState::bind_to_pdfium(),使其在全局变量 Window.wasmTable 不可用的情况下回退到 Module["wasmExports"]["__indirect_function_table"],以应对在 https://github.com/paulocoutinhox/pdfium-lib/releases 的上游打包更改。更多详情,请参阅 https://github.com/ajrcarey/pdfium-render/issues/134
  • 0.8.17: 更新所有示例(除了 export.rs),使其使用 0.8.12 中引入的扩展 Pdfium::default() 实现方式;修复了在使用启用 V8/XFA 的 Pdfium 构建时可能发生的段错误,调整 PdfiumRenderWasmState::bind_to_pdfium() 以回退到 Module["wasmExports"]["malloc"]Module["wasmExports"]["free"],如果 Module["_malloc"]Module["_free"] 不可用,以应对在 https://github.com/paulocoutinhox/pdfium-lib/releases 的上游打包更改。更多详情,请参阅 https://github.com/ajrcarey/pdfium-render/issues/128
  • 0.8.16: 废弃了 PdfBitmap::as_bytes() 函数,改用 PdfBitmap::as_raw_bytes();添加了新的 PdfBitmap::as_rgba_bytes() 函数,用于返回带有归一化颜色通道的像素字节数据,无论原始位图像素格式如何;更新了针对 WASM 的特定 PdfBitmap::as_image_data() 函数,使用 PdfBitmap::as_rgba_bytes() 代替 PdfBitmap::as_raw_bytes(),以确保 WASM 和非 WASM 构建的色彩归一化行为相同;根据 https://github.com/ajrcarey/pdfium-render/issues/120 反馈,重构了 PdfBookmarksIterator 以使用标准的深度优先图遍历算法;添加了 PdfBookmark::destination() 函数,用于检索分配给书签的操作的目标位置,得益于 https://github.com/xVanTuring 的卓越贡献。废弃的项目将在 0.9.0 版本中删除。
  • 0.8.15: 为 create_transform_setters!() 宏的消费者添加了新的 reset_matrix()reset_matrix_to_identity() 函数;废弃了 set_matrix() 函数,改用 apply_matrix()PdfPage::set_matrix_with_clip() 函数,改用 PdfPage::apply_matrix_with_clip();添加了一个修正字节对齐错误的补丁,该错误可能在将每像素三个字节的位图转换为每像素四个字节的位图时发生,得益于 https://github.com/vladmovchan 的卓越贡献。废弃的项目将在 0.9.0 版本中删除。
  • 0.8.14: 调整了 0.8.13 中引入的 PdfSearchOptions::as_pdfium() 函数,使其返回 c_ulong,以修复 Windows 确切性错误。
  • 0.8.13: 修复了返回不正确结果的 PdfPageTextObject::chars() 方法,如https://github.com/ajrcarey/pdfium-render/issues/98所述;添加了新的 PdfPageTextSearchPdfSearchOptions 对象以及新的 PdfPageText::search() 函数,用于在单页文本中执行文本搜索,感谢 https://github.com/zhonghua-wang 的卓越贡献;添加了新的 examples/text_search.rs 示例。
  • 0.8.12: 改进了与 Rust 版本 1.62.0 之前版本的向后兼容性,包括在 0.8.11 中添加的 PdfAppearanceMode 枚举和在 0.8.10 中添加的 Ord 特性实现的 PdfPoints;添加了 FPDF_PageToDevice()FPDF_DeviceToPage() 坐标系统转换函数的绑定;通过新的 PdfPage::points_to_pixels()PdfPage::pixels_to_points() 函数在高级接口中暴露了等效功能;添加了新的 examples/export_clip_crop.rs 示例;扩展了 Pdfium::default() 的实现,尝试加载位于当前工作目录的 Pdfium 库以及系统库。
  • 0.8.11: 添加了 PdfAppearanceMode 枚举,以及 PdfFormFieldCommon::appearance_stream()PdfFormFieldCommon::appearance_mode_value() 函数,支持在 PdfFormFieldPrivate 中内部实现这些函数;改进了 PdfFormRadioButtonField::is_checked() 的实现,以考虑外观流;改进了 PdfForm::field_values() 的实现,以考虑控件组。
  • 0.8.10: 向 PdfMatrix 添加了矩阵数学运算;添加了 PdfRect::transform()PdfMatrix::apply_to_points() 函数,用于转换矩形和点;在 PdfMatrix 中使用矩阵数学运算简化了 PdfRenderConfig 的实现;添加了 PdfDestinationViewSettings 枚举和 PdfDestination::view() 函数,用于检索内部文档目标的视图设置。
  • 0.8.9: 更改了 Pdfium::bind_to_library()Pdfium::pdfium_platform_library_name_at_path() 的实现,使其接受并返回 AsRef<Path>PathBuf 类型而不是字符串,这是由于来自 https://github.com/heimmat 的出色贡献。
  • 0.8.8: 将 PdfiumRenderWasmState::bind_to_pdfium() 调整为当 Module["_malloc"]Module["_free"] 不可用时,回退到 Module["asm"]["malloc"]Module["asm"]["free"],以应对来自 https://github.com/paulocoutinhox/pdfium-lib/releases 的上游打包更改。更多详细信息,请参阅 https://github.com/ajrcarey/pdfium-render/issues/95
  • 0.8.7: 将 PdfBitmapFormat::BRGx 重命名为 PdfBitmapFormat::BGRx,弃用拼写错误的变体;当使用 sync crate 功能时,为 PdfDocument 结构添加了 SendSync 实现;添加了 Debug 特性实现到 Pdfium 中,以更好地与 once_cell 兼容;添加了新的常量 PdfPoints::MAXPdfPoints::MINPdfRect::MAX;通过将默认裁剪区域设置为 PdfRect::MAX 而不是 PdfPage::size(),纠正了 PdfPage::transform()PdfPage::set_matrix() 中的裁剪错误。弃用项目将在 0.9.0 版本中删除。
  • 0.8.6: 修复了 PdfColor::as_pdfium_color() 中的一个bug,该bug导致在组合颜色值的 FPDF_DWORD 表示时忽略了透明度值;将 PdfBitmapRotation 枚举重命名为 PdfPageRenderRotation,弃用了旧枚举;添加了便利函数 PdfColor::mix()PdfColor::mix_with()PdfColor::from_hex()PdfColor::to_hex()PdfColor::to_hex_with_alpha();向 PdfColor 添加了大量的新颜色常量,弃用了所有现有的 PdfColor::SOLID_* 常量,转而使用带有移除 SOLID_ 前缀的已重命名常量;将 PdfPointsPdfRect 结构体移动到新文件中;添加了 PdfQuadPoints 结构体;向 PdfPointsPdfRectPdfQuadPoints 添加了 Display 的实现;修复了 PdfPageImageObject::get_image_from_bitmap_handle() 中的双重释放bug。弃用的项目将在0.9.0版本中移除。
  • 0.8.5: 添加了 PdfDestination::page_index() 函数;添加了 PdfPageObjectCommon::dash_phase()PdfPageObjectCommon::set_dash_phase()PdfPageObjectCommon::dash_array()PdfPageObjectCommon::set_dash_array() 函数,归功于来自 https://github.com/DorianRudolph 的出色贡献。
  • 0.8.4: 修复了将 PdfPoints 结构体条件导入 PdfPageImageObject 的问题,使其不再依赖于 image crate 功能被启用;纠正了渲染位图像素尺寸计算中的bug,归功于来自 https://github.com/slawekkolodziej 的出色贡献。
  • 0.8.3: 添加了 PdfFonts 集合,PdfDocument::fonts()PdfDocument::fonts_mut() 访问器函数,以及 PdfFontToken 结构体;将字体构造函数从 PdfFont 移入 PdfFonts,弃用 PdfFont 中的构造函数;添加了 ToPdfFontToken 特性,包括为 PdfFont&PdfFontPdfFontToken 实现该特性的方法;调整了之前接收 PdfFont&PdfFont 引用的所有函数,使其现在接收 impl ToPdfFontToken 实现的引用。弃用的 PdfFont 项将在 0.9.0 版本中移除。
  • 0.8.2: 响应 https://github.com/ajrcarey/pdfium-render/issues/83,添加了 PdfBitmap::from_bytes() 函数;由于 https://github.com/bavardage 的出色贡献,放宽了 Pdfium::load_pdf_from_reader() 和相关函数的生命周期要求。
  • 0.8.1: 响应 https://github.com/ajrcarey/pdfium-render/issues/80,将 PdfBitmap::Pixels 的数据类型从 u16 更改为 c_int,并添加了 PdfBitmap::bytes_required_for_size() 辅助函数。
  • 0.8.0: 根据 https://github.com/ajrcarey/pdfium-render/issues/47,移除了从 PdfDocument::pages() 获取拥有 PdfPages 实例的能力;添加了新的 PdfDocument::pages_mut() 函数以匹配重写的 PdfDocument::pages() 函数;修复了 FPDFText_GetBoundedText() WASM 实现中的一个错误,具体信息请参见 https://github.com/ajrcarey/pdfium-render/issues/77;根据 https://github.com/ajrcarey/pdfium-render/issues/78 的详细信息重写了 FPDF_GetLastError() 的处理。
  • 0.7.34: 使用二分搜索遍历替换 PdfPageLinks 中的函数;添加新的 PdfFormField 枚举;将 PdfPageObjectFormFragment 重命名为 PdfPageXObjectFormObject 以消除与 PdfFormPdfFormField 的歧义;添加访问器函数 PdfPageAnnotationCommon::as_form_field();添加表单字段结构 PdfFormPushButtonFieldPdfFormCheckboxFieldPdfFormComboBoxFieldPdfFormListBoxFieldPdfFormRadioButtonFieldPdfFormSignatureFieldPdfFormTextFieldPdfFormUnknownField;添加 PdfFormFieldOption 结构和 PdfFormFieldOptions 集合,用于检索列表框或组合框字段中显示的选项;添加 PdfFormFieldCommonPdfFormFieldPrivate 特性和所有 PdfFormField 字段类型的关联实现;添加方便函数 PdfForm::field_values();添加示例 examples/form_fields.rs
  • 0.7.33: 添加私有宏 create_transform_setters!()create_transform_getters!(),确保 API 一致性并最大程度地复用所有可转换对象的代码;添加函数 PdfPage::transform()PdfPage::transform_with_clip()PdfPage::set_matrix_with_clip();添加示例 examples/matrix.rs;添加剩余的 FPDF_*ClipPath*() 函数的绑定。
  • 0.7.32: 修复 PdfPageText::chars_inside_rect()examples/chars.rs 中的 off-by-one 错误,归功于来自 https://github.com/luketpeterson 的出色贡献,添加对灰度图像处理的支撑到 PdfPageImageObject::get_image_from_bitmap_handle(),归功于来自 https://github.com/stephenjudkins 的出色贡献,并修复使用不带默认 image crate 特性的 pdfium-render 时的缺失依赖问题。
  • 0.7.31: 添加 PdfPageLinks 集合,PdfPage::links()PdfPage::links_mut() 函数,PdfLinkPdfDestination 结构体,PdfActionCommonPdfActionPrivate 特性,Pdfium 支持的动作类型结构体,函数 PdfActionUri::uri() 用于解决 https://github.com/ajrcarey/pdfium-render/issues/68 的问题,以及新的示例 examples/links.rs
  • 0.7.30: 废弃了 PdfPages::delete_page_at_index()PdfPages::delete_page_range() 函数;根据 https://github.com/ajrcarey/pdfium-render/issues/67 添加了 PdfPage::delete() 函数。废弃的项目将在 0.9.0 版本中移除,尽管如果作为 https://github.com/ajrcarey/pdfium-render/issues/47 的一部分引入了更安全的 PdfDocumentPdfPages 引用处理,则可能恢复这些函数。
  • 0.7.29: 根据 https://github.com/ajrcarey/pdfium-render/issues/66 从默认的 crate 功能列表中移除了 sync crate 功能。
  • 0.7.28: 废弃了 PdfPageObjects::take_*() 函数;添加了 PdfPageObject::is_copyable()PdfPageObject::try_copy()PdfPageObjectGroup::retain()PdfPageObjectGroup::retain_if_copyable()PdfPageObjectGroup::is_copyable()PdfPageObjectGroup::try_copy_onto_existing_page()PdfPageObjectGroup::copy_onto_new_page_at_start()PdfPageObjectGroup::copy_onto_new_page_at_end()PdfPageObjectGroup::copy_onto_new_page_at_index() 函数;添加了 examples/copy_objects.rs 示例;修复了页面内容再生策略传播中的错误;移除所有对 lazy_static! 宏的使用,改用 once_cell::sync::Lazy
  • 0.7.27: 调整 examples/index.html 以考虑在 https://github.com/paulocoutinhox/pdfium-lib/releases 上发布的 Pdfium WASM 构建的上游包装更改;添加了 image crate 功能。
  • 0.7.26: 添加了 sync 默认crate功能,提供 SendSync 实现对 Pdfium 结构体的支持;向 PdfiumError 添加了 DisplayError 特性实现以实现与 anyhow 的兼容性;调整了WASM示例,以考虑Emscripten对Pdfium WASM构建的包装的上游更改;纠正了 Pdfium::load_pdf_from_bytes() 中的生命周期问题,并弃用 Pdfium::load_pdf_from_bytes() 以支持 Pdfium::load_pdf_from_byte_slice()Pdfium::load_pdf_from_byte_vec()。弃用的项目将在0.9.0版本中删除。
  • 0.7.25: 添加了 PdfPageAnnotationObjects 集合以及 PdfPageAnnotation::objects()PdfPageInkAnnotation::objects_mut()PdfPageStampAnnotation::objects_mut() 函数到高级接口。
  • 0.7.24: 为 FPDFClipPath_CountPathSegments()FPDFClipPath_GetPathSegment()FPDFPath_CountSegments()FPDFPath_GetPathSegment()FPDFPathSegment_*() 函数添加了绑定;将 PdfFontGlyphsPdfPagePathObjectSegments 集合添加到高级接口,以及 PdfFontPdfPagePathObject 中的访问器函数;添加了 PdfPathSegments 特性;引入了未来实现 PdfClipPath 对象所必需的一些基础设施;添加了 PdfPages::first()PdfPages::last()PdfPage::fonts() 便利函数。
  • 0.7.23: 从 PdfBitmap 中移除了一些不必要的可变绑定;使用 #[cfg(doc)] 声明以确保 cargo doc 为所有功能生成文档,无论平台如何。
  • 0.7.22: 尝试解决在获取页面图像对象的处理后的渲染时,Pdfium位图生成中存在的两个问题。更多信息请参阅 https://github.com/ajrcarey/pdfium-render/issues/52
  • 0.7.21: 添加了对 FPDF_GetPageAAction()FPDF_GetFileIdentifier() 以及所有剩余的 FPDFDest_*()FPDFLink_*() 函数的绑定;添加了方便函数 PdfAttachment::len()PdfAttachment::is_empty();添加了 libstdc++libc++ crate 特性;向 PdfiumLibraryBindings 添加了颜色转换函数;修复了在处理 PdfPageImageObject 时的颜色转换错误,具体请见 https://github.com/ajrcarey/pdfium-render/issues/50;修复了 FPDFAnnot_GetAttachmentPoints() WASM 实现中的错误;纠正了示例中的几个小错误。
  • 0.7.20: 添加了对 FPDFPage_*Thumbnail*()FPDFLink_*()FPDFText_Find*() 函数的绑定;添加了高级接口中的函数 PdfAttachments::create_attachment_from_bytes()PdfAttachments::create_attachment_from_file()PdfAttachments::create_attachment_from_reader()PdfAttachments::create_attachment_from_fetch()PdfAttachments::create_attachment_from_blob()PdfAttachments::delete_at_index()PdfAttachment::save_to_writer()PdfAttachment::save_to_file()PdfAttachment::save_to_blob()PdfPage::has_embedded_thumbnail()PdfPage::embedded_thumbnail()PdfPage::boundaries_mut()
    将 0.7.19 中引入的 PdfAttachment::bytes() 函数重命名为 PdfAttachment::save_to_bytes()
  • 0.7.19: 增加了 FPDFDoc_*Attachment*() 函数的绑定;向高级接口中添加了 PdfAttachmentsPdfSignatures 集合。
  • 0.7.18: 为 PdfDocumentPdfPagePdfBitmapPdfFont 以及其他各种接口添加了便捷的 bindings() 访问器函数,归功于来自 https://github.com/LU15W1R7H 的优秀贡献;为了保持一致性,废弃了 Pdfium::get_bindings(),改用 Pdfium::bindings()。废弃的项目将在 0.9.0 版本中删除。
  • 0.7.17: 放宽了 PdfPageObjectPath 中一些不必要的生命周期限制。
  • 0.7.16: 添加了便捷函数 PdfPageObjects::create_path_object_bezier()PdfPageObjectPath::new_bezier();纠正了文档中的某些错别字。
  • 0.7.15: 添加了用于处理注释的函数 PdfPageAnnotationCommon::name()PdfPageAnnotationCommon::contents()PdfPageAnnotationCommon::author()PdfPageAnnotationCommon::creation_date()PdfPageAnnotationCommon::modification_date();添加了 PdfPageText::for_annotation()PdfPageText::chars_for_annotation() 以更容易地提取与注释关联的文本和字符;添加了 examples/annotations.rsexamples/image_extract.rs;将 examples/text.rs 重命名为 examples/text_extract.rs
  • 0.7.14: 修复了 FPDF_StructElement_GetStringAttribute() 在 WASM 实现中的错误;将 image 包的所需版本锁定在至少 0.24.0 或更高版本,以避免 0.23.x 和 0.24.x 中 image::DynamicImage trait 定义的不兼容性;由于 https://github.com/NyxCode 的卓越贡献,WASM 实现增加了对 Web Workers 的兼容性。
  • 0.7.13: 为 PdfRenderConfig 添加了转换和裁剪函数;为 FPDF_RenderPageBitmapWithMatrix() 添加了绑定;为了保持一致性,废弃了 PdfRenderConfig::rotate_if_portait(),改用正确拼写的 PdfRenderConfig::rotate_if_portrait()。废弃的项目将在 0.9.0 版本中删除。
  • 0.7.12: 添加了 PdfPage::render_into_bitmap()PdfPage::render_into_bitmap_with_config() 函数以提升性能;废弃了 PdfPage::get_bitmap() 并推荐使用 PdfPage::render();废弃了 PdfPage::get_bitmap_with_config() 并推荐使用 PdfPage::render_with_config();废弃了 PdfBitmapConfig 并推荐使用 PdfRenderConfig;废弃了 PdfBitmap::render() 函数,因为该函数不再必要。已废弃的项目将在0.9.0版本中删除。
  • 0.7.11: 添加了新的WASM特定 PdfBitmap::as_array() 函数,作为跨平台 PdfBitmap::as_bytes() 函数的高性能替代方案,多亏了来自 https://github.com/NyxCode 的优秀贡献。
  • 0.7.10: 修复了文档中的某些错别字;为 PdfPageImageObject 添加了额外的构造函数,在对象创建时应用指定的宽度和/或高度。
  • 0.7.9: 添加了对应用于 PdfPageImageObject 的图像滤镜列表的检索;添加了 PdfColorSpace 枚举;添加了 FPDF_*Signature*()FPDFSignatureObj_*()FPDF_StructTree_*() 函数的绑定。
  • 0.7.8: 为 PdfPageImageObject 结构体添加了图像支持,以及 PdfPageObjects::add_image_object()PdfPageObjects::create_image_object() 函数,以及从文件加载字体到 PdfFont 的额外便捷函数和 FPDF_VIEWERREF_Get*() 函数的绑定。
  • 0.7.7: 添加了 thread_safe crate 功能,并在 examples/thread_safe.rs 中提供了相应的示例。
  • 0.7.6: 为 PdfPageTextPdfPageTextObject 对象添加了基于字符检索文本设置的功能;向高级接口添加了 PdfPageTextSegmentPdfPageTextChar 结构体;为所有页面对象添加了检索当前变换设置的选项;添加了 PdfPageTextObject::scaled_font_size() 函数,并将 PdfPageTextObject::font_size() 重命名为 PdfPageTextObject::unscaled_font_size(),因为这些名称使文本对象中缩放和不缩放字体大小之间的差异更清晰;为所有剩余的 FPDFText_*() 函数添加了绑定。
  • 0.7.5: 修复了 Windows 上错误处理中的一个错误。更多信息请参见 https://github.com/ajrcarey/pdfium-render/issues/24
  • 0.7.4: 添加了 PdfPageGroupObject::remove_objects_from_page() 函数;将 PdfPageObjects::delete_object()PdfPageObjects::delete_object_at_index() 函数重命名为 PdfPageObjects::remove_object()PdfPageObjects::remove_object_at_index(),因为这些名称更好地反映了底层操作。
  • 0.7.3: 修复了 0.7.2 中引入的 PdfPages::append() 实现中的错误。
  • 0.7.2: 添加了用于将页面对象组作为单个对象操作和变换的对象组,以及用于将个性化水印应用于文档中任意或所有页面的 PdfPages::watermark() 函数。修复了 PdfFont::drop() 中的潜在双重释放错误。
  • 0.7.1: 向 PdfPagePathObject 对象添加了路径段创建,添加了用于快速创建矩形、椭圆和圆的便利函数,以及 PdfPageObjects::add_path_object() 函数。
  • 0.7.0: 添加了 PdfPermissions 集合,添加了文档加载和保存支持,添加了文档、页面和文本对象的初始创建和编辑支持,并改进了 WASM 文档文件处理。
  • 0.6.0: 修复了文档中的某些错别字,更新了上游 Pdfium WASM 包源代码库名称。
  • 0.5.9: 修复了静态链接绑定实现中的一个错误。调整测试以涵盖动态和静态链接绑定实现。
  • 0.5.8: 修复了某些 FPDFAnnot_*() 函数的 WASM 实现中的错误。解决了影响各种 FPDF_*() 函数的潜在内存泄漏问题。
  • 0.5.7: 添加了对 Pdfium 静态链接构建的绑定支持,添加了 bindgenstatic crate 功能。
  • 0.5.6: 添加了 pdfium_render::prelude,添加了 FPDFAnnot_*()FPDFPage_*Annot*() 函数的绑定,添加了 PdfPageAnnotations 集合和 PdfPageAnnotation 结构体到高级接口。
  • 0.5.5: 修复了WASM实现中的两个错误,一个与颜色有关,一个与文本提取有关。有关更多信息,请参阅 https://github.com/ajrcarey/pdfium-render/issues/9https://github.com/ajrcarey/pdfium-render/issues/11
  • 0.5.4: 将 PdfBitmapConfig::set_reverse_byte_order() 的默认设置更改为 true 以从Pdfium的默认BGRA8像素格式切换到RGBA8。这是必要的,因为 image crate 在版本0.24中停止支持BGRA8。有关更多信息,请参阅 https://github.com/ajrcarey/pdfium-render/issues/9
  • 0.5.3: 添加了 FPDFBookmark_*()FPDFPageObj_*()FPDFText_*()FPDFFont_*() 函数的绑定,添加了 PdfPageObjectsPdfPageTextPdfBookmarks 集合到高级接口。
  • 0.5.2: 添加了 FPDF_GetPageBoundingBox()FPDFDoc_GetPageMode()FPDFPage_Get*Box()FPDFPage_Set*Box() 函数的绑定,添加了 PdfPageBoundaries 集合到高级接口。
  • 0.5.1: 添加了 FPDFPage_GetRotation()FPDFPage_SetRotation() 函数的绑定,添加了 PdfMetadata 集合到高级接口。
  • 0.5.0: 添加了注释和表单字段元素的渲染,感谢 https://github.com/inzanez 的出色贡献。
  • 0.4.2: 修复了 PdfBitmapConfig 实现中的错误。
  • 0.4.1: 改进了文档和README。
  • 0.4.0: 最小页面渲染功能的初始版本。

依赖项

~5–14MB
~181K SLoC