Anotasi dan Formulir
Anotasi dan Formulir
Aspose.PDF FOSS untuk .NET memberi Anda akses baca/tulis penuh ke anotasi PDF
dan bidang AcroForm interaktif. Titik masuk utama untuk anotasi adalahPage.Annotations (sebuah AnnotationCollection), sementara bidang formulir diakses
melalui Document.Form. Kedua subsistem bekerja sepenuhnya dalam memori dan tidak memerlukan
kunci lisensi.
Menambahkan anotasi
AnnotationCollection menyediakan metode pembantu bertipe untuk setiap jenis anotasi standar. Setiap metode menerima Rectangle yang mendefinisikan posisi anotasi pada halaman plus parameter spesifik tipe.
using var doc = Document.Open(pdfBytes);
var page = doc.Pages[1];
// Text (sticky-note) annotation
page.Annotations.AddTextAnnotation(
new Rectangle(72, 720, 200, 740),
contents: "Review this paragraph",
title: "Editor",
open: true);
// Highlight annotation
page.Annotations.AddHighlightAnnotation(
new Rectangle(72, 680, 300, 700),
quadPoints: null,
color: new double[] { 1, 1, 0 });
// Free-text annotation (rendered directly on the page)
page.Annotations.AddFreeTextAnnotation(
new Rectangle(72, 640, 350, 660),
contents: "Inline note",
fontName: "Helvetica",
fontSize: 10,
color: new double[] { 0, 0, 0 });
using var ms = new MemoryStream();
doc.Save(ms);Anotasi tautan dan tindakan
Tautan menggabungkan persegi panjang yang dapat diklik dengan PdfAction. Perpustakaan mendukung tindakan URI, GoTo, JavaScript, Named, dan Launch.
using var doc = Document.Open(pdfBytes);
var page = doc.Pages[1];
// URI link
var uriAction = PdfAction.CreateUri("https://aspose.com");
page.Annotations.AddLinkAnnotation(
new Rectangle(50, 700, 200, 720), uriAction);
// GoTo link (jump to page 3)
page.Annotations.AddLinkAnnotation(
new Rectangle(50, 660, 200, 680),
destinationPage: 3,
destRect: new Rectangle(0, 0, 612, 792));
// JavaScript link
var jsAction = PdfAction.CreateJavaScript("app.alert('Hello');");
page.Annotations.AddLinkAnnotation(
new Rectangle(50, 620, 200, 640), jsAction);
doc.Save("links.pdf");Untuk membaca kembali tautan setelah membuka PDF yang disimpan, cast anotasi ke LinkAnnotation dan periksa properti Uri‑nya atau selesaikan kamus aksi melalui PdfAction.Create.
Markup dan anotasi bentuk
Anotasi markup (highlight, underline, strikeout) menandai teks yang ada. Anotasi bentuk (square, circle, line, ink) menggambar geometri pada halaman.
var page = doc.Pages[1];
// Underline
page.Annotations.AddUnderlineAnnotation(
new Rectangle(72, 600, 300, 620),
quadPoints: null,
color: new double[] { 1, 0, 0 });
// Square
page.Annotations.AddSquareAnnotation(
new Rectangle(72, 540, 200, 580),
borderColor: new double[] { 0, 0, 1 },
fillColor: null,
lineWidth: 1.5);
// Line
page.Annotations.AddLineAnnotation(
new Rectangle(72, 500, 300, 520),
x1: 72, y1: 510, x2: 300, y2: 510,
color: new double[] { 0, 0.5, 0 },
lineWidth: 2);
// Ink (freehand)
page.Annotations.AddInkAnnotation(
new Rectangle(72, 440, 200, 480),
inkPaths: new[] { new double[] { 80, 450, 120, 470, 160, 450 } },
color: new double[] { 0.5, 0, 0.5 },
lineWidth: 1);Anotasi Stempel
Anotasi cap menimpa gambar atau ikon yang telah ditentukan pada halaman.
var stamp = new StampAnnotation(doc);
// Configure stamp properties, then add to page
page.Annotations.Add(stamp);Meratakan anotasi
Panggil Flatten() pada anotasi apa pun untuk membakar tampilan visualnya ke dalam aliran konten halaman dan menghapusnya dari daftar anotasi interaktif.
foreach (var annot in doc.Pages[1].Annotations)
{
annot.Flatten();
}Pola visitor dengan AnnotationSelector
AnnotationSelector mengimplementasikan pola visitor sehingga Anda dapat memfilter anotasi berdasarkan tipe tanpa casting manual.
var selector = new AnnotationSelector();
doc.Pages[1].Accept(selector);
// selector.Selected now contains all annotations on page 1
foreach (var annot in selector.Selected)
{
// Process each annotation by type
}Berikan instance anotasi yang bertipe ke konstruktor untuk memfilter hanya tipe tersebut:
var linkFilter = new AnnotationSelector(new LinkAnnotation(page, Rectangle.Empty));
page.Accept(linkFilter);
// linkFilter.Selected contains only LinkAnnotation instancesBidang formulir interaktif
Akses bidang AcroForm melalui Document.Form. Kelas Form menyediakan operasi baca/tulis tingkat bidang dan mendukung ekspor JSON.
using var doc = Document.Open(pdfBytes);
// Enumerate all fields
foreach (var field in doc.Form.Fields)
{
Console.WriteLine($"{field.FullName}: {field.Value}");
}Subkelas Field meliputi TextBoxField, CheckboxField, RadioButtonField, ComboBoxField, ListBoxField, ChoiceField, dan SignatureField.
Mengekspor data formulir ke JSON
WidgetAnnotation menyediakan overload ExportToJson untuk menyerialkan data bidang ke aliran atau jalur file. Parameter opsional ExportFieldsToJsonOptions mengontrol pemformatan output.
using var doc = Document.Open(pdfBytes);
var widget = (WidgetAnnotation)doc.Pages[1].Annotations[1];
using var jsonStream = new MemoryStream();
widget.ExportToJson(jsonStream);Tips dan Praktik Terbaik
- Selalu tentukan koordinat
Rectanglesecara eksplisit dalam satuan ruang pengguna PDF (1/72 inci). - Gunakan
AddLinkAnnotationdenganPdfActionuntuk fleksibilitas maksimum — URI, GoTo, JavaScript, dan aksi Named semuanya didukung. - Panggil
Flatten()sebelum mendistribusikan PDF jika Anda ingin anotasi muncul di penampil non‑interaktif. - Akses bidang formulir melalui
Document.Form.Fieldsdaripada mengiterasi anotasi halaman — koleksi formulir menangani pengelompokan bidang lintas halaman. - Simpan dan buka kembali dokumen untuk memverifikasi kesetiaan putar‑balik anotasi, terutama untuk aksi khusus.
Masalah Umum
| Issue | Cause | Fix |
|---|---|---|
| Anotasi tidak terlihat setelah disimpan | Persegi panjang memiliki area nol atau berada di luar batas halaman | Verifikasi koordinat berada dalam halaman MediaBox |
LinkAnnotation.Uri mengembalikan null | Tautan menggunakan aksi GoTo atau JavaScript, bukan aksi URI | Selesaikan kamus aksi melalui PdfAction.Create dan periksa ActionType |
| Nilai bidang formulir adalah string kosong | Bidang ada tetapi tidak memiliki entri /V | Periksa field.Value tidak null sebelum diproses |
Flatten() melempar | Anotasi tidak memiliki referensi /P (halaman) | Pastikan anotasi ditambahkan melalui Page.Annotations |
FAQ
Bagaimana cara menambahkan hyperlink ke halaman PDF?
Gunakan page.Annotations.AddLinkAnnotation(rect, PdfAction.CreateUri(url)) untuk membuat tautan URI yang dapat diklik pada persegi panjang yang ditentukan.
Bisakah saya membaca nilai bidang formulir dari PDF yang ada?
Ya. Buka dokumen dengan Document.Open, kemudian iterasi Document.Form.Fields dan baca properti Value pada setiap Field.
Jenis anotasi apa yang didukung oleh perpustakaan?
Perpustakaan mendukung teks, teks bebas, tautan, sorotan, garis bawah, coretan,
persegi, lingkaran, garis, tinta, cap, penunjuk, lampiran-berkas, suara, poligon,
polilin, widget, watermark, dan anotasi 3D. Semua jenis tersedia melalui
AnnotationCollection metode pembantu atau konstruksi langsung.
Bagaimana cara saya memfilter anotasi berdasarkan tipe?
Gunakan AnnotationSelector dengan anotasi templat yang bertipe. Panggil page.Accept(selector)
dan periksa selector.Selected untuk anotasi yang cocok.
Bisakah saya meratakan hanya anotasi tertentu?
Ya. Panggil Flatten() pada setiap instance Annotation secara individual daripada mengiterasi seluruh koleksi.
Ringkasan Referensi API
| Class / Method | Description |
|---|---|
AnnotationCollection | Koleksi bertipe pada setiap Page; menyediakan pembantu Add* untuk semua jenis anotasi |
AnnotationCollection.AddTextAnnotation | Menambahkan anotasi catatan tempel |
AnnotationCollection.AddLinkAnnotation | Menambahkan tautan dengan URI, tujuan halaman, atau aksi khusus |
AnnotationCollection.AddHighlightAnnotation | Menambahkan anotasi sorotan teks |
AnnotationCollection.AddInkAnnotation | Menambahkan anotasi gambar bebas |
AnnotationCollection.AddSquareAnnotation | Menambahkan anotasi bentuk persegi panjang |
AnnotationCollection.AddCircleAnnotation | Menambahkan anotasi bentuk elips |
AnnotationCollection.AddLineAnnotation | Menambahkan anotasi garis |
Annotation.Flatten | Menyematkan tampilan anotasi ke dalam konten halaman |
Annotation.Accept | Mengarahkan ke overload AnnotationSelector.Visit yang bertipe |
AnnotationSelector | Pengunjung yang mengumpulkan anotasi berdasarkan tipe |
LinkAnnotation | Subkelas anotasi yang membawa URI atau aksi |
TextAnnotation | Anotasi catatan tempel |
InkAnnotation | Anotasi gambar bebas dengan jalur goresan |
StampAnnotation | Anotasi lapisan gambar atau ikon |
WidgetAnnotation.ExportToJson | Menyerialkan data bidang formulir ke JSON |
Form | Fasad AcroForm; mengenumerasi dan memanipulasi bidang |
Field | Kelas dasar untuk bidang formulir (TextBoxField, CheckboxField, dll.) |
CheckboxField | Bidang formulir kotak centang |
TextBoxField | Bidang input teks satu baris/banyak baris |
ComboBoxField | Bidang pilihan dropdown |
RadioButtonField | Bidang grup tombol radio |
AnnotationType | Enumerasi jenis anotasi |
PdfAction.CreateUri | Pabrik untuk aksi tautan URI |
PdfAction.CreateJavaScript | Pabrik untuk aksi JavaScript |