Cara Bekerja dengan Anotasi di TypeScript
Panduan ini menunjukkan cara menambahkan, meratakan, dan mencari anotasi PDF dengan Aspose.PDF FOSS untuk TypeScript. Kelas Page menyediakan satu metode Add* per subtipe anotasi — markup (highlight, underline, strikeout, squiggly), shapes (square, circle, line, polygon, ink), text (sticky note, free text), dan links — masing-masing mengembalikan handle Annotation yang bertipe yang dapat dibaca kembali atau diratakan kemudian. Memerlukan Node.js 22 atau lebih baru.
Panduan Langkah demi Langkah
Langkah 1: Instal Paket
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run buildVerifikasi instalasi dengan mengimpor kelas Document ke dalam file TypeScript baru — baris ini seharusnya terurai tanpa error setelah paket terinstal:
import { Document } from '@asposefoss/pdf';Langkah 2: Impor Kelas yang Diperlukan
Impor Document untuk membuka file dan Page untuk tanda tangan tipe anotasi yang digunakan dalam langkah-langkah di bawah ini:
import { Document, Page } from '@asposefoss/pdf';Langkah 3: Tambahkan Anotasi Markup
Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly(), dan Page.AddStrikeOut() semuanya menerima array quads — satu kuad 8 angka (x1,y1,x2,y2,x3,y3,x4,y4) per wilayah teks yang disorot — plus sebuah color dan contents opsional. Perpustakaan menghasilkan aliran tampilan (/AP) untuk keempat subtipe secara otomatis:
import { Document } from '@asposefoss/pdf';
const doc = Document.OpenFile('input.pdf');
const page = doc.Pages[0];
page.AddHighlight({
quads: [72, 700, 300, 700, 72, 685, 300, 685],
color: [1, 1, 0],
contents: 'Yellow highlight',
});
page.AddUnderline({
quads: [72, 660, 300, 660, 72, 645, 300, 645],
color: [0, 0, 1],
});
page.AddStrikeOut({
quads: [72, 620, 300, 620, 72, 605, 300, 605],
color: [1, 0, 0],
});
doc.WriteTo('annotated.pdf');Langkah 4: Tambahkan Anotasi Bentuk dan Tinta
Page.AddSquare() dan Page.AddCircle() menerima sebuah rect pembatas plus color (stroke) dan fill opsional. Page.AddLine() menerima line 4 angka (x1,y1,x2,y2) dan ujung panah opsional. Page.AddInk() menerima paths — sebuah array dari array pasangan titik datar, satu per goresan pena:
page.AddSquare({ rect: [100, 500, 220, 560], color: [0.8, 0, 0], fill: [1, 1, 0.5], width: 2 });
page.AddCircle({ rect: [250, 500, 370, 560], color: [0, 0.5, 0], width: 2 });
page.AddLine({
line: [100, 470, 370, 470],
color: [0, 0, 0.7],
width: 2,
startEnding: 'OpenArrow',
endEnding: 'ClosedArrow',
});
page.AddInk({
paths: [[100, 400, 130, 430, 160, 390, 190, 420]],
color: [0.6, 0, 0.6],
width: 2,
});Langkah 5: Tambahkan Catatan Tempel dan Teks Bebas
Page.AddTextNote() menempatkan ikon yang dapat diklik yang membuka popup komentar. Page.AddFreeText() menggambar teks langsung di halaman di dalam rectnya:
page.AddTextNote({
rect: [400, 700, 420, 720],
icon: 'Note',
author: 'Reviewer',
contents: 'This is a sticky-note annotation.',
});
page.AddFreeText({
rect: [400, 600, 550, 660],
contents: 'FreeText sample',
fontSize: 10,
align: 'center',
fill: [1, 1, 0.8],
width: 1,
});Langkah 6: Meratakan Anotasi menjadi Konten Statis
Setiap handle anotasi yang dikembalikan oleh panggilan Add* memiliki metode Flatten() yang memasukkan tampilan anotasi ke dalam aliran konten halaman dan menghapusnya dari /Annots. Setelah dipipihkan tidak ada lagi yang dapat diklik atau diedit dalam penampil:
const note = page.AddFreeText({
rect: [210, 535, 470, 590],
contents: 'Sticky note — flattened into the page.',
fontSize: 11,
align: 'left',
});
note.Flatten(); // -> boolean; bakes the annotation, unwires itself from /Annots
Langkah 7: Cari Teks Anotasi
Page.SearchAnnotationText() and Page.SearchAnnotations() saling terpisah dalam kedua arah: SearchAnnotationText() mencocokkan metadata anotasi literal (/Contents, /T, /Subj), sementara SearchAnnotations() mencocokkan rendered teks anotasi markup seperti FreeText:
const metadataHits = page.SearchAnnotationText('confidential');
for (const hit of metadataHits) {
console.log(hit.key, hit.value); // e.g. 'Contents', 'confidential'
}
const renderedHits = page.SearchAnnotations('confidential');
console.log(renderedHits.length);Masalah Umum dan Solusinya
Page.AddHighlight() (atau metode markup lain) menggambar di tempat yang salah. quads adalah array datar 8 angka (x1,y1,x2,y2,x3,y3,x4,y4), bukan sebuah rect — memberikan sebuah persegi empat dengan empat angka menghasilkan quad yang degenerate atau hilang. Buat satu quad per baris teks yang disorot.
Anotasi yang diratakan masih dapat diklik. Flatten() harus dipanggil pada objek yang dikembalikan oleh Add* panggilan, dan dokumen harus disimpan (doc.WriteTo() / doc.Save()) setelah perataan — perubahan hanya ada di memori sampai file ditulis kembali.
SearchAnnotationText() mengembalikan tidak ada hasil meskipun teks terlihat di halaman. Ia hanya mencari bidang metadata anotasi (/Contents, /T, /Subj) — teks markup yang terlihat yang dihasilkan dari tampilan sendiri anotasi (misalnya sebuah FreeText body) ditemukan oleh SearchAnnotations() sebaliknya, dan tidak ada yang mencari konten halaman biasa (gunakan Page.GetText() or Page.Search() untuk itu).
Tanda Redaction tidak muncul saat mencari anotasi. Page.AddRedact() membuat sebuah RedactAnnotation, subtipe yang berbeda dari anotasi markup/shape/text yang dibahas di sini — lihat Redaction panduan.
Pertanyaan yang Sering Diajukan
Berapa banyak subtipe anotasi yang didukung oleh Page?
Perpustakaan menghasilkan tampilan untuk markup (highlight, underline, strikeout, squiggly), shapes (square, circle, line, polygon, ink), text (sticky note, free text), links, dan stamps — plus file attachment dan redaction annotations, yang dibahas dalam panduan cara-caranya masing-masing.
Apakah saya dapat membaca anotasi yang sudah ada di halaman?
Ya — Page.Annotations mengembalikan anotasi yang ada sebagai array penangan bertipe yang dapat Anda periksa, edit, atau flatten, dan Page.RemoveAnnotation(a) menghapus satu.
Apa perbedaan antara flattening sebuah anotasi dan menerapkan redaction?
Flatten() menyematkan anotasi appearance ke dalam halaman dan menghapus objek anotasi, tetapi teks atau konten gambar apa pun di bawahnya tidak tersentuh. ApplyRedactions() menulis ulang aliran konten secara destruktif sehingga konten yang ditutupi hilang — lihat Redaction guide untuk detail.
Apakah anotasi tetap terjaga melalui proses simpan/buka berulang?
Ya — anotasi yang ditambahkan sebelum doc.WriteTo() / doc.Save() ditulis ke dalam PDF dan dibaca kembali dengan benar pada Document.Open() / Document.OpenFile() berikutnya.