Skip to content

Java API 参考

PDF Oxide 通过架设在 Rust 内核之上的 JNI 层提供原生 Java 绑定。内置的原生库会在类加载时自动加载;预编译的原生库随包发布,覆盖 Linux、macOS 和 Windows(x86_64 与 ARM64)。

<dependency>
  <groupId>fyi.oxide</groupId>
  <artifactId>pdf-oxide</artifactId>
  <version>0.3.69</version>
</dependency>

所有类都位于 fyi.oxide.pdf 包及其子包(fyi.oxide.pdf.geometryfyi.oxide.pdf.textfyi.oxide.pdf.form 等)中。

import fyi.oxide.pdf.PdfDocument;
import fyi.oxide.pdf.DocumentEditor;
import fyi.oxide.pdf.Pdf;

生命周期。 PdfDocumentDocumentEditorPdf 持有原生内存并实现了 AutoCloseable。请始终使用 try-with-resources。close() 是幂等的;Cleaner 兜底机制会释放泄漏的句柄,但不能依赖它来做及时清理。

线程安全。 文档实例不是线程安全的——每个工作线程各开一个。无状态的静态辅助类(MarkdownConverterPdfValidatorPdfPolicy)则是线程安全的。

关于 Rust API,请参阅 Rust API 参考。关于 Python API,请参阅 Python API 参考


PdfDocument

PDF 的主要只读入口——打开、提取、渲染与转换。实现了 AutoCloseable

import fyi.oxide.pdf.PdfDocument;
import java.nio.file.Paths;

try (PdfDocument doc = PdfDocument.open(Paths.get("invoice.pdf"))) {
    System.out.println(doc.extractText(0));
}

打开(静态工厂方法)

static PdfDocument open(Path path)

从文件系统路径打开一个 PDF。

static PdfDocument open(String path)

从路径字符串打开一个 PDF。

static PdfDocument open(byte[] bytes)

从内存字节打开一个 PDF(例如从 S3 或 HTTP 下载得到的)。

static PdfDocument open(Path path, String password)

用用户密码或所有者密码从路径打开一个加密 PDF。

static PdfDocument open(String path, String password)

用密码从路径字符串打开一个加密 PDF。

static PdfDocument open(byte[] bytes, String password)

用密码从字节打开一个加密 PDF。

static PdfDocument open(InputStream stream)

通过从 InputStream 读取全部字节来打开一个 PDF。

一次性静态辅助方法

static String extractText(String path)

在一次调用中完成打开、提取全部文本并关闭(路径字符串)。

static String extractText(Path path)

在一次调用中完成打开、提取全部文本并关闭(Path)。

身份验证

boolean authenticate(String password)

打开后对加密 PDF 进行身份验证;成功时返回 true

boolean authenticate(byte[] password)

用原始字节密码进行身份验证。

文档信息

int pageCount()

返回文档中的页数。

boolean isOpen()

若文档句柄仍处于打开状态,返回 true

文本提取

String extractText(int pageIndex)

从单个从 0 开始索引的页面提取纯文本。

String extractTextAuto(int pageIndex)

从某页提取文本,对扫描页自动回退到 OCR。

String extractStructured(int page)

将结构化的页面内容(span、行、布局)以 JSON 字符串形式提取出来。

转换

String toMarkdown()

将整个文档转换为 Markdown。

String toMarkdown(int pageIndex)

将单页转换为 Markdown。

String toHtml()

将整个文档转换为 HTML。

String toHtml(int pageIndex)

将单页转换为 HTML。

DOM 访问

PdfPage page(int index)

针对给定的从 0 开始的索引返回一个惰性的 PdfPage 句柄。

渲染

byte[] render(int pageIndex)

以默认 DPI 将某页渲染为 PNG 字节。

byte[] render(int pageIndex, int dpi)

以给定 DPI 将某页渲染为 PNG 字节。

生命周期

void close()

释放底层的原生句柄。幂等。


DocumentEditor

针对 PDF 的可变编辑会话:表单填写、涂黑、元数据擦除与保存。变更方法返回 this 以支持流式链式调用。实现了 AutoCloseable

import fyi.oxide.pdf.DocumentEditor;

