Skip to content

Julia API 参考

PDF Oxide 提供地道的 Julia 绑定(PdfOxide.jl),通过 ccall 直接封装在 pdf_oxide 的 C ABI 之上 — 没有中间垫片 crate。原生句柄被包装在带有终结器(finalizer)的可变结构体中,C 字符串与缓冲区会被复制到 Julia 侧并自动释放,任何非成功的 C-ABI 状态都会抛出 PdfOxideError页码索引从 0 开始。

using Pkg
Pkg.add("PdfOxide")

原生 libpdf_oxide cdylib 会在运行时加载,按 PDF_OXIDE_LIB_PATHPDF_OXIDE_LIB_DIR../target/releasetarget/release → 系统加载器的顺序解析。使用以下绑定特性集进行构建:

cargo build --release --lib --features ocr,rendering,signatures,barcodes,tsa-client,system-fonts
using PdfOxide

pdf = from_markdown("# Hello\n\nbody\n")
doc = open_from_bytes(to_bytes(pdf))
page_count(doc)
extract_text(doc, 0)        # 0-based page index
to_markdown_all(doc)
close!(doc)

Rust API 请参阅 Rust API 参考;Python API 请参阅 Python API 参考;类型细节请参阅 类型与枚举

大多数句柄类型(PdfDocumentPdfDocumentEditorDocumentBuilderRenderedImageCertificateSignatureInfoTimestampTsaClientDss、校验结果、BarcodeOcrEngineRendererElementListEmbeddedFontPageBuilder)持有原生内存。请用 close!(x) 尽早释放它们 — 该调用是幂等的,并且也会在终结阶段自动运行。


PdfDocument

用于打开、提取、搜索、渲染、校验和检查已有 PDF 的只读句柄。

打开

open_document(path::AbstractString; password::Union{Nothing,AbstractString} = nothing) -> PdfDocument
open_from_bytes(data::AbstractVector{UInt8}) -> PdfDocument
open_with_password(path::AbstractString, password::AbstractString) -> PdfDocument
函数 说明
open_document(path; password=nothing) 从文件系统路径打开一个 PDF(可选带密码保护)。
open_from_bytes(data) 从内存中的字节向量打开一个 PDF。
open_with_password(path, password) 用密码打开磁盘上的加密 PDF。

文档信息

函数 返回值 说明
page_count(d) Int 页数。
version(d) PdfVersion PDF 版本(major/minor)。
is_encrypted(d) Bool 文档是否已加密。
has_structure_tree(d) Bool 文档是否为带结构树的标记 PDF(Tagged PDF)。
has_xfa(d) Bool 文档是否携带 XFA 表单。
authenticate(d, password) Bool 对加密文档进行密码验证(密码错误时返回 false,而非抛出错误)。

整文档转换

函数 返回值 说明
to_markdown_all(d) String 整个文档的 Markdown。
to_html_all(d) String 整个文档的 HTML。
to_plain_text_all(d) String 整个文档的纯文本。
extract_all_text(d) String 整文档自动文本提取。
classify_document(d) String 对整个文档进行分类;返回分类器的 JSON 字符串。

按页文本提取

extract_text(d::PdfDocument, page::Integer) -> String
to_plain_text(d::PdfDocument, page::Integer) -> String
to_markdown(d::PdfDocument, page::Integer) -> String
to_html(d::PdfDocument, page::Integer) -> String
extract_structured_json(d::PdfDocument, page::Integer) -> String
函数 说明
extract_text(d, page) 从 0 基页码提取纯文本。
to_plain_text(d, page) 将页面渲染为保留布局信息的纯文本。
to_markdown(d, page) 将页面渲染为 Markdown。
to_html(d, page) 将页面渲染为 HTML。
extract_structured_json(d, page) 为某一页提取结构化文档 JSON 模型。
extract_text_auto(d, page) 为页面自动选择最佳文本提取方式。
extract_page_auto(d, page, options="{}") 带 JSON 选项字符串的自动按页提取。
classify_page(d, page) 对某一页分类;返回分类器的 JSON 字符串。

结构化元素提取

extract_chars(d::PdfDocument, page::Integer)      -> Vector{Char}
extract_words(d::PdfDocument, page::Integer)      -> Vector{Word}
extract_text_lines(d::PdfDocument, page::Integer) -> Vector{TextLine}
extract_tables(d::PdfDocument, page::Integer)     -> Vector{Table}
embedded_fonts(d::PdfDocument, page::Integer)     -> Vector{Font}
embedded_images(d::PdfDocument, page::Integer)    -> Vector{Image}
page_annotations(d::PdfDocument, page::Integer)   -> Vector{Annotation}
extract_paths(d::PdfDocument, page::Integer)      -> Vector{Path}
函数 说明
extract_chars(d, page) Vector{Char} 提取一页中的字形。
extract_words(d, page) Vector{Word} 提取一页中的单词。
extract_text_lines(d, page) Vector{TextLine} 提取文本行。
extract_tables(d, page) Vector{Table} 提取表格。
embedded_fonts(d, page) Vector{Font} 提取内嵌字体。
embedded_images(d, page) Vector{Image} 提取内嵌图像。
page_annotations(d, page) Vector{Annotation} 提取批注。
extract_paths(d, page) Vector{Path} 提取矢量路径。

区域限定提取

extract_text_in_rect(d::PdfDocument, page::Integer, x, y, w, h)   -> String
extract_words_in_rect(d::PdfDocument, page::Integer, x, y, w, h)  -> Vector{Word}
extract_lines_in_rect(d::PdfDocument, page::Integer, x, y, w, h)  -> Vector{TextLine}
extract_tables_in_rect(d::PdfDocument, page::Integer, x, y, w, h) -> Vector{Table}
extract_images_in_rect(d::PdfDocument, page::Integer, x, y, w, h) -> Vector{Image}

每个函数都将提取范围限定在 0 基页码上、以 PDF 用户空间点表示的矩形 (x, y, w, h) 内。

搜索

search(d::PdfDocument, page::Integer, term::AbstractString, caseSensitive::Bool) -> Vector{SearchResult}
search_all(d::PdfDocument, term::AbstractString, caseSensitive::Bool)             -> Vector{SearchResult}
search_results_to_json(d::PdfDocument, term::AbstractString, caseSensitive::Bool) -> String
函数 说明
search(d, page, term, caseSensitive) 在单页中搜索 term
search_all(d, term, caseSensitive) 在整个文档中搜索 term
search_results_to_json(d, term, caseSensitive) 将整文档搜索结果序列化为 JSON。

页面几何信息

函数 返回值 说明
page_get_width(d, page) Float64 页面宽度(PDF 点)。
page_get_height(d, page) Float64 页面高度(PDF 点)。
page_get_rotation(d, page) Int 页面的绝对旋转角度(度)。
page(d, index) PdfPage 对文档某一 0 基页码的视图(参见 PdfPage)。

