주석 생성
PDF Oxide는 모든 표준 PDF 주석 유형의 생성을 지원합니다. 주석은 FluentPageBuilder(DocumentBuilder API) 또는 PageBuilder(PdfWriter API)를 통해 추가할 수 있습니다.
바인딩 지원 범위(v0.3.38). 15개의
DocumentBuilder/FluentPageBuilder주석 메서드 —link_url/link_page/link_named,highlight,underline,strikeout,squiggly, 스티커 메모, 스탬프(14가지 표준 유형 + 사용자 지정), 자유 텍스트, 워터마크(사용자 지정 / DRAFT / CONFIDENTIAL) — 는 Rust, Python, Node/TypeScript, C#, Go, WASM에서 제공됩니다. 메서드별로 도형을 다루는 저수준PdfWriter인터페이스(ink, polygon, polyline, caret, popup, file-attachment, redact)는 Rust 전용입니다. 다른 바인딩에서는DocumentBuilder를 사용하거나 주석 편집으로 기존 PDF를 편집하세요.
빠른 예제
Rust (DocumentBuilder)
use pdf_oxide::writer::{DocumentBuilder, PageSize, StampType};
let mut builder = DocumentBuilder::new();
builder.page(PageSize::Letter)
.at(72.0, 720.0)
.text("Click here for details")
.link_url("https://example.com")
.text("Important finding")
.highlight((1.0, 1.0, 0.0)) // Yellow highlight
.sticky_note("Review this section carefully")
.stamp(StampType::Approved)
.done();
builder.save("annotated.pdf")?;
Rust (PdfWriter)
use pdf_oxide::writer::PdfWriter;
use pdf_oxide::geometry::Rect;
let mut writer = PdfWriter::new();
{
let mut page = writer.add_letter_page();
page.add_text("Document text", 72.0, 720.0, "Helvetica", 12.0);
page.link(Rect::new(72.0, 720.0, 100.0, 12.0), "https://example.com");
page.highlight_rect(Rect::new(72.0, 700.0, 200.0, 12.0));
page.sticky_note(Rect::new(300.0, 720.0, 24.0, 24.0), "A note");
page.finish();
}
writer.save("annotated.pdf")?;
Python
from pdf_oxide import DocumentBuilder, StampType
pdf = (DocumentBuilder()
.letter_page()
.at(72, 720).text("Click here for details")
.link_url("https://example.com")
.text("Important finding")
.highlight((1.0, 1.0, 0.0))
.sticky_note("Review this section carefully")
.stamp(StampType.APPROVED)
.done()
.save("annotated.pdf"))
Node / TypeScript
import { DocumentBuilder, StampType } from "pdf-oxide";
await new DocumentBuilder()
.letterPage()
.at(72, 720).text("Click here for details")
.linkUrl("https://example.com")
.text("Important finding")
.highlight([1.0, 1.0, 0.0])
.stickyNote("Review this section carefully")
.stamp(StampType.Approved)
.done()
.save("annotated.pdf");
C#
using PdfOxide;
DocumentBuilder.Create()
.LetterPage()
.At(72, 720).Text("Click here for details")
.LinkUrl("https://example.com")
.Text("Important finding")
.Highlight(1.0, 1.0, 0.0)
.StickyNote("Review this section carefully")
.Stamp(StampType.Approved)
.Done()
.Save("annotated.pdf");
Go
builder := pdfoxide.NewDocumentBuilder()
builder.LetterPage().
At(72, 720).Text("Click here for details").
LinkUrl("https://example.com").
Text("Important finding").
Highlight(1.0, 1.0, 0.0).
StickyNote("Review this section carefully").
Stamp(pdfoxide.StampApproved).
Done()
_ = builder.Save("annotated.pdf")
JavaScript (WASM) – 기존 PDF용 주석 단축 메서드
레거시 addLink / addHighlight / addNote 헬퍼는 기존 PDF 편집 용도로 계속 사용할 수 있습니다.
import init, { WasmPdfDocument } from "pdf-oxide-wasm/web";
await init();
const doc = new WasmPdfDocument(bytes);
doc.addLink(0, 100, 200, 300, 50, "https://oxide.fyi");
doc.addHighlight(0, 100, 700, 400, 20);
doc.addNote(0, 50, 750, "Review this section");
const saved = doc.save();
doc.free();
WASM에서 생성 시점에 주석을 추가하려면 DocumentBuilder(위의 Node/TS 예제와 동일한 API)를 사용하세요.
주석 유형
텍스트 주석(스티커 메모)
다양한 아이콘을 가진 팝업 메모입니다.
use pdf_oxide::writer::PdfWriter;
use pdf_oxide::annotation_types::TextAnnotationIcon;
use pdf_oxide::geometry::Rect;
let mut writer = PdfWriter::new();
{
let mut page = writer.add_letter_page();
// Default note icon
page.sticky_note(Rect::new(72.0, 720.0, 24.0, 24.0), "Review this section");
// Comment icon
page.comment(Rect::new(72.0, 690.0, 24.0, 24.0), "Needs clarification");
// Custom icon
page.text_note_with_icon(
Rect::new(72.0, 660.0, 24.0, 24.0),
"Important",
TextAnnotationIcon::Key,
);
page.finish();
}
사용 가능한 아이콘: Note, Comment, Key, Help, NewParagraph, Paragraph, Insert
FluentPageBuilder 등가 코드:
builder.page(PageSize::Letter)
.at(72.0, 720.0)
.sticky_note("Review this")
.sticky_note_with_icon("Important", TextAnnotationIcon::Key)
.sticky_note_at(300.0, 720.0, "Positioned note")
.done();
링크 주석
URL 링크 및 문서 내 페이지 이동.
// URL link
page.link(Rect::new(72.0, 720.0, 150.0, 12.0), "https://example.com");
// Internal page link (0-indexed page number)
page.internal_link(Rect::new(72.0, 700.0, 100.0, 12.0), 2);
FluentPageBuilder:
builder.page(PageSize::Letter)
.at(72.0, 720.0)
.text("Visit website")
.link_url("https://example.com")
.text("Go to appendix")
.link_page(5)
.text("Jump to glossary")
.link_named("glossary")
.done();
FreeText 주석
페이지 표면에 직접 표시되는 텍스트입니다.
use pdf_oxide::geometry::Rect;
// Basic text box
page.textbox(Rect::new(72.0, 650.0, 200.0, 50.0), "Annotation text");
// Styled text box
page.textbox_styled(
Rect::new(72.0, 580.0, 200.0, 50.0),
"Styled text",
"Courier",
14.0,
);
// Centered text
page.textbox_centered(Rect::new(72.0, 520.0, 200.0, 30.0), "Centered");
// Callout with leader line
page.callout(
Rect::new(200.0, 450.0, 150.0, 50.0),
"Callout text",
vec![150.0, 430.0, 200.0, 475.0],
);
// Typewriter (borderless text)
page.typewriter(Rect::new(72.0, 400.0, 300.0, 20.0), "Typewriter text");
FluentPageBuilder:
builder.page(PageSize::Letter)
.freetext(Rect::new(100.0, 600.0, 200.0, 50.0), "Comment text")
.freetext_styled(Rect::new(100.0, 530.0, 200.0, 50.0), "Styled", "Courier", 14.0)
.done();
하이라이트, 밑줄, 취소선, 물결선
검토용 텍스트 마크업 주석입니다.
use pdf_oxide::geometry::Rect;
page.highlight_rect(Rect::new(72.0, 720.0, 200.0, 12.0));
page.underline_rect(Rect::new(72.0, 700.0, 200.0, 12.0));
page.strikeout_rect(Rect::new(72.0, 680.0, 200.0, 12.0));
page.squiggly_rect(Rect::new(72.0, 660.0, 200.0, 12.0));
정밀한 위치 지정을 위해 명시적인 QuadPoints를 사용하는 경우:
page.highlight(
Rect::new(72.0, 720.0, 200.0, 12.0),
vec![[72.0, 732.0, 272.0, 732.0, 72.0, 720.0, 272.0, 720.0]],
);
FluentPageBuilder (색상은 RGB 0.0~1.0):
builder.page(PageSize::Letter)
.at(72.0, 720.0)
.text("Highlighted text")
.highlight((1.0, 1.0, 0.0)) // Yellow
.text("Underlined text")
.underline((0.0, 0.0, 1.0)) // Blue
.text("Deleted text")
.strikeout((1.0, 0.0, 0.0)) // Red
.text("Questionable text")
.squiggly((1.0, 0.5, 0.0)) // Orange
.done();
선 주석
두 점 사이의 선과 화살표입니다.
// Simple line
page.line((100.0, 500.0), (300.0, 500.0));
// Arrow
page.arrow((100.0, 470.0), (300.0, 470.0));
// Double-headed arrow
page.double_arrow((100.0, 440.0), (300.0, 440.0));
도형 주석(사각형, 원)
직사각형과 타원입니다.
use pdf_oxide::geometry::Rect;
// Rectangle outline
page.rectangle(Rect::new(72.0, 400.0, 150.0, 80.0));
// Filled rectangle
page.rectangle_filled(
Rect::new(250.0, 400.0, 150.0, 80.0),
(0.0, 0.0, 1.0), // Blue stroke
(0.8, 0.8, 1.0), // Light blue fill
);
// Circle outline
page.circle(Rect::new(72.0, 300.0, 80.0, 80.0));
// Filled circle
page.circle_filled(
Rect::new(180.0, 300.0, 80.0, 80.0),
(1.0, 0.0, 0.0), // Red stroke
(1.0, 0.9, 0.9), // Light red fill
);
폴리곤 및 폴리라인 주석
닫힌 폴리곤과 열린 폴리라인입니다.
// Closed triangle
page.polygon(vec![(200.0, 250.0), (250.0, 300.0), (150.0, 300.0)]);
// Filled polygon
page.polygon_filled(
vec![(300.0, 250.0), (350.0, 300.0), (250.0, 300.0)],
(0.0, 0.5, 0.0), // Green stroke
(0.8, 1.0, 0.8), // Light green fill
);
// Open polyline (zigzag)
page.polyline(vec![
(72.0, 200.0), (150.0, 230.0), (220.0, 200.0), (300.0, 230.0),
]);
잉크 주석(자유 드로잉)
자유로운 획과 드로잉입니다.
// Single stroke
page.ink(vec![(100.0, 150.0), (120.0, 170.0), (140.0, 150.0), (160.0, 170.0)]);
// Multiple strokes
page.freehand(vec![
vec![(100.0, 100.0), (200.0, 100.0)], // Horizontal line
vec![(150.0, 50.0), (150.0, 150.0)], // Vertical line
]);
// Styled ink
page.ink_styled(
vec![(200.0, 150.0), (250.0, 180.0), (300.0, 150.0)],
(1.0, 0.0, 0.0), // Red
3.0, // 3pt line width
);
스탬프 주석
표준 고무 도장 형태의 주석입니다.
use pdf_oxide::writer::StampType;
use pdf_oxide::geometry::Rect;
page.stamp(Rect::new(400.0, 700.0, 150.0, 50.0), StampType::Approved);
page.stamp_approved(Rect::new(400.0, 640.0, 150.0, 50.0));
page.stamp_draft(Rect::new(400.0, 580.0, 120.0, 40.0));
page.stamp_confidential(Rect::new(400.0, 520.0, 150.0, 50.0));
page.stamp_final(Rect::new(400.0, 460.0, 100.0, 40.0));
page.stamp_not_approved(Rect::new(400.0, 400.0, 150.0, 50.0));
page.stamp_for_comment(Rect::new(400.0, 340.0, 150.0, 50.0));
page.stamp_custom(Rect::new(400.0, 280.0, 150.0, 50.0), "ReviewPending");
StampType 변형: Approved, Experimental, NotApproved, AsIs, Expired, NotForPublicRelease, Confidential, Final, Sold, Departmental, ForComment, TopSecret, Draft, ForPublicRelease, Custom(String)
워터마크 주석
콘텐츠 뒤에 표시되는 페이지 단위 워터마크입니다.
// FluentPageBuilder API
builder.page(PageSize::Letter)
.watermark("DRAFT")
.done();
builder.page(PageSize::Letter)
.watermark_confidential()
.done();
builder.page(PageSize::Letter)
.watermark_draft()
.done();
교정(가림) 주석
가림 처리할 영역을 표시합니다.
use pdf_oxide::geometry::Rect;
page.redact(Rect::new(72.0, 600.0, 200.0, 20.0));
page.redact_with_text(Rect::new(72.0, 570.0, 200.0, 20.0), "REDACTED");
추가 주석 유형
use pdf_oxide::geometry::Rect;
// Popup window
page.popup(Rect::new(200.0, 500.0, 200.0, 100.0), true);
// Caret (text insertion marker)
page.caret(Rect::new(72.0, 450.0, 20.0, 20.0));
page.caret_paragraph(Rect::new(72.0, 420.0, 20.0, 20.0));
page.caret_with_comment(Rect::new(72.0, 390.0, 20.0, 20.0), "Insert paragraph here");
// File attachment
page.file_attachment(Rect::new(72.0, 350.0, 24.0, 24.0), "report.xlsx");
page.file_attachment_paperclip(Rect::new(72.0, 320.0, 24.0, 24.0), "notes.txt");
범용 주석 메서드
범용 add_annotation() 메서드를 사용하면 어떤 주석 유형이든 추가할 수 있습니다.
use pdf_oxide::writer::{LinkAnnotation, Annotation};
use pdf_oxide::geometry::Rect;
let link = LinkAnnotation::uri(
Rect::new(72.0, 720.0, 100.0, 12.0),
"https://example.com",
);
page.add_annotation(link);
고급 예제
주석 종합 쇼케이스
use pdf_oxide::writer::{PdfWriter, StampType};
use pdf_oxide::geometry::Rect;
let mut writer = PdfWriter::new();
{
let mut page = writer.add_letter_page();
// Links
page.add_text("Visit Rust", 72.0, 750.0, "Helvetica", 12.0);
page.link(Rect::new(72.0, 750.0, 70.0, 12.0), "https://rust-lang.org");
// Text markup
page.highlight_rect(Rect::new(72.0, 720.0, 150.0, 12.0));
page.underline_rect(Rect::new(72.0, 700.0, 150.0, 12.0));
page.strikeout_rect(Rect::new(72.0, 680.0, 150.0, 12.0));
page.squiggly_rect(Rect::new(72.0, 660.0, 150.0, 12.0));
// Notes
page.sticky_note(Rect::new(300.0, 720.0, 24.0, 24.0), "Important");
page.comment(Rect::new(340.0, 720.0, 24.0, 24.0), "Review needed");
// Shapes
page.line((72.0, 620.0), (250.0, 620.0));
page.arrow((72.0, 600.0), (250.0, 600.0));
page.rectangle(Rect::new(72.0, 540.0, 100.0, 50.0));
page.circle(Rect::new(200.0, 540.0, 50.0, 50.0));
// Ink
page.ink(vec![(72.0, 500.0), (120.0, 520.0), (170.0, 500.0)]);
// Stamp
page.stamp_approved(Rect::new(400.0, 720.0, 150.0, 50.0));
// Redact
page.redact(Rect::new(72.0, 450.0, 200.0, 15.0));
page.finish();
}
writer.save("annotation_showcase.pdf")?;
관련 페이지
- DocumentBuilder 저수준 API – 주석을 포함한 플루언트 페이지 구성
- 폼 필드 생성 – 대화형 폼 필드
- 그래픽, 패턴 및 셰이딩 – 저수준 드로잉 프리미티브