try (DocumentEditor editor = DocumentEditor.open("form.pdf")) {
    editor.setFormField("name", "Jane Doe")
          .setFormField("subscribe", true)
          .saveTo(Paths.get("filled.pdf"));
}

打开(静态工厂方法)

static DocumentEditor open(Path path)

Path 打开一个 PDF 以供编辑。

static DocumentEditor open(String path)

从路径字符串打开一个 PDF 以供编辑。

static DocumentEditor open(byte[] bytes)

从内存字节打开一个 PDF 以供编辑。

表单字段

DocumentEditor setFormField(String name, String value)

按名称设置文本或选择类表单字段的值;返回 this

DocumentEditor setFormField(String name, boolean checked)

按名称设置复选框 / 单选框表单字段;返回 this

涂黑

DocumentEditor addRedaction(int pageIndex, BBox region)

在某页的矩形区域上排入一次涂黑;返回 this

int redactionCount(int pageIndex)

返回某页上待处理的涂黑数量。

int redactionCount()

返回整个文档中待处理的涂黑总数。

RedactResult applyRedactionsDestructive()

应用所有已排入的涂黑,永久移除被覆盖的内容;返回一个 RedactResult

元数据

DocumentEditor scrubMetadata()

移除文档信息和 XMP 元数据;返回 this

保存

byte[] save()

将编辑后的文档序列化为一个新的字节数组(完整重写)。

void saveTo(Path out)

将编辑后的文档写入文件(完整重写)。

byte[] saveIncremental()

使用增量更新进行序列化,保留原始字节。

void saveIncrementalTo(Path out)

将一次增量更新写入文件。

生命周期

boolean isOpen()
void close()

检查编辑器是否处于打开状态,并释放其原生句柄。


Pdf

从 Markdown、HTML 或图像创建新的 PDF,并拆分现有 PDF。实现了 AutoCloseable

import fyi.oxide.pdf.Pdf;

try (Pdf pdf = Pdf.fromMarkdown("# Report\n\nGenerated by PDF Oxide.")) {
    pdf.saveTo(Paths.get("report.pdf"));
}

创建(静态工厂方法)

static Pdf fromMarkdown(String markdown)

从 Markdown 内容创建一个 PDF。

static Pdf fromHtml(String html)

从 HTML 内容创建一个 PDF。

static Pdf fromImages(List<byte[]> images)

创建一个多页 PDF,每张图像(JPEG/PNG 字节)一页。

拆分

List<BookmarkSegment> planSplitByBookmarks(SplitByBookmarksOptions opts)

计算在某一书签层级拆分的 BookmarkSegment 方案,但不写出任何输出。

List<byte[]> splitByBookmarks(SplitByBookmarksOptions opts)

在配置的书签层级拆分 PDF,每个分段返回一个字节数组。

static int planSplitByBookmarksCount(byte[] sourcePdf, int level)

返回按书签层级拆分会产生多少个分段,无需打开一个 Pdf

static byte[][] splitByBookmarksFromBytes(byte[] sourcePdf, int level)

在一次静态调用中按给定书签层级拆分源 PDF 字节。

保存与生命周期

byte[] save()

将 PDF 序列化为一个字节数组。

void saveTo(Path out)

将 PDF 写入文件。

boolean isOpen()
void close()

检查句柄是否处于打开状态,并释放原生资源。


AutoExtractor

自适应提取,会对每一页进行分类(文本层 vs. 扫描页)并在需要处应用 OCR。基于一个已打开的 PdfDocument 构建。

import fyi.oxide.pdf.AutoExtractor;

try (PdfDocument doc = PdfDocument.open("scan.pdf")) {
    AutoExtractor extractor = AutoExtractor.balanced(doc);
    AutoResult result = extractor.extractDocument();
    System.out.println(result.text());
}

构造(静态工厂方法)

static AutoExtractor of(PdfDocument doc)

用默认配置创建一个提取器。

static AutoExtractor of(PdfDocument doc, AutoExtractConfig config)

用显式的 AutoExtractConfig 创建一个提取器。

static AutoExtractor fast(PdfDocument doc)

创建一个针对速度调优的提取器(优先文本层)。