文档结构与元数据

函数 返回值 说明
get_outline(d) String 书签 / 目录(JSON)。
get_page_labels(d) String 页码标签范围(JSON)。
get_xmp_metadata(d) String XMP 元数据(JSON)。
get_source_bytes(d) Vector{UInt8} 文档的原始源字节。
plan_split_by_bookmarks(d, options="{}") String 规划一次按书签拆分操作(JSON)。

批注检查

annotations_to_json(d::PdfDocument, page::Integer) -> String
annotation_get_color(d::PdfDocument, page::Integer, index::Integer) -> UInt32
annotation_creation_date(d::PdfDocument, page::Integer, index::Integer) -> String
annotation_modification_date(d::PdfDocument, page::Integer, index::Integer) -> String
函数 返回值 说明
annotations_to_json(d, page) String 一页上所有批注的 JSON 表示。
annotation_get_color(d, page, index) UInt32 批注的 32 位 RGBA 打包颜色。
annotation_creation_date(d, page, index) String 批注创建日期。
annotation_modification_date(d, page, index) String 批注修改日期。
annotation_is_hidden(d, page, index) Bool 批注是否隐藏。
annotation_is_marked_deleted(d, page, index) Bool 批注是否被标记为已删除。
annotation_is_printable(d, page, index) Bool 批注是否可打印。
annotation_is_read_only(d, page, index) Bool 批注是否只读。
link_annotation_uri(d, page, index) String 链接批注(Link annotation)的 URI。
text_annotation_icon_name(d, page, index) String 文本(便笺)批注的图标名称。
highlight_quad_points_count(d, page, index) Int 高亮批注(Highlight annotation)的四边形点数量。
highlight_quad_point(d, page, index, quad_index) NTuple{8,Float64} quad_index 个四边形(8 个浮点数)。

字体与元素 JSON 辅助函数

函数 返回值 说明
fonts_to_json(d, page) String 一页上内嵌字体的 JSON 表示。
font_size(d, page, index) Float64 index 个内嵌字体的字号。
page_get_elements(d, page) ElementList ElementList 表示的页面布局区域元素。

表单字段

get_form_fields(d::PdfDocument) -> Vector{FormField}
form_field_count(d::PdfDocument) -> Int
export_form_data_to_bytes(d::PdfDocument, format_type::Integer) -> Vector{UInt8}
import_form_data(d::PdfDocument, path::AbstractString) -> Int
form_import_from_file(d::PdfDocument, filename::AbstractString) -> Bool
函数 说明
get_form_fields(d) Vector{FormField} 返回所有 AcroForm 字段。
form_field_count(d) 便捷的字段计数。
export_form_data_to_bytes(d, format_type) 导出表单数据(format_type 选择 FDF/XFDF)。
import_form_data(d, path) 从文件导入表单数据;返回 C 状态码。
form_import_from_file(d, filename) 导入表单数据;成功时返回 true

OCR

page_needs_ocr(d::PdfDocument, page::Integer) -> Bool
ocr_extract_text(d::PdfDocument, page::Integer, engine::Union{Nothing,OcrEngine} = nothing) -> String
函数 说明
page_needs_ocr(d, page) 判断某页是否为扫描页/混合页,需要 OCR。
ocr_extract_text(d, page, engine=nothing) 通过 OCR 提取文本(nothing 时回退到仅原生提取)。参见 OcrEngine

签名(文档级)

sign(d::PdfDocument, cert::Certificate; reason::AbstractString = "", location::AbstractString = "") -> Int
get_signature_count(d::PdfDocument) -> Int
get_signature(d::PdfDocument, index::Integer) -> SignatureInfo
verify_all_signatures(d::PdfDocument) -> Int
has_timestamp(d::PdfDocument) -> Int
document_get_dss(d::PdfDocument) -> Union{Dss,Nothing}
函数 说明
sign(d, cert; reason, location) cert 对文档签名;返回状态码。
get_signature_count(d) 文档中签名的数量。
get_signature(d, index) SignatureInfo 形式返回第 index 个签名。
verify_all_signatures(d) 验证所有签名;返回状态码。
has_timestamp(d) 文档是否携带文档级时间戳。
document_get_dss(d) 将文档的 /DSS 读取为 Dss,若不存在则返回 nothing

校验与转换

validate_pdf_a(d::PdfDocument, level::Integer) -> PdfAResults
validate_pdf_ua(d::PdfDocument, level::Integer) -> UaResults
validate_pdf_x(d::PdfDocument, level::Integer) -> PdfXResults
document_convert_to_pdf_a(d::PdfDocument, level::Integer) -> Bool

validatePdfA / validatePdfUa / validatePdfX 是这三个校验函数的驼峰式别名。参见 校验结果

Office 转换

to_docx(d::PdfDocument) -> Vector{UInt8}
to_pptx(d::PdfDocument) -> Vector{UInt8}
to_xlsx(d::PdfDocument) -> Vector{UInt8}

将 PDF 转换回 DOCX / PPTX / XLSX 字节缓冲区。将 Office 文件作为 PDF 打开则使用 open_from_docx_bytes / open_from_pptx_bytes / open_from_xlsx_bytes(参见 Office 输入)。

生命周期

函数 说明
close!(d) 立即释放原生句柄(幂等;也会在终结阶段自动运行)。

PdfPage

page(doc, index) 返回的轻量级 0 基页面视图。其方法都委托给父文档处理。

p = page(doc, 0)
text(p)                       # -> String
markdown(p)                   # -> String
extract_words(p)              # -> Vector{Word}
search(p, "term", false)      # -> Vector{SearchResult}
render_page(p)                # -> RenderedImage
方法 返回值 说明
text(p) String 该页的纯文本。
markdown(p) String 该页的 Markdown。
html(p) String 该页的 HTML。
plain_text(p) String 保留布局信息的纯文本。
extract_chars(p) Vector{Char} 字形。
extract_words(p) Vector{Word} 单词。
extract_text_lines(p) Vector{TextLine} 文本行。
extract_tables(p) Vector{Table} 表格。
embedded_fonts(p) Vector{Font} 内嵌字体。
embedded_images(p) Vector{Image} 内嵌图像。
page_annotations(p) Vector{Annotation} 批注。
extract_paths(p) Vector{Path} 矢量路径。
search(p, term, caseSensitive) Vector{SearchResult} 在该页中搜索。
render_page(p, format=0) RenderedImage 渲染该页(0=PNG)。
render_page_zoom(p, zoom, format=0) RenderedImage 按缩放系数渲染。
render_page_thumbnail(p, size, format=0) RenderedImage 渲染一个适配 size 像素的缩略图。

渲染

PdfDocument 的页面渲染为图像。format0=PNG(默认),1=JPEG。坐标以 PDF 用户空间点为单位。

