Редагування анотацій
PDF Oxide надає доступ на рівні DOM до анотацій через об’єкт PdfPage. Ви можете читати існуючі анотації, додавати нові (посилання, виділення, нотатки), змінювати властивості анотацій, видаляти анотації та згладжувати їх у вміст сторінки.
Отримання анотацій
Перелічити всі анотації
from pdf_oxide import PdfDocument
doc = PdfDocument("annotated.pdf")
page = doc.page(0)
for ann in page.annotations():
print(f"Type: {ann.subtype}")
print(f"Rect: {ann.rect}")
if ann.contents:
print(f"Contents: {ann.contents}")
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
const annotations = doc.getAnnotations(0);
for (const ann of annotations) {
console.log(`Type: ${ann.subtype}`);
console.log(`Rect: ${JSON.stringify(ann.rect)}`);
if (ann.contents) {
console.log(`Contents: ${ann.contents}`);
}
}
doc.free();
use pdf_oxide::api::Pdf;
let mut doc = Pdf::open("annotated.pdf")?;
let page = doc.page(0)?;
for ann in page.annotations() {
println!("Type: {:?}", ann.subtype());
println!("Rect: {:?}", ann.rect());
if let Some(contents) = ann.contents() {
println!("Contents: {}", contents);
}
if let Some(color) = ann.color() {
println!("Color: {:?}", color);
}
}
Доступ за індексом
let page = doc.page(0)?;
if let Some(ann) = page.annotation(0) {
println!("First annotation: {:?}", ann.subtype());
}
println!("Total annotations: {}", page.annotation_count());
Знайти анотації
За ID
let page = doc.page(0)?;
let id = page.annotations()[0].id();
if let Some(ann) = page.find_annotation(id) {
println!("Found: {:?}", ann.subtype());
}
За областю
Пошук анотацій у прямокутній області.
use pdf_oxide::geometry::Rect;
let page = doc.page(0)?;
let region = Rect::new(0.0, 700.0, 612.0, 92.0);
let top_annotations = page.find_annotations_in_region(region);
for ann in top_annotations {
println!("Annotation in header area: {:?}", ann.subtype());
}
За типом
use pdf_oxide::AnnotationSubtype;
let page = doc.page(0)?;
let highlights = page.find_annotations_by_type(AnnotationSubtype::Highlight);
println!("Found {} highlights", highlights.len());
Додавання анотацій
Додавання посилання
doc = PdfDocument("input.pdf")
page = doc.page(0)
# Add a clickable URL link
page.add_link(100, 700, 150, 12, "https://example.com")
doc.save_page(page)
doc.save("with-link.pdf")
use pdf_oxide::api::Pdf;
use pdf_oxide::writer::LinkAnnotation;
use pdf_oxide::geometry::Rect;
let mut doc = Pdf::open("input.pdf")?;
let mut page = doc.page(0)?;
let link = LinkAnnotation::uri(
Rect::new(100.0, 700.0, 150.0, 12.0),
"https://example.com"
);
page.add_annotation(link);
doc.save_page(page)?;
doc.save("with-link.pdf")?;
Додавання виділення тексту
doc = PdfDocument("input.pdf")
page = doc.page(0)
# Yellow highlight
page.add_highlight(100, 700, 200, 12, (1.0, 1.0, 0.0))
doc.save_page(page)
doc.save("highlighted.pdf")
use pdf_oxide::writer::TextMarkupAnnotation;
use pdf_oxide::TextMarkupType;
use pdf_oxide::geometry::Rect;
let mut doc = Pdf::open("input.pdf")?;
let mut page = doc.page(0)?;
let highlight = TextMarkupAnnotation::from_rect(
TextMarkupType::Highlight,
Rect::new(100.0, 700.0, 200.0, 12.0),
).with_color(1.0, 1.0, 0.0); // Yellow
page.add_annotation(highlight);
doc.save_page(page)?;
doc.save("highlighted.pdf")?;
Додавання липкої нотатки
doc = PdfDocument("input.pdf")
page = doc.page(0)
page.add_note(50, 750, "Review this section before publishing.")
doc.save_page(page)
doc.save("with-notes.pdf")
use pdf_oxide::writer::TextAnnotation;
use pdf_oxide::geometry::Rect;
let mut doc = Pdf::open("input.pdf")?;
let mut page = doc.page(0)?;
let note = TextAnnotation::new(
Rect::new(50.0, 750.0, 24.0, 24.0),
"Review this section before publishing."
);
page.add_annotation(note);
doc.save_page(page)?;
doc.save("with-notes.pdf")?;
Видалення анотацій
Видалення за індексом
doc = PdfDocument("input.pdf")
page = doc.page(0)
# Remove the first annotation
page.remove_annotation(0)
doc.save_page(page)
doc.save("cleaned.pdf")
let mut page = doc.page(0)?;
page.remove_annotation(0); // Returns Option<AnnotationWrapper>
doc.save_page(page)?;
Видалення за ID
let mut page = doc.page(0)?;
// Get the ID of an annotation to remove
let ann_id = page.annotations()[0].id();
page.remove_annotation_by_id(ann_id);
doc.save_page(page)?;
doc.save("cleaned.pdf")?;
Зміна анотацій
Отримайте змінюваний доступ до анотацій, щоб змінити їхні властивості.
let mut page = doc.page(0)?;
// Modify annotations through mutable access
for ann in page.annotations_mut() {
// Change contents text
ann.set_contents("Updated comment");
// Change position
ann.set_rect(pdf_oxide::geometry::Rect::new(100.0, 700.0, 200.0, 20.0));
// Change color
ann.set_color(1.0, 0.0, 0.0); // Red
}
doc.save_page(page)?;
doc.save("modified.pdf")?;
Зміна конкретної анотації
let mut page = doc.page(0)?;
if let Some(ann) = page.annotation_mut(0) {
ann.set_contents("First annotation - updated");
}
doc.save_page(page)?;
Змінюваний пошук
let mut page = doc.page(0)?;
let target_id = page.annotations()[0].id();
if let Some(ann) = page.find_annotation_mut(target_id) {
ann.set_contents("Found and updated");
ann.set_color(0.0, 1.0, 0.0); // Green
}
doc.save_page(page)?;
Згладжування анотацій
Згладжування рендерить потоки зовнішнього вигляду анотацій у вміст сторінки та видаляє об’єкти анотацій. Це робить анотації постійними та нередагованими.
Згладжування однієї сторінки
doc = PdfDocument("annotated.pdf")
doc.flatten_page_annotations(0)
doc.save("flat.pdf")
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
doc.flattenPageAnnotations(0);
const output = doc.save();
doc.free();
let mut editor = DocumentEditor::open("annotated.pdf")?;
editor.flatten_page_annotations(0)?;
editor.save("flat.pdf")?;
Згладжування всіх анотацій
doc = PdfDocument("annotated.pdf")
doc.flatten_all_annotations()
doc.save("flat.pdf")
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
doc.flattenAllAnnotations();
const output = doc.save();
doc.free();
let mut editor = DocumentEditor::open("annotated.pdf")?;
editor.flatten_all_annotations()?;
editor.save("flat.pdf")?;
Перевірка та скасування позначки згладжування
doc.flatten_page_annotations(0)
print(doc.is_page_marked_for_flatten(0)) # True
doc.unmark_page_for_flatten(0)
print(doc.is_page_marked_for_flatten(0)) # False
editor.flatten_page_annotations(0)?;
assert!(editor.is_page_marked_for_flatten(0));
editor.unmark_page_for_flatten(0);
assert!(!editor.is_page_marked_for_flatten(0));
Повний довідник API
Методи анотацій PdfPage
| Метод | Повертає | Опис |
|---|---|---|
annotations() |
&[AnnotationWrapper] |
Отримати всі анотації |
annotation(index) |
Option<&AnnotationWrapper> |
Отримати анотацію за індексом |
annotations_mut() |
&mut [AnnotationWrapper] |
Отримати змінювані анотації |
annotation_mut(index) |
Option<&mut AnnotationWrapper> |
Отримати змінювану анотацію за індексом |
annotation_count() |
usize |
Кількість анотацій |
has_annotations_modified() |
bool |
Перевірити, чи анотації було змінено |
add_annotation(ann) |
AnnotationId |
Додати нову анотацію |
remove_annotation(index) |
Option<AnnotationWrapper> |
Видалити за індексом |
remove_annotation_by_id(id) |
Option<AnnotationWrapper> |
Видалити за ID |
find_annotation(id) |
Option<&AnnotationWrapper> |
Знайти за ID |
find_annotation_mut(id) |
Option<&mut AnnotationWrapper> |
Знайти змінювану за ID |
find_annotations_in_region(rect) |
Vec<&AnnotationWrapper> |
Знайти в області |
find_annotations_by_type(subtype) |
Vec<&AnnotationWrapper> |
Знайти за типом |
Властивості AnnotationWrapper
| Метод | Повертає | Опис |
|---|---|---|
id() |
AnnotationId |
Унікальний ідентифікатор |
subtype() |
AnnotationSubtype |
Тип анотації |
rect() |
Rect |
Позиція та розмір |
contents() |
Option<&str> |
Текстовий вміст |
color() |
Option<(f32, f32, f32)> |
RGB-колір |
is_modified() |
bool |
Чи було змінено |
is_new() |
bool |
Чи було додано (не з джерела) |
set_contents(text) |
() |
Задати текстовий вміст |
set_rect(rect) |
() |
Задати позицію/розмір |
set_color(r, g, b) |
() |
Задати RGB-колір |
Методи анотацій DocumentEditor
| Метод | Повертає | Опис |
|---|---|---|
flatten_page_annotations(page) |
Result<()> |
Згладити одну сторінку |
flatten_all_annotations() |
Result<()> |
Згладити всі сторінки |
is_page_marked_for_flatten(page) |
bool |
Перевірити статус згладжування |
unmark_page_for_flatten(page) |
() |
Скасувати незавершене згладжування |
Розширений приклад: процес перегляду анотацій
use pdf_oxide::api::Pdf;
use pdf_oxide::writer::{TextAnnotation, TextMarkupAnnotation};
use pdf_oxide::{AnnotationSubtype, TextMarkupType};
use pdf_oxide::geometry::Rect;
let mut doc = Pdf::open("draft.pdf")?;
let count = doc.page_count()?;
for i in 0..count {
let mut page = doc.page(i)?;
// Find all text containing "TODO"
let todos = page.find_text_containing("TODO");
for t in &todos {
// Add a highlight over the TODO text
let highlight = TextMarkupAnnotation::from_rect(
TextMarkupType::Highlight,
t.bbox(),
).with_color(1.0, 0.5, 0.0); // Orange
page.add_annotation(highlight);
// Add a note next to it
let note = TextAnnotation::new(
Rect::new(t.bbox().x - 30.0, t.bbox().y, 24.0, 24.0),
&format!("TODO found: {}", t.text()),
);
page.add_annotation(note);
}
doc.save_page(page)?;
}
doc.save("reviewed.pdf")?;
Пов’язані сторінки
- Редагування тексту – безпосередня зміна текстового вмісту
- Редагування – приховування вмісту за допомогою анотацій редагування
- Операції зі сторінками – операції на рівні сторінки
- Редагування полів форм – інтерактивні поля форм