11 个版本
0.3.1 | 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日 |
#165 在 文本处理 中排名
每月下载量 457
用于 pdf-merger-rs
6.5MB
141K SLoC
qpdf-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 源树。
legacy
功能使绑定到 qpdf 10.x 中可用的 r2/3/4 加密选项,但 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"
- 安装了 clang/llvm(带有
许可证
根据 Apache 2.0 许可证授权。