render_page(d::PdfDocument, pageIndex::Integer, format::Integer = 0) -> RenderedImage
render_page_zoom(d::PdfDocument, pageIndex::Integer, zoom::Real, format::Integer = 0) -> RenderedImage
render_page_thumbnail(d::PdfDocument, pageIndex::Integer, size::Integer, format::Integer = 0) -> RenderedImage
render_page_region(d::PdfDocument, page::Integer, crop_x, crop_y, crop_width, crop_height, format::Integer = 0) -> RenderedImage
render_page_fit(d::PdfDocument, page::Integer, w::Integer, h::Integer, format::Integer = 0) -> RenderedImage
render_page_raw(d::PdfDocument, page::Integer, dpi::Integer) -> Tuple{RenderedImage,Int,Int}
render_page_with_options(d::PdfDocument, page::Integer, dpi, format, bg_r, bg_g, bg_b, bg_a, transparent_background, render_annotations, jpeg_quality) -> RenderedImage
render_page_with_options_ex(d::PdfDocument, page::Integer, dpi, format, bg_r, bg_g, bg_b, bg_a, transparent_background, render_annotations, jpeg_quality, excluded_layers::AbstractVector{<:AbstractString} = String[]) -> RenderedImage
函数 说明
render_page(d, page, format=0) 渲染一页(0=PNG)。
render_page_zoom(d, page, zoom, format=0) 按缩放系数渲染。
render_page_thumbnail(d, page, size, format=0) 渲染一个适配 size 像素的缩略图。
render_page_region(d, page, x, y, w, h, format=0) 渲染一个矩形裁剪区域(用户空间点)。
render_page_fit(d, page, w, h, format=0) 渲染并适配到 w×h 像素内,保持宽高比。
render_page_raw(d, page, dpi) 渲染为原始预乘 RGBA8888 缓冲区;返回 (image, width, height)
render_page_with_options(d, page, dpi, format, bg_r, bg_g, bg_b, bg_a, transparent_background, render_annotations, jpeg_quality) 使用完整的 RenderOptions 渲染(背景通道范围 0–1;标志位为 0/1)。
render_page_with_options_ex(...; excluded_layers) 在上面的基础上加入 OCG 图层过滤 — 屏蔽指定 /Name 的图层。
estimate_render_time(d, page) 估算某页的渲染耗时(毫秒)。

renderPage / renderPageZoom / renderPageThumbnailrender_page / render_page_zoom / render_page_thumbnail 的驼峰式别名。

Renderer

可复用的渲染器句柄。

create_renderer(dpi::Integer = 150, format::Integer = 0, quality::Integer = 90, anti_alias::Bool = true) -> Renderer
close!(r::Renderer)

RenderedImage

渲染调用的结果。字段:width::Intheight::Intdata::Vector{UInt8}(编码字节,对 render_page_raw 而言为原始 RGBA 数据)。

save(img::RenderedImage, path::AbstractString)   # write to disk (format inferred)
close!(img::RenderedImage)

DocumentEditor

用于修改并重新保存已有 PDF 的编辑端句柄。

打开与来源

open_editor(path::AbstractString) -> DocumentEditor
open_editor_from_bytes(data::AbstractVector{UInt8}) -> DocumentEditor
函数 返回值 说明
is_modified(e) Bool 编辑器是否存在未保存的修改。
get_source_path(e) String 编辑器打开时使用的源路径。
page_count(e) Int 页数。
version(e) PdfVersion PDF 版本。

信息 / 元数据

函数 说明
get_producer(e) 来自 /Info.Producer 的生产者信息。
set_producer(e, value) 设置 /Info.Producer
get_creation_date(e) 来自 /Info.CreationDate 的创建日期(原始 PDF 日期字符串)。
set_creation_date(e, date_str) 设置 /Info.CreationDate(原始 PDF 日期字符串)。

保存

save(e::DocumentEditor, path::AbstractString)
save_to_bytes(e::DocumentEditor) -> Vector{UInt8}
save_to_bytes_with_options(e::DocumentEditor, compress::Bool, garbage_collect::Bool, linearize::Bool) -> Vector{UInt8}
extract_pages_to_bytes(e::DocumentEditor, pages::AbstractVector{<:Integer}) -> Vector{UInt8}
save_encrypted(e::DocumentEditor, path::AbstractString, user_password::AbstractString, owner_password::AbstractString)
save_encrypted_to_bytes(e::DocumentEditor, user_password::AbstractString, owner_password::AbstractString) -> Vector{UInt8}
convert_to_pdf_a(e::DocumentEditor, level::Integer)
函数 说明
save(e, path) 将编辑后的文档保存到路径。
save_to_bytes(e) 将编辑后的文档序列化为字节。
save_to_bytes_with_options(e, compress, garbage_collect, linearize) 按压缩 / 垃圾回收 / 线性化选项序列化。
extract_pages_to_bytes(e, pages) 将一部分页面提取为新的内存 PDF。
save_encrypted(e, path, user_pw, owner_pw) 以 AES-256 加密保存到路径。
save_encrypted_to_bytes(e, user_pw, owner_pw) 以 AES-256 加密保存为字节。
convert_to_pdf_a(e, level) 原地转换为 PDF/A(level:0=A1b…7=A3u)。

合并与附件

函数 说明
merge_from(e, source_path) 从磁盘上的 PDF 合并页面。
merge_from_bytes(e, data) 从内存中的 PDF 缓冲区合并页面。
embed_file(e, name, data) 嵌入一个文件附件(namedata 字节)。

页面操作

rotate_all_pages(e::DocumentEditor, degrees::Integer)
rotate_page_by(e::DocumentEditor, page::Integer, degrees::Integer)
get_page_rotation(e::DocumentEditor, page::Integer) -> Int
set_page_rotation(e::DocumentEditor, page::Integer, degrees::Integer)
delete_page(e::DocumentEditor, page::Integer)
move_page(e::DocumentEditor, from::Integer, to::Integer)
函数 说明
rotate_all_pages(e, degrees) 旋转所有页面(相对角度)。
rotate_page_by(e, page, degrees) 以叠加方式旋转某一页。
get_page_rotation(e, page) 某一页的绝对旋转角度。
set_page_rotation(e, page, degrees) 设置某一页的绝对旋转角度。
delete_page(e, page) 删除一页。
move_page(e, from, to) 将某一页从一个索引移动到另一个索引。

页面边界框与裁剪

get_page_media_box(e::DocumentEditor, page::Integer) -> NTuple{4,Float64}
get_page_crop_box(e::DocumentEditor, page::Integer) -> NTuple{4,Float64}
set_page_media_box(e::DocumentEditor, page::Integer, x, y, w, h)
set_page_crop_box(e::DocumentEditor, page::Integer, x, y, w, h)
crop_margins(e::DocumentEditor, left::Real, right::Real, top::Real, bottom::Real)
函数 说明
get_page_media_box(e, page) 获取某一页的 MediaBox。
get_page_crop_box(e, page) 获取某一页的 CropBox。
set_page_media_box(e, page, x, y, w, h) 设置某一页的 MediaBox。
set_page_crop_box(e, page, x, y, w, h) 设置某一页的 CropBox。
crop_margins(e, left, right, top, bottom) 按边距裁剪所有页面(用户空间)。