static AutoExtractor balanced(PdfDocument doc)

创建一个采用速度/保真度均衡预设的提取器。

static AutoExtractor highFidelity(PdfDocument doc)

创建一个针对最大保真度调优的提取器(激进 OCR)。

提取

String extractText()

提取整个文档的纯文本。

String extractTextForPage(int pageIndex)

提取单页的纯文本。

AutoResult extractDocument()

对文档运行完整的自适应提取;返回一个 AutoResult

AutoResult extractAutoDocument()

extractDocument() 的别名,返回完整的文档结果。

AutoResult extractPage(int pageIndex)

对单页运行自适应提取。

AutoResult extractAutoPage(int pageIndex)

针对单页的 extractPage() 别名。

分类

ClassifyResult classifyDocument()

对每一页进行分类而不做提取;返回一个 ClassifyResult

ClassifyResult classifyPage(int pageIndex)

对单页进行分类。

JSON 输出

String extractDocumentJson()

提取整个文档并将结果序列化为 JSON。

String extractPageJson(int pageIndex)

提取某页并将结果序列化为 JSON。

访问器

PdfDocument document()

返回底层的 PdfDocument

AutoExtractConfig config()

返回当前生效的配置。


MarkdownConverter

用于 Markdown 与 HTML 转换的无状态、线程安全的静态辅助方法。

static String toMarkdown(PdfDocument doc, int pageIndex)

将单页转换为 Markdown。

static String toMarkdown(PdfDocument doc)

将整个文档转换为 Markdown。

static String toHtml(PdfDocument doc, int pageIndex)

将单页转换为 HTML。

static String toHtml(PdfDocument doc)

将整个文档转换为 HTML。


PdfSigner

使用 PKCS#12 密钥库进行数字签名与验证。

import fyi.oxide.pdf.PdfSigner;
import fyi.oxide.pdf.signature.SignOptions;

PdfSigner signer = PdfSigner.fromPkcs12(Paths.get("cert.p12"), "keystore-pw");
byte[] signed = signer.sign(pdfBytes, SignOptions.builder().withReason("Approved").build());
static PdfSigner fromPkcs12(Path keystore, String password)

从 PKCS#12 密钥库文件加载一个签名器。

static PdfSigner fromPkcs12(byte[] keystoreBytes, String password)

从内存中的 PKCS#12 密钥库字节加载一个签名器。

byte[] sign(byte[] pdf, SignOptions opts)

用配置的证书和 SignOptions 对 PDF 字节签名;返回签名后的 PDF。

boolean verify(byte[] pdf)

验证嵌入在 PDF 中的签名;若有效则返回 true

static SignatureLevel classifyLevel(byte[] pdf)

对一份已签名 PDF 的 PAdES 签名级别进行分类;返回一个 SignatureLevel


PdfValidator

无状态、线程安全的 PDF/A、PDF/X 与 PDF/UA 合规性验证。

static boolean isPdfA(PdfDocument doc, PdfALevel level)

针对给定级别快速进行 PDF/A 一致性的布尔检查。

static boolean isPdfUa(PdfDocument doc, PdfUaLevel level)

针对给定级别快速进行 PDF/UA 一致性的布尔检查。

static ValidationResult validatePdfA(PdfDocument doc, PdfALevel level)

针对某一 PDF/A 级别进行验证;返回一个带有违规项的 ValidationResult

static ValidationResult validatePdfX(PdfDocument doc, PdfXLevel level)

针对某一 PDF/X 级别进行验证。

static ValidationResult validatePdfUa(PdfDocument doc, PdfUaLevel level)

针对某一 PDF/UA 级别进行验证。


PdfPolicy

控制允许哪些加密算法的进程级安全策略。线程安全的静态访问器。

static PolicyMode current()

返回当前生效的策略模式。

static void set(PolicyMode mode)

设置进程级的策略模式。

static PolicyMode compat()

返回宽松的兼容模式常量。

static PolicyMode strict()

返回严格模式常量。

static PolicyMode fipsStrict()

返回 FIPS 严格模式常量。


PdfPage

PdfDocument.page(int) 返回的惰性页面句柄。各项属性在访问时分派给父文档处理。

