Справочник PHP API
PDF Oxide поставляется с привязкой на чистом PHP, построенной на встроенном расширении PHP FFI. PHP-код — это тонкий слой над тем же cdylib libpdf_oxide, что используют привязки для Python, Node, Go, C#, Ruby и Java.
composer require oxide/pdf-oxide
Все классы находятся в пространстве имён PdfOxide\. Требуется PHP 8.2+ с включённым ext-ffi. Хук Composer, срабатывающий после установки, загружает подходящую готовую нативную библиотеку; задайте PDF_OXIDE_CDYLIB_PATH, чтобы указать на собственную сборку, или PDF_OXIDE_SKIP_DOWNLOAD=1, чтобы пропустить загрузку.
Справочник по Rust API см. в разделе Справочник Rust API. По Python API — в разделе Справочник Python API. По JavaScript API — в разделах Справочник Node.js API и Справочник WASM API.
Привязка предоставляет 10 классов:
| Класс | Назначение |
|---|---|
PdfOxide\PdfDocument |
Открытие, чтение, извлечение и постраничный обход PDF |
PdfOxide\Pdf |
Создание PDF (Markdown в PDF, HTML в PDF), версия, предзагрузка моделей |
PdfOxide\PdfPage |
Лёгкое представление отдельной страницы |
PdfOxide\MarkdownConverter |
Статическая конвертация в Markdown / HTML / обычный текст |
PdfOxide\AutoExtractor |
Извлечение с типизированной причиной и классификация страниц |
PdfOxide\AutoExtractResult |
Неизменяемый объект-значение с результатом для AutoExtractor |
PdfOxide\DocumentEditor |
Редактирование, очистка метаданных, безвозвратное удаление (redaction), сохранение |
PdfOxide\PdfSigner |
Подписание PAdES B-B / B-T / B-LT / B-LTA |
PdfOxide\PdfValidator |
Проверки соответствия PDF/A, PDF/UA и PDF/X |
PdfOxide\PdfPolicy |
Глобальная для процесса политика управления криптографией, задаваемая один раз |
PdfDocument
Основной класс для открытия, чтения и извлечения PDF-файлов.
use PdfOxide\PdfDocument;
Конструкторы / фабричные методы
PdfDocument::open(string $path): self
Открыть PDF по пути к файлу.
PdfDocument::openBytes(string $bytes): self
Открыть PDF из строки байтов в памяти (например, загруженной из S3 или полученной по HTTP).
PdfDocument::extractTextOnce(string $path): string
Открыть файл, извлечь весь текст за один вызов и освободить дескриптор.
Сведения о документе
$doc->pageCount(): int
Вернуть количество страниц в документе.
$doc->version(): array
Вернуть версию PDF в виде массива целых чисел [major, minor].
$doc->hasStructureTree(): bool
Проверить, является ли документ тегированным PDF со структурным деревом.
$doc->hasFormFields(): bool
Проверить, содержит ли документ поля формы AcroForm.
$doc->hasSignatures(): bool
Проверить, содержит ли документ цифровые подписи.
$doc->getSourcePath(): ?string
Вернуть путь к исходному файлу, из которого был открыт документ, или null для документов, загруженных из байтов.
Извлечение текста
$doc->extractText(int $pageIndex): string
Извлечь обычный текст с одной страницы по индексу, отсчитываемому с нуля.
$doc->extractStructured(int $page): array
Извлечь структурированное содержимое страницы (фрагменты, символы и размеры) в виде ассоциативного массива.
$doc->extractTextAuto(int $pageIndex): string
Извлечь текст со страницы с автоматическим выбором между нативным текстом и OCR.
Конвертация
$doc->toMarkdown(int $pageIndex = 0): string
Преобразовать одну страницу в Markdown.
$doc->toMarkdownAll(): string
Преобразовать весь документ в Markdown.
$doc->toHtml(int $pageIndex = 0): string
Преобразовать одну страницу в HTML.
Доступ к страницам
$doc->page(int $index): PdfPage
Вернуть лёгкое представление PdfPage для указанного индекса, отсчитываемого с нуля.
$doc->pages(): array
Вернуть все страницы в виде массива объектов PdfPage.
$doc->pagesIter(): \Generator
Лениво обойти страницы, выдавая по одному объекту PdfPage за раз.
Жизненный цикл
$doc->isOpen(): bool
Вернуть, открыт ли ещё нативный дескриптор.
$doc->close(): void
Освободить нативный дескриптор. Также вызывается автоматически в __destruct().
$doc->getHandle(): CData
Вернуть сырой дескриптор FFI (для продвинутого использования / взаимодействия).
Создание новых PDF из исходного содержимого и доступ к вспомогательным методам уровня библиотеки.
use PdfOxide\Pdf;
Фабричные методы
Pdf::fromMarkdown(string $markdown): self
Создать PDF из содержимого Markdown.
Pdf::fromHtml(string $html): self
Создать PDF из содержимого HTML.
Pdf::fromText(string $text): self
Создать PDF из обычного текста.
Сохранение
$pdf->save(): string
Отрендерить PDF и вернуть его байты в виде строки.
$pdf->saveTo(string $path): void
Отрендерить PDF и записать его по пути к файлу.
Вспомогательные методы библиотеки
Pdf::version(): string
Вернуть строку версии нижележащей нативной библиотеки.
Pdf::prefetchAvailable(): bool
Вернуть, доступна ли в этой сборке предзагрузка моделей OCR.
Pdf::prefetchModels(array $languages): string
Предзагрузить модели OCR для указанных кодов языков; возвращает строку статуса.
Pdf::VERSION // string constant, e.g. "0.3.69"
Жизненный цикл
$pdf->isOpen(): bool
$pdf->close(): void
$pdf->getHandle(): CData
Проверить, освободить или получить сырой нативный дескриптор.
PdfPage
Лёгкое представление отдельной страницы, возвращаемое методами PdfDocument::page(), pages() или pagesIter().
use PdfOxide\PdfPage;
Методы
$page->parent(): PdfDocument
Вернуть документ-владелец PdfDocument.
$page->index(): int
Вернуть индекс страницы, отсчитываемый с нуля.
$page->text(): string
Извлечь обычный текст с этой страницы.
$page->textAuto(): string
Извлечь текст с этой страницы с автоматическим выбором между нативным текстом и OCR.
$page->toMarkdown(): string
Преобразовать эту страницу в Markdown.
$page->toHtml(): string
Преобразовать эту страницу в HTML.
$page->__toString(): string
Вернуть обычный текст страницы, когда объект используется в строковом контексте.
MarkdownConverter
Статические помощники для конвертации открытого PdfDocument в Markdown, HTML или обычный текст.
use PdfOxide\MarkdownConverter;
Методы
MarkdownConverter::toMarkdown(PdfDocument $doc, int $pageIndex): string
Преобразовать одну страницу в Markdown.
MarkdownConverter::toMarkdownAll(PdfDocument $doc): string
Преобразовать весь документ в Markdown.
MarkdownConverter::toHtml(PdfDocument $doc, int $pageIndex): string
Преобразовать одну страницу в HTML.
MarkdownConverter::toPlainText(PdfDocument $doc, int $pageIndex): string
Преобразовать одну страницу в обычный текст.
AutoExtractor
Извлечение с типизированной причиной, выбором между нативным текстом и OCR и постраничной классификацией документа.
use PdfOxide\AutoExtractor;
Константы
| Константа | Значение | Смысл |
|---|---|---|
AutoExtractor::MODE_AUTO |
0 |
Автоматический выбор нативного текста или OCR |
AutoExtractor::MODE_TEXT_ONLY |
1 |
Только нативный текст, без OCR |
AutoExtractor::MODE_FORCE_OCR |
2 |
Всегда запускать OCR |
Фабричные методы
AutoExtractor::of(PdfDocument $doc, int $mode = self::MODE_AUTO): self
Создать экстрактор для документа с явно заданным режимом.
AutoExtractor::fast(PdfDocument $doc): self
Создать экстрактор, настроенный на скорость.
AutoExtractor::balanced(PdfDocument $doc): self
Создать экстрактор, балансирующий между скоростью и точностью.
AutoExtractor::highFidelity(PdfDocument $doc): self
Создать экстрактор, настроенный на максимальную точность.
Извлечение
$ex->extractText(): string
Извлечь текст из всего документа.
$ex->extractTextForPage(int $pageIndex): string
Извлечь текст с одной страницы.
$ex->extractAutoPage(int $pageIndex): AutoExtractResult
Извлечь одну страницу, вернув типизированный AutoExtractResult с причиной и уверенностью.
$ex->extractAutoDocument(): AutoExtractResult
Извлечь весь документ, вернув типизированный AutoExtractResult.
$ex->extractPageJson(int $pageIndex): string
Извлечь одну страницу в виде строки JSON.
$ex->extractDocumentJson(): string
Извлечь весь документ в виде строки JSON.
Классификация
$ex->classifyPageKind(int $pageIndex): string
Классифицировать одну страницу (например, text_layer, scanned, image_text, mixed, empty).
$ex->classifyDocumentKinds(): array
Классифицировать каждую страницу, вернув массив строк с типами страниц.
Аксессоры
$ex->document(): PdfDocument
Вернуть нижележащий PdfDocument.
$ex->mode(): int
Вернуть константу активного режима извлечения.
AutoExtractResult
Неизменяемый объект-значение, возвращаемый методами AutoExtractor::extractAutoPage() и extractAutoDocument().
use PdfOxide\AutoExtractResult;
Свойства
| Свойство | Тип | Описание |
|---|---|---|
text |
string |
Извлечённый текст |
reason |
string |
Одна из констант REASON_* |
confidence |
float |
Уверенность в диапазоне [0.0, 1.0] |
ocrUsed |
bool |
Запускался ли OCR для этого результата |
regions |
array |
Подробные сведения по каждой области |
pagesNeedingOcr |
array |
Индексы страниц, которым всё ещё нужен OCR |
Константы
| Константа причины | Значение |
|---|---|
REASON_OK |
ok |
REASON_NATIVE_TEXT_HIGH_CONFIDENCE |
native_text_high_confidence |
REASON_NO_TEXT_LAYER_PRESENT |
no_text_layer_present |
REASON_OCR_REQUESTED_BUT_UNAVAILABLE |
ocr_requested_but_unavailable |
REASON_OCR_LOW_CONFIDENCE_FALLBACK |
ocr_low_confidence_fallback |
REASON_IMAGE_TABLE_RECONSTRUCTED |
image_table_reconstructed |
REASON_EMPTY |
empty |
| Константа типа | Значение |
|---|---|
KIND_TEXT_LAYER |
text_layer |
KIND_SCANNED |
scanned |
KIND_IMAGE_TEXT |
image_text |
KIND_MIXED |
mixed |
KIND_EMPTY |
empty |
Методы
$result->isOk(): bool
Вернуть, прошло ли извлечение успешно без деградации.
$result->isOcrFallback(): bool
Вернуть, был ли задействован резервный путь из-за недоступности OCR или низкой уверенности.
DocumentEditor
Редактирование PDF на месте: очистка метаданных, применение безвозвратных удалений (redaction), установка производителя (producer) и сохранение.
use PdfOxide\DocumentEditor;
Конструктор
DocumentEditor::open(string $path): self
Открыть PDF для редактирования.
Удаление (redaction)
$editor->addRedaction(int $pageIndex, float $x1, float $y1, float $x2, float $y2): self
Поставить в очередь прямоугольную область удаления (координаты в пунктах PDF). Поддерживает цепочку вызовов — возвращает $this.
$editor->redactionCount(int $pageIndex): int
Вернуть количество ожидающих удалений на странице.
$editor->applyRedactionsDestructive(bool $scrubMetadata = true): int
Безвозвратно применить все поставленные в очередь удаления (при ошибке завершается отказом). Возвращает количество применённых; при необходимости очищает метаданные.
Метаданные
$editor->scrubMetadata(): self
Удалить метаданные документа. Поддерживает цепочку вызовов — возвращает $this.
$editor->getProducer(): string
Вернуть строку Producer документа.
$editor->setProducer(string $producer): self
Установить строку Producer документа. Поддерживает цепочку вызовов — возвращает $this.
Сведения о документе
$editor->version(): array
Вернуть версию PDF в виде массива [major, minor].
$editor->pageCount(): int
Вернуть количество страниц.
$editor->isModified(): bool
Вернуть, есть ли в документе несохранённые изменения.
$editor->sourcePath(): string
Вернуть путь к исходному файлу.
Сохранение
$editor->saveTo(string $path): void
Записать отредактированный PDF по пути к файлу.
$editor->save(): string
Отрендерить отредактированный PDF и вернуть его байты в виде строки.
Жизненный цикл
$editor->isOpen(): bool
$editor->close(): void
$editor->getHandle(): CData
Проверить, освободить или получить сырой нативный дескриптор.
PdfSigner
Цифровое подписание PAdES с уровнями соответствия B-B, B-T, B-LT и B-LTA.
use PdfOxide\PdfSigner;
Константы
| Константа | Значение | Уровень |
|---|---|---|
PdfSigner::LEVEL_B_B |
0 |
PAdES B-B (базовый) |
PdfSigner::LEVEL_B_T |
1 |
PAdES B-T (с меткой времени) |
PdfSigner::LEVEL_B_LT |
2 |
PAdES B-LT (долгосрочный) |
PdfSigner::LEVEL_B_LTA |
3 |
PAdES B-LTA (долгосрочный с архивной меткой времени) |
Конструктор / фабрика
PdfSigner::fromPkcs12(string $keystorePath, string $password): self
Создать подписанта из хранилища ключей PKCS#12 (.p12 / .pfx).
Подписание
$signer->sign(
string $pdfBytes,
string|int $level = self::LEVEL_B_B,
?string $tsaUrl = null,
?string $reason = null,
?string $location = null,
): string
Подписать байты PDF и вернуть байты подписанного PDF. Уровни выше B-B требуют tsaUrl. $level принимает порядковый номер LEVEL_B_* или короткий тег ('b', 't', 'lt', 'lta').
PdfSigner::signWithHandle(
string $pdfBytes,
CData $certificateHandle,
string|int $level,
?string $tsaUrl = null,
?string $reason = null,
?string $location = null,
): string
Статический удобный метод: подписание без создания управляемого экземпляра подписанта. Вызывающая сторона сохраняет владение $certificateHandle.
Проверка
PdfSigner::verify(string $pdfBytes): bool
Вернуть, содержат ли байты PDF словарь подписи и диапазон байтов.
Жизненный цикл
$signer->isOpen(): bool
$signer->close(): void
Проверить или освободить учётные данные для подписания.
PdfValidator
Статические проверки соответствия PDF/A, PDF/UA и PDF/X для открытого PdfDocument.
use PdfOxide\PdfValidator;
Константы
| Константа PDF/A | Значение | Константа PDF/UA | Значение | |
|---|---|---|---|---|
PDFA_1B |
0 |
PDFUA_1 |
1 |
|
PDFA_1A |
1 |
PDFUA_2 |
2 |
|
PDFA_2B |
2 |
|||
PDFA_2A |
3 |
|||
PDFA_2U |
4 |
|||
PDFA_3B |
5 |
|||
PDFA_3A |
6 |
|||
PDFA_3U |
7 |
Методы
PdfValidator::isPdfA(PdfDocument $doc, int $level = self::PDFA_1B): bool
Вернуть, соответствует ли документ заданному уровню PDF/A.
PdfValidator::isPdfUa(PdfDocument $doc, int $level = self::PDFUA_1): bool
Вернуть, соответствует ли документ заданному уровню PDF/UA.
PdfValidator::isPdfX(PdfDocument $doc): bool
Не реализовано — в pdf_oxide пока нет публичного валидатора PDF/X, доступного через C ABI. Вызов всегда выбрасывает BadMethodCallException.
PdfValidator::validatePdfA(PdfDocument $doc, int $level = self::PDFA_1B): array
Выполнить полную проверку PDF/A и вернуть структурированный массив с результатом (флаг соответствия плюс все нарушения).
PdfPolicy
Глобальная для процесса политика управления криптографией, задаваемая один раз. Должна быть настроена до открытия любого PDF.
use PdfOxide\PdfPolicy;
Константы
| Константа | Значение |
|---|---|
PdfPolicy::COMPAT |
compat |
PdfPolicy::STRICT |
strict |
PdfPolicy::FIPS_STRICT |
fips_strict |
Методы
PdfPolicy::current(): string
Вернуть активный режим политики.
PdfPolicy::set(string $mode): void
Установить глобальную для процесса политику (одну из констант политики). Задаётся один раз на процесс.
PdfPolicy::fipsAvailable(): bool
Вернуть, доступен ли криптопровайдер, прошедший валидацию FIPS.
PdfPolicy::activeProvider(): string
Вернуть имя активного криптопровайдера.
PdfPolicy::compat(): string
PdfPolicy::strict(): string
PdfPolicy::fipsStrict(): string
Удобные аксессоры, возвращающие строку соответствующего режима политики.
Обработка ошибок
Все ошибки, специфичные для PDF, наследуются от PdfOxide\Exceptions\PdfException. Специализированные подклассы позволяют перехватывать более узкие категории сбоев.
use PdfOxide\PdfDocument;
use PdfOxide\Exceptions\PdfException;
try {
$doc = PdfDocument::open('file.pdf');
echo $doc->extractText(0);
} catch (PdfException $e) {
error_log("PDF error: {$e->getMessage()}");
}
Исключение (в PdfOxide\Exceptions\) |
Причина |
|---|---|
PdfException |
Базовый класс для всех ошибок PDF |
ParseException |
Некорректный или неразбираемый PDF |
IoException |
Ошибка чтения/записи файла |
NotFoundException |
Отсутствующий файл, страница или объект |
EncryptionException |
Ошибка шифрования / пароля |
ValidationException |
Недопустимый аргумент или ввод |
SignatureException |
Ошибка подписания или проверки подписи |
RedactionException |
Ошибка удаления (redaction) |
SearchException |
Ошибка поиска |
OptimizationException |
Ошибка оптимизации |
ComplianceException |
Ошибка соответствия PDF/A или PDF/UA |
AccessibilityException |
Ошибка доступности / тегирования |
UnsupportedException |
Неподдерживаемая возможность или операция |
InvalidStateException |
Операция над закрытым или недопустимым дескриптором |
InternalError |
Внутренняя нативная ошибка |
Полный пример
use PdfOxide\PdfDocument;
use PdfOxide\Pdf;
use PdfOxide\AutoExtractor;
use PdfOxide\DocumentEditor;
use PdfOxide\PdfSigner;
use PdfOxide\PdfValidator;
// --- Extraction ---
$doc = PdfDocument::open('input.pdf');
echo $doc->pageCount(), " pages\n";
for ($i = 0; $i < $doc->pageCount(); $i++) {
echo "Page {$i}: ", strlen($doc->extractText($i)), " chars\n";
}
echo $doc->toMarkdownAll();
// --- Auto-extraction with typed reasons ---
$ex = AutoExtractor::of($doc);
$result = $ex->extractAutoPage(0);
if (!$result->isOk()) {
error_log("degraded extraction: {$result->reason}");
}
$doc->close();
// --- Creation ---
$pdf = Pdf::fromMarkdown("# Invoice\n\n**Total:** \$42.00\n");
$pdf->saveTo('invoice.pdf');
$pdf->close();
// --- Destructive redaction ---
$editor = DocumentEditor::open('in.pdf');
$editor->addRedaction(0, 100.0, 700.0, 300.0, 720.0);
$editor->applyRedactionsDestructive();
$editor->saveTo('redacted.pdf');
$editor->close();
// --- PAdES B-T signature ---
$signer = PdfSigner::fromPkcs12('certs/sign.p12', 'p12-password');
$signed = $signer->sign(
pdfBytes: file_get_contents('contract.pdf'),
level: PdfSigner::LEVEL_B_T,
tsaUrl: 'https://freetsa.org/tsr',
reason: 'Final contract',
);
file_put_contents('signed.pdf', $signed);
$signer->close();
// --- Compliance check ---
$doc = PdfDocument::open('archive.pdf');
var_dump(PdfValidator::isPdfA($doc, PdfValidator::PDFA_2B));
$doc->close();
Other Language Bindings
PDF Oxide предоставляет нативные привязки для всех основных экосистем: Rust, Python, Node.js, WASM, C#, Golang, Java, Ruby, C++, Swift, Kotlin, Dart, R, Julia, Zig, Scala, Clojure, Objective-C, и Elixir.
Дальнейшие шаги
- Типы и перечисления — все общие типы и перечисления
- Справочник Page API — единообразная постраничная итерация для всех привязок
- Начало работы с PHP — учебное руководство