擦除 / 涂白

erase_region(e::DocumentEditor, page::Integer, x, y, w, h)
erase_regions(e::DocumentEditor, page::Integer, rects::AbstractVector{<:NTuple{4,<:Real}})
clear_erase_regions(e::DocumentEditor, page::Integer)
函数 说明
erase_region(e, page, x, y, w, h) 擦除一个矩形区域。
erase_regions(e, page, rects) 擦除多个区域(rects(x, y, w, h) 元组的向量)。
clear_erase_regions(e, page) 清除某一页所有待处理的擦除区域条目。

页眉 / 页脚 / 痕迹移除

erase_header(d::PdfDocument, page::Integer)
erase_footer(d::PdfDocument, page::Integer)
erase_artifacts(d::PdfDocument, page::Integer)
remove_headers(d::PdfDocument, threshold::Real = 0.5)
remove_footers(d::PdfDocument, threshold::Real = 0.5)
remove_artifacts(d::PdfDocument, threshold::Real = 0.5)
函数 说明
erase_header(d, page) / erase_footer(d, page) / erase_artifacts(d, page) 擦除某一页上检测到的页眉 / 页脚 / 痕迹。
remove_headers(d, threshold=0.5) / remove_footers(...) / remove_artifacts(...) 移除全文档中频率高于阈值的重复页眉 / 页脚 / 痕迹。

批注扁平化

flatten_annotations(e::DocumentEditor, page::Integer)
flatten_all_annotations(e::DocumentEditor)
is_page_marked_for_flatten(e::DocumentEditor, page::Integer) -> Bool
unmark_page_for_flatten(e::DocumentEditor, page::Integer)

编校(涂黑)

apply_page_redactions(e::DocumentEditor, page::Integer)
apply_all_redactions(e::DocumentEditor)
is_page_marked_for_redaction(e::DocumentEditor, page::Integer) -> Bool
unmark_page_for_redaction(e::DocumentEditor, page::Integer)
redaction_add(e::DocumentEditor, page::Integer, x1, y1, x2, y2, r, g, b)
redaction_count(e::DocumentEditor, page::Integer) -> Int
redaction_apply(e::DocumentEditor, scrub_metadata::Bool, r::Real, g::Real, b::Real) -> Int
redaction_scrub_metadata(e::DocumentEditor) -> Int
函数 说明
apply_page_redactions(e, page) 在某一页上应用(烧录)编校。
apply_all_redactions(e) 应用所有待处理的编校。
is_page_marked_for_redaction(e, page) 某一页是否被标记为待编校。
unmark_page_for_redaction(e, page) 移除某一页的编校标记。
redaction_add(e, page, x1, y1, x2, y2, r, g, b) 排队添加一个带覆盖颜色(DeviceRGB,0–1)的编校框。
redaction_count(e, page) 某一页中已排队的编校区域数量。
redaction_apply(e, scrub_metadata, r, g, b) 破坏性地应用所有已排队的编校;返回被清除的字形数。
redaction_scrub_metadata(e) 清除 Info/XMP/JavaScript/EmbeddedFiles;返回移除的数量。

表单填写与扁平化

set_form_field_value(e::DocumentEditor, name::AbstractString, value::AbstractString)
flatten_forms(e::DocumentEditor)
flatten_forms_on_page(e::DocumentEditor, page::Integer)
flatten_warnings_count(e::DocumentEditor) -> Int
flatten_warning(e::DocumentEditor, index::Integer) -> String
import_fdf_bytes(e::DocumentEditor, data::AbstractVector{UInt8})
import_xfdf_bytes(e::DocumentEditor, data::AbstractVector{UInt8})
函数 说明
set_form_field_value(e, name, value) 设置一个表单字段值(UTF-8)。
flatten_forms(e) 扁平化所有表单(将值固化进页面内容)。
flatten_forms_on_page(e, page) 在单页上扁平化表单。
flatten_warnings_count(e) 上一次表单扁平化保存产生的警告数量。
flatten_warning(e, index) index 条扁平化警告字符串。
import_fdf_bytes(e, data) 从字节导入 FDF 表单数据。
import_xfdf_bytes(e, data) 从字节导入 XFDF 表单数据。

条码盖印

add_barcode_to_page(e::DocumentEditor, page::Integer, b::Barcode, x, y, width, height)

将一个 Barcode 盖印到某一页矩形 (x, y, width, height) 上。参见 条码

生命周期

close!(e::DocumentEditor) 释放该句柄。


Pdf

from_* 工厂函数返回的轻量级创建端句柄。

工厂函数

from_markdown(input::AbstractString) -> Pdf
from_html(input::AbstractString) -> Pdf
from_text(input::AbstractString) -> Pdf
from_image(path::AbstractString) -> Pdf
from_image_bytes(data::AbstractVector{UInt8}) -> Pdf
from_html_css(html::AbstractString, css::AbstractString, font_bytes::Union{Nothing,AbstractVector{UInt8}} = nothing) -> Pdf
from_html_css_with_fonts(html::AbstractString, css::AbstractString, families::AbstractVector{<:AbstractString}, fonts::AbstractVector{<:AbstractVector{UInt8}}) -> Pdf
函数 说明
from_markdown(input) 从 Markdown 构建一个 Pdf
from_html(input) 从 HTML 构建一个 Pdf
from_text(input) 从纯文本构建一个 Pdf
from_image(path) 从图像文件构建一个 Pdf
from_image_bytes(data) 从内存中的图像字节构建一个 Pdf
from_html_css(html, css, font_bytes=nothing) 从 HTML + CSS 构建,可选内嵌一种字体。
from_html_css_with_fonts(html, css, families, fonts) 从 HTML + CSS 构建,支持多字体级联(families[i] 对应命名 fonts[i])。

方法

函数 返回值 说明
save(p, path) 将构建好的 PDF 写入路径。
to_bytes(p) Vector{UInt8} 将构建好的 PDF 序列化为字节。
get_page_count(p) Int 构建器 Pdf 的页数。
close!(p) 释放该句柄。

merge_pdfs

merge_pdfs(paths::AbstractVector{<:AbstractString}) -> Vector{UInt8}

paths 处的多个 PDF(按顺序)合并为单一 PDF 字节缓冲区。

Office 输入

open_from_docx_bytes(data::AbstractVector{UInt8}) -> Pdf
open_from_pptx_bytes(data::AbstractVector{UInt8}) -> Pdf
open_from_xlsx_bytes(data::AbstractVector{UInt8}) -> Pdf

将 DOCX / PPTX / XLSX 字节转换为 Pdf


DocumentBuilder