PdfDocument parent()

返回拥有它的文档。

int index()

返回从 0 开始的页码索引。

BBox mediaBox()

BBox 形式返回页面的 MediaBox。

BBox cropBox()

返回页面的 CropBox。

double width()
double height()

以 PDF 点(point)为单位返回页面的宽度和高度。

int rotation()

返回页面的旋转角度(0、90、180、270)。

String text()

提取页面上的所有纯文本。

String text(BBox region)

提取某个矩形区域内的文本。

List<TextWord> words()

返回带边界框的逐词文本(TextWord)。

List<TextLine> lines()

返回逐行文本(TextLine)。

List<TextChar> chars()

返回逐字符数据(TextChar)。


几何类型

BBox

PDF 坐标系下不可变的轴对齐边界框。

BBox(double x0, double y0, double x1, double y1)
double x0()
double y0()
double x1()
double y1()
double width()
double height()

Rect

带位置与尺寸的矩形(原点 + 宽/高)。

Rect(double x, double y, double width, double height)
double x()
double y()
double width()
double height()
BBox toBBox()

Point

一个二维点。

Point(double x, double y)
double x()
double y()

Color

8 位 RGBA 颜色。

Color(int r, int g, int b, int a)
Color(int r, int g, int b)
int r()
int g()
int b()
int a()

文本类型

TextChar

带有位置与 OCR 置信度的单个已解码字符。

TextChar(int codepoint, BBox bbox, float confidence)
int codepoint()
BBox bbox()
float confidence()
String asString()

TextWord

带有边界与置信度的、以空白分隔的单词。

TextWord(String text, BBox bbox, float confidence)
String text()
BBox bbox()
float confidence()

TextLine

由若干单词组成的一行文本。

TextLine(String text, BBox bbox, List<TextWord> words)
String text()
BBox bbox()
List<TextWord> words()

TextSpan

一段样式一致的文本。

TextSpan(String text, BBox bbox, TextStyle style)
String text()
BBox bbox()
TextStyle style()

TextStyle

某个 span 的字体与样式元数据。

TextStyle(String font, double size, Color color, boolean bold, boolean italic)
double size()
Color color()
boolean bold()
boolean italic()

表格类型

Table

带有单元格网格的已检测表格。

Table(BBox bbox, int rows, int cols, List<TableCell> cells)
BBox bbox()
int rows()
int cols()
List<TableCell> cells()

TableCell

单个单元格,包含跨度(span)信息。

TableCell(String text, BBox bbox, int row, int col, int rowSpan, int colSpan)
String text()
BBox bbox()
int row()
int col()
int rowSpan()
int colSpan()

图像类型

ExtractedImage

从某页提取出的栅格图像。

ExtractedImage(byte[] bytes, ImageFormat format, BBox bbox, int width, int height)
byte[] bytes()
ImageFormat format()
BBox bbox()
int width()
int height()

ImageFormat(枚举)

JPEGPNGCCITTRAW


搜索类型

SearchOptions

由 builder 配置的搜索参数。

boolean caseSensitive()
boolean wholeWord()
boolean regex()
Optional<Integer> maxResults()
static SearchOptions.Builder builder()

BuilderwithCaseSensitive(boolean)withWholeWord(boolean)withRegex(boolean)withMaxResults(Integer)withMaxResults(int)build()

SearchResult

一次查询的完整结果。

SearchResult(String query, List<SearchMatch> matches)
String query()
List<SearchMatch> matches()
int count()
boolean isEmpty()

SearchMatch

带有页码与位置的单次命中。

SearchMatch(int pageIndex, BBox bbox, String text)
int pageIndex()
BBox bbox()
String text()

表单类型

FormField

一个 AcroForm 字段。

FormField(String name, FormFieldType type, String value, BBox bbox, int pageIndex)
String name()
FormFieldType type()
Optional<String> value()
Optional<BBox> bbox()
int pageIndex()

FormFieldType(枚举)

TEXTCHECKBOXRADIOCHOICE


注释类型

Annotation

一个页面注释。

Annotation(AnnotationType type, int pageIndex, BBox bbox, String contents, String uri)
AnnotationType type()
int pageIndex()
BBox bbox()
Optional<String> contents()
Optional<String> uri()

