Редактирование аннотаций
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 Annotation Methods
| Метод | Возвращает | Описание |
|---|---|---|
annotations() |
&[AnnotationWrapper] |
Получить все аннотации |
annotation(index) |
Option<&AnnotationWrapper> |
Получить аннотацию по индексу |
annotations_mut() |
&mut [AnnotationWrapper] |
Получить изменяемые аннотации |
annotation_mut(index) |
Option<&mut AnnotationWrapper> |
Получить изменяемую аннотацию по индексу |
annotation_count() |
usize |
Количество аннотаций |
has_annotations_modified() |
bool |
Check if annotations were changed |
add_annotation(ann) |
AnnotationId |
Add a new annotation |
remove_annotation(index) |
Option<AnnotationWrapper> |
Remove by index |
remove_annotation_by_id(id) |
Option<AnnotationWrapper> |
Remove by ID |
find_annotation(id) |
Option<&AnnotationWrapper> |
Find by ID |
find_annotation_mut(id) |
Option<&mut AnnotationWrapper> |
Найти изменяемую по ID |
find_annotations_in_region(rect) |
Vec<&AnnotationWrapper> |
Найти в области |
find_annotations_by_type(subtype) |
Vec<&AnnotationWrapper> |
Найти по типу |
AnnotationWrapper Properties
| Метод | Возвращает | Описание |
|---|---|---|
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) |
() |
Set Цвет RGB |
DocumentEditor Annotation Methods
| Метод | Возвращает | Описание |
|---|---|---|
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")?;
Связанные страницы
- Редактирование текста — прямое изменение текстового содержимого
- Замазывание — замазывание содержимого с помощью аннотаций замазывания
- Операции со страницами — операции на уровне страниц
- Редактирование полей форм — интерактивные поля форм