一个流式、感知结构的 PDF 构建器。用 a4_page / letter_page / page 创建页面,在返回的 PageBuilder 上排布内容,调用 done 提交每一页,最后调用 build / save 或其加密变体。

DocumentBuilder() -> DocumentBuilder

文档级配置

set_title(b::DocumentBuilder, value::AbstractString)
set_author(b::DocumentBuilder, value::AbstractString)
set_subject(b::DocumentBuilder, value::AbstractString)
set_keywords(b::DocumentBuilder, value::AbstractString)
set_creator(b::DocumentBuilder, value::AbstractString)
on_open(b::DocumentBuilder, value::AbstractString)
language(b::DocumentBuilder, value::AbstractString)
tagged_pdf_ua1(b::DocumentBuilder)
role_map(b::DocumentBuilder, custom::AbstractString, standard::AbstractString)
register_embedded_font(b::DocumentBuilder, name::AbstractString, f::EmbeddedFont)
函数 说明
set_title / set_author / set_subject / set_keywords / set_creator 设置对应的 /Info 元数据字段。
on_open(b, value) 设置一个文档打开时执行的 JavaScript 动作。
language(b, value) 设置文档语言(例如 "en-US")。
tagged_pdf_ua1(b) 启用 PDF/UA-1 标记 PDF 模式。
role_map(b, custom, standard) 将自定义结构类型映射到标准类型。
register_embedded_font(b, name, f) name 下注册一个已加载的 EmbeddedFont(会消费该字体句柄)。

页面

a4_page(b::DocumentBuilder) -> PageBuilder
letter_page(b::DocumentBuilder) -> PageBuilder
page(b::DocumentBuilder, width::Real, height::Real) -> PageBuilder

输出

build(b::DocumentBuilder) -> Vector{UInt8}
save(b::DocumentBuilder, path::AbstractString)
save_encrypted_builder(b::DocumentBuilder, path::AbstractString, user_password::AbstractString, owner_password::AbstractString)
to_bytes_encrypted(b::DocumentBuilder, user_password::AbstractString, owner_password::AbstractString) -> Vector{UInt8}
函数 说明
build(b) 构建并返回 PDF 字节(构建器仍需关闭)。
save(b, path) 构建并保存到路径。
save_encrypted_builder(b, path, user_pw, owner_pw) 构建并以 AES-256 加密保存。
to_bytes_encrypted(b, user_pw, owner_pw) 构建加密字节(AES-256)。

EmbeddedFont

embedded_font_from_file(path::AbstractString) -> EmbeddedFont
embedded_font_from_bytes(data::AbstractVector{UInt8}; name::Union{Nothing,AbstractString} = nothing) -> EmbeddedFont
函数 说明
embedded_font_from_file(path) 从路径加载一个 TTF/OTF 字体。
embedded_font_from_bytes(data; name) 从字节加载字体(name 可留空以使用其 PostScript 名称)。

PageBuilder

a4_page / letter_page / page 返回。所有方法都原地修改该页面;调用 done(p) 将其提交给父构建器(这会消费该页面句柄)。

文本与布局

font(p::PageBuilder, name::AbstractString, size::Real)
at(p::PageBuilder, x::Real, y::Real)
heading(p::PageBuilder, level::Integer, text::AbstractString)
方法 说明
font(p, name, size) 设置后续文本的字体与字号。
at(p, x, y) 将光标移动到绝对坐标 (x, y)(点,原点在左下角)。
heading(p, level, text) 输出一个 level(1–6)级标题。

以下字符串值方法都遵循相同签名 f(p::PageBuilder, value::AbstractString)

方法 说明
text(p, value) 输出一段正文文本。
paragraph(p, value) 输出一个自动换行的段落。
link_url(p, value) 将前一段文本变为 URL 链接。
link_named(p, value) 将前一段文本链接到一个命名目标。
link_javascript(p, value) 为前一段文本附加一个 JavaScript 动作。
on_open(p, value) 设置一个页面打开时执行的 JavaScript 动作。
on_close(p, value) 设置一个页面关闭时执行的 JavaScript 动作。
field_keystroke(p, value) / field_format(p, value) / field_validate(p, value) / field_calculate(p, value) 附加 AcroForm 字段相关的 JavaScript 动作。
sticky_note(p, value) 为前一段内容附加一个便笺。
watermark(p, value) 添加一个文本水印。
stamp(p, value) 添加一个图章批注。
inline(p, value) 追加一段行内文本。
inline_bold(p, value) 追加一段加粗行内文本。
inline_italic(p, value) 追加一段斜体行内文本。

零参数布局方法,均为 f(p::PageBuilder)

方法 说明
horizontal_rule(p) 绘制一条水平分隔线。
space(p) 插入垂直空白。
newline(p) 换到新的一行。
new_page_same_size(p) 以相同尺寸开始新的一页。
watermark_confidential(p) 添加 “CONFIDENTIAL” 水印。
watermark_draft(p) 添加 “DRAFT” 水印。
link_page(p::PageBuilder, page_index::Integer)
sticky_note_at(p::PageBuilder, x::Real, y::Real, text::AbstractString)
freetext(p::PageBuilder, x::Real, y::Real, w::Real, h::Real, text::AbstractString)
footnote(p::PageBuilder, ref_mark::AbstractString, note_text::AbstractString)
columns(p::PageBuilder, column_count::Integer, gap_pt::Real, text::AbstractString)
inline_color(p::PageBuilder, r::Real, g::Real, b_::Real, text::AbstractString)
方法 说明
link_page(p, page_index) 将前一段文本链接到一个内部页码索引。
sticky_note_at(p, x, y, text) 放置一个独立的便笺。
freetext(p, x, y, w, h, text) 在一个矩形内放置一段自由流动的文本批注。
footnote(p, ref_mark, note_text) 添加一个脚注(行内上标 + 页面末尾正文)。
columns(p, column_count, gap_pt, text) 将文本排布为多栏均衡布局。
inline_color(p, r, g, b_, text) 追加一段 RGB 着色(通道范围 0–1)的行内文本。

标记批注

以下四个方法均共享签名 f(p::PageBuilder, r::Real, g::Real, b_::Real),对前一段文本应用 RGB 颜色:

方法 说明
highlight(p, r, g, b) 高亮前一段文本。
underline(p, r, g, b) 为前一段文本加下划线。
strikeout(p, r, g, b) 为前一段文本加删除线。
squiggly(p, r, g, b) 为前一段文本加波浪下划线。

表单控件

