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 在 图像
8,479 每月下载量
在 8 crate 中使用
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/DorianRudolph 和 https://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动态库可以从多个来源获得
- 适用于所有主要平台的Pdfium的原生(即非WASM)构建:https://github.com/bblanchon/pdfium-binaries/releases
- Android、iOS、macOS和WASM版本的Pdfium:https://github.com/paulocoutinhox/pdfium-lib/releases
如果您正在编译原生(即非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_PATH或PDFIUM_STATIC_LIB_PATH中设置的路径不应包含库本身的文件名;它应该是包含目录的路径。您必须确保您的库以适合您的目标平台的方式命名(例如,Linux和macOS上的libpdfium.so或libpdfium.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:控制imagecrate是否应由pdfium-render使用以提供页面和页面对象渲染功能。不需要页面或页面对象渲染的项目可以禁用此功能,以避免将imagecrate编译到它们的二进制文件中。libstdc++:在编译时链接GNU C++标准库。需要static功能。请参阅上面的“静态链接”部分。libc++:在编译时链接LLVM C++标准库。需要static功能。请参阅上面的“静态链接”部分。static:启用绑定到静态链接的Pdfium构建。请参阅上面的“静态链接”部分。sync:为Pdfium和PdfDocument结构体提供Send和Sync特质的实现。这对于创建可以使用lazy_static或once_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_6611、pdfium_6569、pdfium_6555、pdfium_6490、pdfium_6406、pdfium_6337、pdfium_6295、pdfium_6259、pdfium_6164、pdfium_6124、pdfium_6110、pdfium_6084、pdfium_6043、pdfium_6015、pdfium_5961:将PdfiumLibraryBindings绑定到指定的Pdfium API版本。
image、thread_safe和pdfium_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_Find、FPDFText_SetText、FPDFText_FindStart、FPDFDoc_AddAttachment、FPDFAnnot_SetStringValue和FPDFAttachment_SetStringValue。
提供了两个实用函数PdfiumLibraryBindings::get_pdfium_utf16le_bytes_from_str和PdfiumLibraryBindings::get_string_from_pdfium_utf16le_bytes,用于在您的代码中将数据转换为和从FPDF_WIDESTRING。
一些Pdfium函数返回经典的C风格整数布尔值,别名FPDF_BOOL。提供了实用函数TRUE、FALSE、is_true、to_result和bool_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的功能的所有示例和测试,使其兼容image0.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所述;添加了新的PdfPageTextSearch和PdfSearchOptions对象以及新的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,弃用拼写错误的变体;当使用synccrate 功能时,为PdfDocument结构添加了Send和Sync实现;添加了Debug特性实现到Pdfium中,以更好地与once_cell兼容;添加了新的常量PdfPoints::MAX、PdfPoints::MIN和PdfRect::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_前缀的已重命名常量;将PdfPoints和PdfRect结构体移动到新文件中;添加了PdfQuadPoints结构体;向PdfPoints、PdfRect和PdfQuadPoints添加了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的问题,使其不再依赖于imagecrate 功能被启用;纠正了渲染位图像素尺寸计算中的bug,归功于来自 https://github.com/slawekkolodziej 的出色贡献。 - 0.8.3: 添加了
PdfFonts集合,PdfDocument::fonts()和PdfDocument::fonts_mut()访问器函数,以及PdfFontToken结构体;将字体构造函数从PdfFont移入PdfFonts,弃用PdfFont中的构造函数;添加了ToPdfFontToken特性,包括为PdfFont、&PdfFont和PdfFontToken实现该特性的方法;调整了之前接收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以消除与PdfForm和PdfFormField的歧义;添加访问器函数PdfPageAnnotationCommon::as_form_field();添加表单字段结构PdfFormPushButtonField、PdfFormCheckboxField、PdfFormComboBoxField、PdfFormListBoxField、PdfFormRadioButtonField、PdfFormSignatureField、PdfFormTextField和PdfFormUnknownField;添加PdfFormFieldOption结构和PdfFormFieldOptions集合,用于检索列表框或组合框字段中显示的选项;添加PdfFormFieldCommon和PdfFormFieldPrivate特性和所有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 的出色贡献,并修复使用不带默认imagecrate 特性的pdfium-render时的缺失依赖问题。 - 0.7.31: 添加
PdfPageLinks集合,PdfPage::links()和PdfPage::links_mut()函数,PdfLink和PdfDestination结构体,PdfActionCommon和PdfActionPrivate特性,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 的一部分引入了更安全的PdfDocument和PdfPages引用处理,则可能恢复这些函数。 - 0.7.29: 根据 https://github.com/ajrcarey/pdfium-render/issues/66 从默认的 crate 功能列表中移除了
synccrate 功能。 - 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 构建的上游包装更改;添加了imagecrate 功能。 - 0.7.26: 添加了
sync默认crate功能,提供Send和Sync实现对Pdfium结构体的支持;向PdfiumError添加了Display和Error特性实现以实现与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_*()函数添加了绑定;将PdfFontGlyphs和PdfPagePathObjectSegments集合添加到高级接口,以及PdfFont和PdfPagePathObject中的访问器函数;添加了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*()函数的绑定;向高级接口中添加了PdfAttachments和PdfSignatures集合。 - 0.7.18: 为
PdfDocument、PdfPage、PdfBitmap、PdfFont以及其他各种接口添加了便捷的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.rs和examples/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::DynamicImagetrait 定义的不兼容性;由于 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_safecrate 功能,并在examples/thread_safe.rs中提供了相应的示例。 - 0.7.6: 为
PdfPageText和PdfPageTextObject对象添加了基于字符检索文本设置的功能;向高级接口添加了PdfPageTextSegment和PdfPageTextChar结构体;为所有页面对象添加了检索当前变换设置的选项;添加了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 静态链接构建的绑定支持,添加了
bindgen和staticcrate 功能。 - 0.5.6: 添加了
pdfium_render::prelude,添加了FPDFAnnot_*()和FPDFPage_*Annot*()函数的绑定,添加了PdfPageAnnotations集合和PdfPageAnnotation结构体到高级接口。 - 0.5.5: 修复了WASM实现中的两个错误,一个与颜色有关,一个与文本提取有关。有关更多信息,请参阅 https://github.com/ajrcarey/pdfium-render/issues/9 和 https://github.com/ajrcarey/pdfium-render/issues/11。
- 0.5.4: 将
PdfBitmapConfig::set_reverse_byte_order()的默认设置更改为true以从Pdfium的默认BGRA8像素格式切换到RGBA8。这是必要的,因为imagecrate 在版本0.24中停止支持BGRA8。有关更多信息,请参阅 https://github.com/ajrcarey/pdfium-render/issues/9。 - 0.5.3: 添加了
FPDFBookmark_*()、FPDFPageObj_*()、FPDFText_*()和FPDFFont_*()函数的绑定,添加了PdfPageObjects、PdfPageText和PdfBookmarks集合到高级接口。 - 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