Skip to content

Метадані та XMP

PDF Oxide читає метадані рівня документа з кількох джерел: заголовка PDF (версія), словників trailer і catalog, потоків метаданих XMP (ISO 16684) та визначень міток сторінок. XmpExtractor розбирає простори імен Dublin Core, XMP Core, PDF та XMP Rights, а також будь-які власні властивості.

Використовуйте version() і catalog() для базових властивостей документа, XmpExtractor::extract() для багатих метаданих та PageLabelExtractor для схем нумерації сторінок.

Швидкий приклад

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
major, minor = doc.version()
print(f"PDF {major}.{minor}, {doc.page_count()} pages")

Node.js

const { PdfDocument } = require("pdf-oxide");

const doc = new PdfDocument("report.pdf");
const { major, minor } = doc.getVersion();
console.log(`PDF ${major}.${minor}, ${doc.pageCount()} pages`);
doc.close();

Go

import pdfoxide "github.com/yfedoseev/pdf_oxide/go"

doc, _ := pdfoxide.Open("report.pdf")
defer doc.Close()
major, minor, _ := doc.Version()
pages, _ := doc.PageCount()
fmt.Printf("PDF %d.%d, %d pages\n", major, minor, pages)

C#

using PdfOxide.Core;

using var doc = PdfDocument.Open("report.pdf");
var (major, minor) = doc.Version;
Console.WriteLine($"PDF {major}.{minor}, {doc.PageCount} pages");

WASM

const doc = new WasmPdfDocument(bytes);
const version = doc.version();
console.log(`PDF ${version}, ${doc.pageCount()} pages`);

Rust

use pdf_oxide::PdfDocument;

let mut doc = PdfDocument::open("report.pdf")?;
let (major, minor) = doc.version();
println!("PDF {}.{}", major, minor);
println!("Pages: {}", doc.page_count()?);

Довідник API

version() -> (u8, u8)

Отримати версію PDF із заголовка файлу.

Повертає: кортеж (major, minor), наприклад (1, 7) для PDF 1.7 або (2, 0) для PDF 2.0.


catalog() -> Result<Object>

Отримати словник catalog документа. Catalog — це корінь ієрархії об’єктів PDF, що містить посилання на дерево сторінок, закладки, імена та інші структури рівня документа.

Rust

let mut doc = PdfDocument::open("report.pdf")?;
let catalog = doc.catalog()?;
if let Some(dict) = catalog.as_dict() {
    for (key, _) in dict {
        println!("Catalog key: {}", key);
    }
}

trailer() -> &Object

Отримати словник trailer документа. Trailer містить розташування таблиці перехресних посилань, ідентифікатор документа, посилання на словник шифрування та посилання на словник info.

Rust

let doc = PdfDocument::open("report.pdf")?;
let trailer = doc.trailer();
println!("Trailer: {:?}", trailer);

XmpExtractor::extract(doc) -> Result<Option<XmpMetadata>>

Видобути метадані XMP (Extensible Metadata Platform) з потоку метаданих документа. XMP надає багатші метадані, ніж традиційний словник Info, використовуючи стандартні простори імен XML.

Параметр Тип Опис
doc &mut PdfDocument PDF-документ

Повертає: Some(XmpMetadata), якщо дані XMP присутні, інакше None.

Поля XmpMetadata

Простір імен Dublin Core (dc:)

Поле Тип Опис
dc_title Option<String> Назва документа
dc_creator Vec<String> Список авторів/творців
dc_description Option<String> Опис документа
dc_subject Vec<String> Ключові слова теми
dc_language Option<String> Мова документа (наприклад, "en-US")
dc_rights Option<String> Заява про авторські права
dc_format Option<String> MIME-формат (наприклад, "application/pdf")

Простір імен XMP Core (xmp:)

Поле Тип Опис
xmp_creator_tool Option<String> Інструмент, яким створено документ
xmp_create_date Option<String> Дата створення (ISO 8601)
xmp_modify_date Option<String> Дата останньої зміни
xmp_metadata_date Option<String> Дата зміни метаданих

Простір імен PDF (pdf:)

