#pdf #bindings #safe-bindings #popular #header #encryption #qpdf

sys qpdf-sys

Rust 通过 FFI 和 bindgen 绑定到 QPDF C++ 库

10 个版本

0.3.0 2024 年 4 月 26 日
0.2.1 2024 年 3 月 20 日
0.1.7 2023 年 11 月 23 日
0.1.6 2023 年 7 月 24 日
0.1.1 2022 年 7 月 26 日

文本处理 分类中排名第 1538

Download history 153/week @ 2024-04-28 98/week @ 2024-05-05 56/week @ 2024-05-12 97/week @ 2024-05-19 107/week @ 2024-05-26 83/week @ 2024-06-02 96/week @ 2024-06-09 127/week @ 2024-06-16 213/week @ 2024-06-23 292/week @ 2024-06-30 214/week @ 2024-07-07 141/week @ 2024-07-14 74/week @ 2024-07-21 177/week @ 2024-07-28 123/week @ 2024-08-04 68/week @ 2024-08-11

每月下载量 462
2 个 crate 中使用(通过 qpdf

MIT/Apache 协议

6.5MB
139K SLoC

C 48K SLoC // 0.2% comments C++ 36K SLoC // 0.1% comments Visual Studio Project 15K SLoC Rust 15K SLoC // 0.0% comments Shell 8K SLoC // 0.2% comments M4 7.5K SLoC // 0.2% comments Assembly 2K SLoC // 0.2% comments Ada 1.5K SLoC // 0.2% comments GNU Style Assembly 1.5K SLoC // 0.3% comments Perl 1.5K SLoC // 0.1% comments Pascal 1K SLoC // 0.2% comments C# 879 SLoC // 0.4% comments Visual Studio Solution 655 SLoC Bitbake 527 SLoC WebAssembly 273 SLoC HICAD 208 SLoC Python 124 SLoC // 0.2% comments Automake 117 SLoC // 0.2% comments Batch 19 SLoC Forge Config 7 SLoC // 0.9% comments Poke 1 SLoC

包含 (混淆的 autotools 代码,475KB) jpeg-9d/configure,(模糊的 autoconf 代码,12KB) jpeg-9d/configure.ac,(模糊的 autoconf 代码,1KB) zlib-1.2.11/contrib/minizip/configure.ac

qpdf-rs

github actions crates license license docs.rs

概述

本项目包含 Rust 安全绑定到一个流行的 QPDF C++ 库。它使用通过 qpdf-c.h 头文件暴露的 QPDF C API。

测试目标

  • x86_64-unknown-linux-gnu
  • aarch64-unknown-linux-gnu
  • x86_64-pc-windows-gnu
  • x86_64-pc-windows-msvc
  • x86_64-apple-darwin
  • aarch64-apple-darwin

这些目标的预构建绑定包含在源代码树中。

默认情况下,将使用 pkg-config 来链接到系统库 libqpdf

如果启用了 vendored 功能,将构建并静态链接 qpdf 的 vendored 源代码树。

启用 legacy 功能将启用对 r2/3/4 加密选项的绑定,这些选项在 qpdf 10.x 中可用,但在 11.x 中不可用。

使用示例

use qpdf::*;

fn make_pdf_from_scratch() -> qpdf::Result<Vec<u8>> {
    let qpdf = QPdf::empty();

    let font = qpdf
        .parse_object(
            r#"<<
                        /Type /Font
                        /Subtype /Type1
                        /Name /F1
                        /BaseFont /Helvetica
                        /Encoding /WinAnsiEncoding
                      >>"#,
        )?;

    let procset = qpdf.parse_object("[/PDF /Text]")?;
    let contents = qpdf.new_stream(b"BT /F1 15 Tf 72 720 Td (First Page) Tj ET\n");
    let mediabox = qpdf.parse_object("[0 0 612 792]")?;
    let rfont = qpdf.new_dictionary_from([("/F1", font.into_indirect())]);
    let resources = qpdf.new_dictionary_from([
        ("/ProcSet", procset.into_indirect()),
        ("/Font", rfont.into())
    ]);
    let page = qpdf.new_dictionary_from([
        ("/Type", qpdf.new_name("/Page")),
        ("/MediaBox", mediabox),
        ("/Contents", contents.into()),
        ("/Resources", resources.into()),
    ]);

    qpdf.add_page(&page.into_indirect(), true)?;

    let mem = qpdf
        .writer()
        .static_id(true)
        .force_pdf_version("1.7")
        .normalize_content(true)
        .preserve_unreferenced_objects(false)
        .object_stream_mode(ObjectStreamMode::Preserve)
        .compress_streams(false)
        .stream_data_mode(StreamDataMode::Preserve)
        .write_to_memory()?;

    Ok(mem)
}

额外的构建要求

  • C/C++ 编译器
  • 对于没有预构建 bindgen 绑定的目标
    • 安装了 clang/llvm(带有 libclang 共享库)以在 bindgen 构建时调用
    • 对于交叉编译,必须通过 BINDGEN_EXTRA_CLANG_ARGS 环境变量将自定义 sysroot 传递给 clang,例如:BINDGEN_EXTRA_CLANG_ARGS="--sysroot=/usr/x86_64-w64-mingw32/sys-root"

许可

根据 Apache 2.0 许可证授权。

无运行时依赖