Метадані та 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'
Пов’язані сторінки
- Видобування тексту – видобування текстового вмісту зі сторінок
- Видобування анотацій – доступ до закладок і анотацій
- Видобування даних форм – видобування даних полів форм