AnnotationType(枚举)

HIGHLIGHTTEXTLINKSTAMPUNDERLINESTRIKEOUTSQUIGGLYFREE_TEXTLINESQUARECIRCLEFILE_ATTACHMENT


元数据类型

DocumentInfo

标准的文档信息字典字段。

Optional<String> title()
Optional<String> author()
Optional<String> subject()
Optional<String> keywords()
Optional<String> creator()
Optional<String> producer()
Optional<String> creationDate()
Optional<String> modificationDate()

XmpMetadata

原始的 XMP 元数据包。

XmpMetadata(String xml)
String xml()
boolean isEmpty()

自动提取类型

AutoExtractConfig

AutoExtractor 提供的不可变、由 builder 构造的配置。

Optional<ExtractMode> mode()
Optional<List<Integer>> forceOcrPages()
Optional<Double> minOcrConfidence()
Optional<List<String>> ocrLanguages()
Optional<List<String>> passwords()
Optional<Double> topMarginFraction()
Optional<Double> bottomMarginFraction()
Optional<Boolean> allowSingleColumnTables()
Optional<Boolean> ocrInlineImages()
Optional<String> cancelToken()
static AutoExtractConfig.Builder builder()
AutoExtractConfig.Builder toBuilder()

Builder 方法:withMode(ExtractMode)withForceOcrPages(List<Integer>)withMinOcrConfidence(Double)withOcrLanguages(List<String>)withOcrLanguages(String...)withPasswords(List<String>)withPasswords(String...)withTopMarginFraction(Double)withTopMarginFraction(double)withBottomMarginFraction(Double)withBottomMarginFraction(double)withAllowSingleColumnTables(Boolean)withAllowSingleColumnTables(boolean)withOcrInlineImages(Boolean)withOcrInlineImages(boolean)withCancelToken(String)build()

AutoResult

一次自适应提取的结果。

String text()
Optional<String> markdown()
Optional<String> html()
ExtractReason reason()
double confidence()
boolean ocrUsed()
List<RegionResult> regions()
List<Integer> pagesNeedingOcr()

RegionResult

每个区域的提取结果。

int pageIndex()
BBox bbox()
String text()
ExtractReason reason()
double confidence()
boolean ocrUsed()
Optional<Table> table()

ClassifyResult

页面分类的结果。

List<PageClass> pages()
List<Integer> pagesNeedingOcr()
List<Integer> pagesWithChart()
List<Integer> pagesEncrypted()

ExtractMode(枚举)

TEXT_ONLYAUTO

PageClass(枚举)

TEXT_LAYERSCANNEDMIXED

ExtractReason(枚举)

OKSCANNED_NO_TEXT_LAYERGLYPH_MAPPING_MISSINGENCRYPTED_NO_EXTRACT_PERMISSIONIMAGE_TABLE_NO_STRUCTURECHART_NOT_TRANSCRIBEDOCR_REQUESTED_BUT_UNAVAILABLEOCR_LOW_CONFIDENCEEMPTY


签名类型

SignOptions

PdfSigner 提供的、由 builder 构造的签名参数。

SignatureLevel level()
Optional<String> reason()
Optional<String> location()
Optional<String> contactInfo()
Optional<String> tsaUrl()
static SignOptions.Builder builder()

BuilderwithLevel(SignatureLevel)withReason(String)withLocation(String)withContactInfo(String)withTsaUrl(String)build()

SignatureLevel(枚举)

PAdES 基线级别:B_B(基本)、B_T(带可信时间戳)。


拆分类型

SplitByBookmarksOptions

为基于书签的拆分提供的、由 builder 构造的选项。

int level()
Optional<String> filenamePrefix()
static SplitByBookmarksOptions.Builder builder()

BuilderwithLevel(int)withFilenamePrefix(String)build()

BookmarkSegment

书签拆分计划出的一个输出分段。

BookmarkSegment(String title, int firstPage, int lastPage, String filename)
String title()
int firstPage()
int lastPage()
String filename()

涂黑类型

RedactResult

DocumentEditor.applyRedactionsDestructive() 的结果。