Поле Тип Опис
pdf_producer Option<String> Застосунок-виробник PDF
pdf_keywords Option<String> Рядок ключових слів
pdf_version Option<String> Версія PDF з XMP (може відрізнятися від заголовка)
pdf_trapped Option<String> Статус trapping

Простір імен XMP Rights (xmpRights:)

Поле Тип Опис
xmp_rights_usage_terms Option<String> Умови використання
xmp_rights_marked Option<bool> Чи позначено правами
xmp_rights_web_statement Option<String> URL вебзаяви

Інше

Поле Тип Опис
custom HashMap<String, String> Власні властивості (namespace:property у значення)
raw_xml Option<String> Оригінальний XML-пакет XMP

Rust

use pdf_oxide::extractors::xmp::XmpExtractor;

let mut doc = PdfDocument::open("report.pdf")?;
if let Some(xmp) = XmpExtractor::extract(&mut doc)? {
    if let Some(title) = &xmp.dc_title {
        println!("Title: {}", title);
    }
    for creator in &xmp.dc_creator {
        println!("Author: {}", creator);
    }
    if let Some(tool) = &xmp.xmp_creator_tool {
        println!("Created with: {}", tool);
    }
    if let Some(date) = &xmp.xmp_create_date {
        println!("Created: {}", date);
    }
    if let Some(producer) = &xmp.pdf_producer {
        println!("Producer: {}", producer);
    }
}

WASM

const doc = new WasmPdfDocument(bytes);
const xmp = doc.xmpMetadata();

if (xmp) {
  console.log(`Title: ${xmp.dc_title}`);
  console.log(`Authors: ${xmp.dc_creator}`);
  console.log(`Created with: ${xmp.xmp_creator_tool}`);
  console.log(`Created: ${xmp.xmp_create_date}`);
  console.log(`Producer: ${xmp.pdf_producer}`);
}
doc.free();

Python

doc = PdfDocument("report.pdf")
xmp = doc.xmp_metadata()

if xmp:
    print(f"Title: {xmp.get('dc_title')}")
    print(f"Authors: {xmp.get('dc_creator')}")
    print(f"Created with: {xmp.get('xmp_creator_tool')}")
    print(f"Created: {xmp.get('xmp_create_date')}")
    print(f"Producer: {xmp.get('pdf_producer')}")

<!-- Node.js: no equivalent on PdfDocumentImpl — xmp metadata not exposed in js/src/index.ts -->

Go

doc, _ := pdfoxide.Open("report.pdf")
defer doc.Close()
xmp, _ := doc.XmpMetadata() // returns JSON string
fmt.Println(xmp)

C#

using var doc = PdfDocument.Open("report.pdf");
var xmp = doc.GetXmpMetadata(); // returns JSON string
Console.WriteLine(xmp);

Зручні методи Pdf

Високорівневий API Pdf надає скорочені методи для поширених запитів метаданих.

xmp_metadata() -> Result<Option<XmpMetadata>>

Отримати повний об’єкт метаданих XMP.

xmp_title() -> Result<Option<String>>

Отримати лише назву документа з XMP.

xmp_creators() -> Result<Vec<String>>

Отримати список творців/авторів з XMP.

Rust

use pdf_oxide::api::Pdf;

let mut pdf = Pdf::open("report.pdf")?;

if let Some(title) = pdf.xmp_title()? {
    println!("Title: {}", title);
}

let creators = pdf.xmp_creators()?;
for creator in &creators {
    println!("Author: {}", creator);
}

PageLabelExtractor::extract(doc) -> Result<Vec<PageLabelRange>>

Видобути визначення міток сторінок із документа. Мітки сторінок визначають, як відображаються номери сторінок (наприклад, римські цифри для початкових сторінок, арабські цифри для основного тексту).

Параметр Тип Опис
doc &mut PdfDocument PDF-документ

Повертає: вектор визначень PageLabelRange.

Поля PageLabelRange

Поле Тип Опис
start_page usize Індекс першої сторінки, до якої застосовується цей діапазон
style PageLabelStyle Стиль нумерації
prefix Option<String> Рядок префікса мітки
start_number u32 Початковий номер для цього діапазону

Варіанти PageLabelStyle