text_field(p::PageBuilder, name, x, y, w, h; default_value::Union{Nothing,AbstractString} = nothing)
checkbox(p::PageBuilder, name, x, y, w, h, checked::Bool)
combo_box(p::PageBuilder, name, x, y, w, h, options::AbstractVector{<:AbstractString}; selected::Union{Nothing,AbstractString} = nothing)
radio_group(p::PageBuilder, name, values, xs, ys, ws, hs; selected::Union{Nothing,AbstractString} = nothing)
push_button(p::PageBuilder, name, x, y, w, h, caption::AbstractString)
signature_field(p::PageBuilder, name, x, y, w, h)
方法 说明
text_field(p, name, x, y, w, h; default_value) 添加一个单行文本字段。
checkbox(p, name, x, y, w, h, checked) 添加一个带初始勾选状态的复选框。
combo_box(p, name, x, y, w, h, options; selected) 添加一个下拉组合框。
radio_group(p, name, values, xs, ys, ws, hs; selected) 添加一个单选组(用并行数组描述每个按钮)。
push_button(p, name, x, y, w, h, caption) 添加一个可点击的按钮。
signature_field(p, name, x, y, w, h) 添加一个未签名的签名占位区域。

图像与条码

image(p::PageBuilder, bytes::AbstractVector{UInt8}, x, y, w, h)
image_with_alt(p::PageBuilder, bytes::AbstractVector{UInt8}, x, y, w, h, alt_text::AbstractString)
image_artifact(p::PageBuilder, bytes::AbstractVector{UInt8}, x, y, w, h)
barcode_1d(p::PageBuilder, barcode_type::Integer, data::AbstractString, x, y, w, h)
barcode_qr(p::PageBuilder, data::AbstractString, x, y, size::Real)
方法 说明
image(p, bytes, x, y, w, h) 嵌入一张图像(原始 JPEG/PNG/WebP)。
image_with_alt(p, bytes, x, y, w, h, alt_text) 嵌入一张带无障碍替代文本的图像。
image_artifact(p, bytes, x, y, w, h) /Artifact 形式嵌入一张装饰性图像。
barcode_1d(p, barcode_type, data, x, y, w, h) 放置一个一维条码(barcode_type:0=Code128…7=Codabar)。
barcode_qr(p, data, x, y, size) 放置一个正方形二维码。

矢量图形

rect(p::PageBuilder, x, y, w, h)
filled_rect(p::PageBuilder, x, y, w, h, r, g, b_)
line(p::PageBuilder, x1, y1, x2, y2)
stroke_rect(p::PageBuilder, x, y, w, h, width, r, g, b_)
stroke_line(p::PageBuilder, x1, y1, x2, y2, width, r, g, b_)
stroke_rect_dashed(p::PageBuilder, x, y, w, h, width, r, g, b_, dash_array::AbstractVector{<:Real}, phase::Real)
stroke_line_dashed(p::PageBuilder, x1, y1, x2, y2, width, r, g, b_, dash_array::AbstractVector{<:Real}, phase::Real)
text_in_rect(p::PageBuilder, x, y, w, h, text::AbstractString, align::Integer)
方法 说明
rect(p, x, y, w, h) 1pt 黑色描边矩形轮廓。
filled_rect(p, x, y, w, h, r, g, b) RGB(0–1)填充矩形。
line(p, x1, y1, x2, y2) 1pt 黑色直线。
stroke_rect(p, x, y, w, h, width, r, g, b) width pt 宽的 RGB 描边矩形。
stroke_line(p, x1, y1, x2, y2, width, r, g, b) width pt 宽的 RGB 描边直线。
stroke_rect_dashed(...) 虚线描边矩形(dash_array 为开/关线段长度,phase 为偏移量)。
stroke_line_dashed(...) 虚线描边直线。
text_in_rect(p, x, y, w, h, text, align) 在矩形内绘制文本(align:0=左对齐、1=居中、2=右对齐)。

表格

table(p::PageBuilder, n_columns::Integer, widths::AbstractVector{<:Real}, aligns::AbstractVector{<:Integer}, n_rows::Integer, cell_strings::AbstractMatrix{<:AbstractString}, has_header::Bool)
streaming_table_begin(p::PageBuilder, headers::AbstractVector{<:AbstractString}, widths::AbstractVector{<:Real}, aligns::AbstractVector{<:Integer}, repeat_header::Bool)
streaming_table_begin_v2(p::PageBuilder, headers, widths, aligns, repeat_header::Bool, mode::Integer, sample_rows::Integer, min_col_width_pt::Real, max_col_width_pt::Real, max_rowspan::Integer)
streaming_table_set_batch_size(p::PageBuilder, batch_size::Integer)
streaming_table_pending_row_count(p::PageBuilder) -> Int
streaming_table_batch_count(p::PageBuilder) -> Int
streaming_table_push_row(p::PageBuilder, cells::AbstractVector{<:AbstractString})
streaming_table_push_row_v2(p::PageBuilder, cells::AbstractVector{<:AbstractString}, rowspans::AbstractVector{<:Integer})
streaming_table_flush(p::PageBuilder)
streaming_table_finish(p::PageBuilder)
方法 说明
table(p, n_columns, widths, aligns, n_rows, cell_strings, has_header) 输出一个缓冲表格(aligns:0=左/1=中/2=右;cell_strings 是行优先的 n_rows × n_columns 矩阵)。
streaming_table_begin(p, headers, widths, aligns, repeat_header) 打开一个流式表格(并行的、长度为 n_columns 的数组)。
streaming_table_begin_v2(...) 打开一个带宽度 mode(0=Fixed、1=Sample、2=AutoAll)与 max_rowspan 的流式表格。
streaming_table_set_batch_size(p, batch_size) 设置批大小(0 → 256)。
streaming_table_pending_row_count(p) 自上一个批次边界以来已推送的行数。
streaming_table_batch_count(p) 目前已完成的批次数量。
streaming_table_push_row(p, cells) 推送一行(rowspan=1)。
streaming_table_push_row_v2(p, cells, rowspans) 推送一行,带逐单元格的跨行设置(≥2 个跨度)。
streaming_table_flush(p) 刷新当前批次。
streaming_table_finish(p) 结束该流式表格。

提交

done(p::PageBuilder)   # commit this page's buffered operations to its parent builder (consumes the handle)

值类型

提取操作返回的不可变结构体。Bbox 拥有 xywidthheight 字段(PDF 用户空间单位)。

类型 字段
Bbox xywidthheightFloat64
Char character::UInt32bbox::Bboxfont_name::Stringfont_size::Float64
Word textbboxfont_namefont_sizebold
TextLine textbboxword_count
Table row_countcol_counthas_headercells(使用 cell(t, row, col) 获取一个 0 基单元格)
Font nametypeencodingembeddedsubset
Image widthheightbitsPerComponentformatcolorspacedata
Annotation typesubtypecontentauthorrect::BboxborderWidth
Path bbox::BboxstrokeWidthhasStrokehasFilloperationCount
SearchResult textpagebbox::Bbox
FormField namevaluetypereadonlyrequired
PdfVersion major::Intminor::Int
cell(t::Table, row::Integer, col::Integer) -> String

FormField 访问器