RedactResult(int regionsApplied, boolean oracleVerified)
int regionsApplied()
boolean oracleVerified()

合规类型

ValidationResult

一次 PdfValidator 检查的结果。

ValidationResult(boolean valid, List<ValidationViolation> violations)
boolean valid()
List<ValidationViolation> violations()

ValidationViolation

单条一致性违规。

ValidationViolation(String ruleId, String description, Integer pageIndex)
String ruleId()
String description()
Optional<Integer> pageIndex()

PdfALevel(枚举)

A_1BA_1AA_2BA_2AA_2UA_3BA_3AA_3UA_4A_4E

PdfXLevel(枚举)

X_1A_2001X_1A_2003X_3_2002X_3_2003X_4X_4PX_5GX_5NX_5PGX_6X_6P

PdfUaLevel(枚举)

UA_1UA_2——各自暴露一个 int code()


策略类型

PolicyMode(枚举)

COMPATSTRICT

SecurityPolicy

由 builder 构造的、按操作生效的安全策略。

PolicyMode mode()
List<String> additionalAllow()
List<String> additionalDeny()
static SecurityPolicy.Builder builder()

BuilderwithMode(PolicyMode)allow(String algId)deny(String algId)build()


渲染类型

PixelFormat(枚举)

RGBA_8888RGB_888GRAY_8


错误处理

所有 PDF 特定的失败都会抛出 PdfException(一个非受检的 RuntimeException)或它的某个子类。每个异常都带有一个 PdfErrorKind kind()

import fyi.oxide.pdf.PdfDocument;
import fyi.oxide.pdf.exception.PdfException;

try (PdfDocument doc = PdfDocument.open("file.pdf")) {
    String text = doc.extractText(0);
} catch (PdfException e) {
    System.err.println(e.kind() + ": " + e.getMessage());
}

PdfException

PdfException(String message)
PdfException(PdfErrorKind kind, String message)
PdfException(PdfErrorKind kind, String message, Throwable cause)
PdfErrorKind kind()

子类

异常 抛出时机
PdfParseException 文件格式错误或不是有效的 PDF
PdfEncryptedException PDF 已加密,但未提供密码或密码无效
PdfPermissionException 所请求的操作被文档权限拒绝
PdfIoException 发生了底层的 I/O 错误
PdfOcrUnavailableException 请求了 OCR,但 OCR 后端不可用
PdfSignatureException 签名或验证操作失败
PdfInvalidStateException 在已关闭或无效的句柄上调用了某操作
PdfUnsupportedException 所请求的功能不受支持

PdfErrorKind(枚举)

PARSEENCRYPTEDPERMISSIONIOOCR_UNAVAILABLESIGNATUREINVALID_STATEUNSUPPORTED


完整示例

import fyi.oxide.pdf.PdfDocument;
import fyi.oxide.pdf.DocumentEditor;
import fyi.oxide.pdf.Pdf;
import fyi.oxide.pdf.AutoExtractor;
import fyi.oxide.pdf.auto.AutoResult;
import java.nio.file.Paths;

public class Example {
    public static void main(String[] args) throws Exception {
        // --- Extraction ---
        try (PdfDocument doc = PdfDocument.open(Paths.get("input.pdf"))) {
            System.out.println("Pages: " + doc.pageCount());
            for (int i = 0; i < doc.pageCount(); i++) {
                System.out.println(doc.extractText(i));
            }
            String markdown = doc.toMarkdown();

            // Adaptive extraction with OCR fallback
            AutoResult auto = AutoExtractor.balanced(doc).extractDocument();
            System.out.println("OCR used: " + auto.ocrUsed());
        }

        // --- Creation ---
        try (Pdf pdf = Pdf.fromMarkdown("# Report\n\nGenerated by PDF Oxide.")) {
            pdf.saveTo(Paths.get("report.pdf"));
        }

        // --- Editing ---
        try (DocumentEditor editor = DocumentEditor.open("form.pdf")) {
            editor.setFormField("name", "Jane Doe")
                  .setFormField("subscribe", true)
                  .scrubMetadata()
                  .saveTo(Paths.get("filled.pdf"));
        }
    }
}

Other Language Bindings

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

后续步骤