Варіант Опис Приклад
DecimalArabic Арабські цифри 1, 2, 3
UppercaseRoman Великі римські I, II, III
LowercaseRoman Малі римські i, ii, iii
UppercaseLetters Великі літери A, B, C
LowercaseLetters Малі літери a, b, c
None Без нумерації (лише префікс)

Зручні методи Pdf для міток сторінок

page_labels() -> Result<Vec<PageLabelRange>>

Отримати всі визначення діапазонів міток сторінок.

page_label(page) -> Result<String>

Отримати відображувану мітку для конкретного індексу сторінки.

Rust

use pdf_oxide::api::Pdf;

let mut pdf = Pdf::open("book.pdf")?;

// Get all label ranges
let ranges = pdf.page_labels()?;
for range in &ranges {
    println!(
        "Pages from {}: {:?} style, prefix={:?}, start={}",
        range.start_page, range.style, range.prefix, range.start_number
    );
}

// Get label for a specific page
let label = pdf.page_label(0)?;
println!("Page 0 label: {}", label); // e.g., "i" or "Cover"

WASM

const doc = new WasmPdfDocument(bytes);
const labels = doc.pageLabels();

for (const range of labels) {
  console.log(`Pages from ${range.start_page}: style=${range.style}, prefix=${range.prefix}`);
}
doc.free();

Python

doc = PdfDocument("book.pdf")
labels = doc.page_labels()

for range in labels:
    print(f"Pages from {range['start_page']}: style={range['style']}, prefix={range['prefix']}")

<!-- Node.js: no equivalent on PdfDocumentImpl — pageLabels not exposed on class, only via properties mixin -->

Go

doc, _ := pdfoxide.Open("book.pdf")
defer doc.Close()
labels, _ := doc.PageLabels() // returns JSON string
fmt.Println(labels)

C#

using var doc = PdfDocument.Open("book.pdf");
var labels = doc.GetPageLabels(); // returns JSON string
Console.WriteLine(labels);

Розширені приклади

Відображення повних метаданих документа

use pdf_oxide::PdfDocument;
use pdf_oxide::extractors::xmp::XmpExtractor;

let mut doc = PdfDocument::open("report.pdf")?;

// Basic info
let (major, minor) = doc.version();
println!("PDF Version: {}.{}", major, minor);
println!("Pages: {}", doc.page_count()?);

// XMP metadata
if let Some(xmp) = XmpExtractor::extract(&mut doc)? {
    println!("\nXMP Metadata:");
    println!("  Title:       {:?}", xmp.dc_title);
    println!("  Authors:     {:?}", xmp.dc_creator);
    println!("  Description: {:?}", xmp.dc_description);
    println!("  Keywords:    {:?}", xmp.pdf_keywords);
    println!("  Creator:     {:?}", xmp.xmp_creator_tool);
    println!("  Producer:    {:?}", xmp.pdf_producer);
    println!("  Created:     {:?}", xmp.xmp_create_date);
    println!("  Modified:    {:?}", xmp.xmp_modify_date);
    println!("  Language:    {:?}", xmp.dc_language);
    println!("  Rights:      {:?}", xmp.dc_rights);

    if !xmp.custom.is_empty() {
        println!("\n  Custom properties:");
        for (key, value) in &xmp.custom {
            println!("    {}: {}", key, value);
        }
    }
}

Доступ до сирого XML XMP

use pdf_oxide::extractors::xmp::XmpExtractor;

let mut doc = PdfDocument::open("report.pdf")?;
if let Some(xmp) = XmpExtractor::extract(&mut doc)? {
    if let Some(xml) = &xmp.raw_xml {
        std::fs::write("metadata.xml", xml)?;
        println!("Raw XMP saved ({} bytes)", xml.len());
    }
}

Генерування рядків відображення номерів сторінок

use pdf_oxide::api::Pdf;

let mut pdf = Pdf::open("thesis.pdf")?;
let page_count = pdf.page_count()?;

for i in 0..page_count {
    let label = pdf.page_label(i)?;
    println!("Physical page {} -> display label '{}'", i + 1, label);
}
// Example output:
//   Physical page 1 -> display label 'i'
//   Physical page 2 -> display label 'ii'
//   Physical page 3 -> display label 'iii'
//   Physical page 4 -> display label '1'
//   Physical page 5 -> display label '2'

Пов’язані сторінки