form_field_name(f::FormField) -> String
form_field_value(f::FormField) -> String
form_field_type(f::FormField) -> String
form_field_is_readonly(f::FormField) -> Bool
form_field_is_required(f::FormField) -> Bool

ElementList

element_count(l::ElementList) -> Int
element_type(l::ElementList, index::Integer) -> String
element_text(l::ElementList, index::Integer) -> String
element_rect(l::ElementList, index::Integer) -> Bbox
elements_to_json(l::ElementList) -> String
close!(l::ElementList)

数字签名

Certificate

certificate_load_from_bytes(data::AbstractVector{UInt8}, password::AbstractString = "") -> Certificate
certificate_load_from_pem(cert_pem::AbstractString, key_pem::AbstractString) -> Certificate
certificate_get_subject(c::Certificate) -> String
certificate_get_issuer(c::Certificate) -> String
certificate_get_serial(c::Certificate) -> String
certificate_get_validity(c::Certificate) -> Tuple{Int,Int}
certificate_is_valid(c::Certificate) -> Bool
函数 说明
certificate_load_from_bytes(data, password="") 从 PKCS#12 / PFX 字节加载签名凭证。
certificate_load_from_pem(cert_pem, key_pem) 从 PEM 编码的证书 + 私钥加载。
certificate_get_subject(c) / certificate_get_issuer(c) / certificate_get_serial(c) 主体 / 颁发者 / 序列号字符串。
certificate_get_validity(c) 有效期窗口,以 (not_before, not_after) Unix 纪元秒表示。
certificate_is_valid(c) 证书当前是否有效。

签名

sign_bytes(pdf::AbstractVector{UInt8}, cert::Certificate, reason::AbstractString, location::AbstractString) -> Vector{UInt8}
sign_bytes_pades(pdf::AbstractVector{UInt8}, cert::Certificate, level::Integer, tsa_url::Union{Nothing,AbstractString}, reason::AbstractString, location::AbstractString; certs = Vector{UInt8}[], crls = Vector{UInt8}[], ocsps = Vector{UInt8}[]) -> Vector{UInt8}
sign_bytes_pades_opts(pdf::AbstractVector{UInt8}, cert::Certificate, level::Integer, tsa_url, reason, location; certs = Vector{UInt8}[], crls = Vector{UInt8}[], ocsps = Vector{UInt8}[]) -> Vector{UInt8}
add_timestamp(pdf_data::AbstractVector{UInt8}, sig_index::Integer, tsa_url::AbstractString) -> Vector{UInt8}
函数 说明
sign_bytes(pdf, cert, reason, location) 对原始 PDF 字节签名;返回签名后的 PDF。
sign_bytes_pades(pdf, cert, level, tsa_url, reason, location; certs, crls, ocsps) PAdES 基线签名(level:0=B-B、1=B-T、2=B-LT;当 level ≥ 1 时需要 tsa_url)。
sign_bytes_pades_opts(...) sign_bytes_pades 的结构体选项变体(行为相同,内部构造 PadesSignOptionsC)。
add_timestamp(pdf_data, sig_index, tsa_url) 为某个签名添加一个 RFC 3161 时间戳;返回加盖时间戳后的 PDF。

SignatureInfo

signature_get_signer_name(s::SignatureInfo) -> String
signature_get_signing_reason(s::SignatureInfo) -> String
signature_get_signing_location(s::SignatureInfo) -> String
signature_get_signing_time(s::SignatureInfo) -> Int
signature_get_certificate(s::SignatureInfo) -> Certificate
signature_get_pades_level(s::SignatureInfo) -> Int
signature_has_timestamp(s::SignatureInfo) -> Bool
signature_get_timestamp(s::SignatureInfo) -> Timestamp
signature_add_timestamp(s::SignatureInfo, ts) -> Bool
signature_verify(s::SignatureInfo) -> Int
signature_verify_detached(s::SignatureInfo, pdf::AbstractVector{UInt8}) -> Int
函数 说明
signature_get_signer_name(s) / _reason(s) / _location(s) 签名人姓名 / 原因 / 地点。
signature_get_signing_time(s) 签名时间(Unix 纪元秒)。
signature_get_certificate(s) 签名者的 Certificate(持有所有权)。
signature_get_pades_level(s) PAdES 等级代码。
signature_has_timestamp(s) 是否存在内嵌的 RFC 3161 时间戳。
signature_get_timestamp(s) 内嵌的 Timestamp(持有所有权)。
signature_add_timestamp(s, ts) 附加一个 Timestamp;成功时返回 true
signature_verify(s) 签名属性密码学校验(1=有效、0=无效、-1=未知)。
signature_verify_detached(s, pdf) 对照完整 PDF 字节进行端到端校验(1/0/-1)。

Timestamp

timestamp_parse(data::AbstractVector{UInt8}) -> Timestamp
timestamp_get_token(t::Timestamp) -> Vector{UInt8}
timestamp_get_message_imprint(t::Timestamp) -> Vector{UInt8}
timestamp_get_time(t::Timestamp) -> Int
timestamp_get_serial(t::Timestamp) -> String
timestamp_get_tsa_name(t::Timestamp) -> String
timestamp_get_policy_oid(t::Timestamp) -> String
timestamp_get_hash_algorithm(t::Timestamp) -> Int
timestamp_verify(t::Timestamp) -> Bool
函数 说明
timestamp_parse(data) 解析一个 DER 编码的 RFC 3161 TimeStampToken(或裸 TSTInfo)。
timestamp_get_token(t) 原始令牌字节。
timestamp_get_message_imprint(t) 消息摘要(message-imprint digest)字节。
timestamp_get_time(t) 时间戳时间(Unix 纪元秒)。
timestamp_get_serial(t) 序列号字符串。
timestamp_get_tsa_name(t) TSA 名称。
timestamp_get_policy_oid(t) 策略 OID。
timestamp_get_hash_algorithm(t) 摘要算法代码。
timestamp_verify(t) 该令牌是否通过校验。

TsaClient

tsa_client_create(url::AbstractString; username = nothing, password = nothing, timeout::Integer = 30, hash_algo::Integer = 0, use_nonce::Bool = true, cert_req::Bool = true) -> TsaClient
tsa_request_timestamp(t::TsaClient, data::AbstractVector{UInt8}) -> Timestamp
tsa_request_timestamp_hash(t::TsaClient, hash::AbstractVector{UInt8}, hash_algo::Integer) -> Timestamp
函数 说明
tsa_client_create(url; …) 创建一个 RFC 3161 TSA 客户端(可选基本认证、超时、摘要算法、随机数、证书请求)。
tsa_request_timestamp(t, data) data 请求一个时间戳(涉及网络 I/O)。
tsa_request_timestamp_hash(t, hash, hash_algo) 对一个预先计算好的摘要请求时间戳。

Dss(文档安全存储)

dss_cert_count(d::Dss) -> Int
dss_crl_count(d::Dss) -> Int
dss_ocsp_count(d::Dss) -> Int
dss_vri_count(d::Dss) -> Int
dss_get_cert(d::Dss, index::Integer) -> Vector{UInt8}
dss_get_crl(d::Dss, index::Integer) -> Vector{UInt8}
dss_get_ocsp(d::Dss, index::Integer) -> Vector{UInt8}
函数 说明
dss_cert_count(d) / dss_crl_count(d) / dss_ocsp_count(d) / dss_vri_count(d) 证书 / CRL / OCSP 响应 / VRI 条目的数量。
dss_get_cert(d, index) / dss_get_crl(d, index) / dss_get_ocsp(d, index) index 个证书 / CRL / OCSP 响应字节。

校验结果

validate_pdf_a / validate_pdf_ua / validate_pdf_x 分别返回 PdfAResults / UaResults / PdfXResults

函数 返回值 说明
is_compliant(r::PdfAResults) Bool 文档是否符合 PDF/A 标准。
is_compliant(r::PdfXResults) Bool 文档是否符合 PDF/X 标准。
is_accessible(r::UaResults) Bool 文档是否符合 PDF/UA 无障碍标准。
errors(r) Vector{String} 错误信息(PdfAResults / UaResults / PdfXResults)。
warnings(r) Vector{String} 警告信息。
ua_stats(r::UaResults) NamedTuple 无障碍元素计数 (structure, images, tables, forms, annotations, pages)
pdf_a_error_count(r) / pdf_a_warning_count(r) Int PDF/A 错误 / 警告数量。
pdf_ua_error_count(r) / pdf_ua_warning_count(r) Int PDF/UA 错误 / 警告数量。
pdf_x_error_count(r) Int PDF/X 错误数量。

条码

generate_qr_code(data::AbstractString, error_correction::Integer = 0, size_px::Integer = 256) -> Barcode
generate_barcode(data::AbstractString, format::Integer = 0, size_px::Integer = 256) -> Barcode
barcode_get_data(b::Barcode) -> String
barcode_get_format(b::Barcode) -> Int
barcode_get_confidence(b::Barcode) -> Float64
barcode_get_image_png(b::Barcode, size_px::Integer = 256) -> Vector{UInt8}
barcode_get_svg(b::Barcode, size_px::Integer = 256) -> String
函数 说明
generate_qr_code(data, error_correction=0, size_px=256) 生成一个二维码。
generate_barcode(data, format=0, size_px=256) 生成一个一维/二维条码。
barcode_get_data(b) 解码/编码的负载字符串。
barcode_get_format(b) 格式代码。
barcode_get_confidence(b) 解码置信度(0.0–1.0)。
barcode_get_image_png(b, size_px=256) 渲染为 PNG 字节。
barcode_get_svg(b, size_px=256) 渲染为 SVG 字符串。

使用 add_barcode_to_page(e, page, b, x, y, width, height) 将条码盖印到编辑器页面上。


OCR

OcrEngine

ocr_engine_create(det_model_path::AbstractString, rec_model_path::AbstractString, dict_path::AbstractString) -> OcrEngine

从检测模型、识别模型与词典文件路径创建一个 OCR 引擎。配合 ocr_extract_text(doc, page, engine)page_needs_ocr(doc, page) 使用(参见 PdfDocument › OCR)。close!(o::OcrEngine) 释放它。

模型预取

prefetch_models(languages_csv::AbstractString) -> String
prefetch_available() -> Int
model_manifest() -> String
函数 说明
prefetch_models(languages_csv) 为以逗号分隔的若干语言预取 OCR/布局模型。
prefetch_available() 模型预取功能是否可用。
model_manifest() 内置的模型清单(JSON/字符串)。

全局配置与加密

set_log_level(level::Integer)   # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
get_log_level() -> Int
set_max_ops_per_stream(limit::Integer) -> Int
set_preserve_unmapped_glyphs(preserve::Integer) -> Int
函数 说明
set_log_level(level) 设置全局日志级别(0–5)。
get_log_level() 获取当前全局日志级别。
set_max_ops_per_stream(limit) 设置单个流的内容操作数上限;返回先前的上限。
set_preserve_unmapped_glyphs(preserve) 切换是否保留未映射字形;返回先前的设置。

加密策略与清单

crypto_active_provider() -> String
crypto_cbom() -> String
crypto_inventory() -> String
crypto_policy() -> String
crypto_set_policy(spec::AbstractString) -> Int
crypto_fips_available() -> Int
crypto_use_fips() -> Int
函数 说明
crypto_active_provider() 当前活动的加密提供方名称。
crypto_cbom() 密码学物料清单(Cryptographic Bill of Materials,JSON)。
crypto_inventory() 加密算法清单(JSON)。
crypto_policy() 当前活动的加密策略。
crypto_set_policy(spec) 根据 spec 设置当前活动的加密策略;返回状态码。
crypto_fips_available() 是否存在可用的 FIPS 提供方。
crypto_use_fips() 是否处于 FIPS 模式。

错误处理

每个非成功的 C-ABI 状态都会抛出 PdfOxideError

using PdfOxide

try
    doc = open_document("file.pdf")
    text = extract_text(doc, 0)
    close!(doc)
catch e
    if e isa PdfOxideError
        @warn "PDF error" code=e.code op=e.op
    else
        rethrow()
    end
end

PdfOxideError <: Exception 携带数值型 C-ABI code 以及发生失败的操作名称。


完整示例

using PdfOxide

# --- Creation ---
doc_bytes = let b = DocumentBuilder()
    set_title(b, "Report")
    p = letter_page(b)
    font(p, "Helvetica", 18)
    at(p, 72, 720)
    heading(p, 1, "Quarterly Report")
    paragraph(p, "Generated by PDF Oxide.")
    done(p)
    out = build(b)
    close!(b)
    out
end

# --- Extraction ---
doc = open_from_bytes(doc_bytes)
println("Pages: ", page_count(doc))
for i in 0:page_count(doc)-1
    println("Page ", i + 1, ": ", length(extract_text(doc, i)), " chars")
end

# Words + tables
words = extract_words(doc, 0)
tables = extract_tables(doc, 0)

# Search
for hit in search_all(doc, "report", false)
    println("Found on page ", hit.page, " at ", hit.bbox)
end
close!(doc)

# --- Editing ---
e = open_editor("input.pdf")
rotate_all_pages(e, 90)
set_form_field_value(e, "name", "Jane Doe")
flatten_forms(e)
save(e, "output.pdf")
close!(e)

# --- Rendering ---
doc = open_document("input.pdf")
img = render_page(doc, 0)          # PNG
save(img, "page0.png")
close!(img)
close!(doc)

Other Language Bindings

PDF Oxide 为所有主流生态系统提供原生绑定:Rust, Python, Node.js, WASM, C#, Golang, Java, PHP, Ruby, C++, Swift, Kotlin, Dart, R, Zig, Scala, Clojure, Objective-C, Elixir

后续步骤