คำอธิบายและแบบฟอร์ม
คำอธิบายและแบบฟอร์ม
Aspose.PDF FOSS for .NET ให้การเข้าถึงแบบอ่าน/เขียนเต็มรูปแบบต่อคำอธิบาย PDF และฟิลด์ AcroForm แบบโต้ตอบ จุดเข้าหลักสำหรับคำอธิบายคือ Page.Annotations (เป็น AnnotationCollection) ในขณะที่ฟิลด์ฟอร์มเข้าถึงได้ผ่าน Document.Form. ทั้งสองระบบย่อยทำงานทั้งหมดในหน่วยความจำและไม่ต้องใช้คีย์ใบอนุญาต.
เพิ่มคำอธิบาย
AnnotationCollection เปิดเผยเมธอดช่วยเหลือแบบกำหนดประเภทสำหรับทุกประเภทของคำอธิบายมาตรฐาน. แต่ละเมธอดรับ Rectangle ที่กำหนดตำแหน่งของคำอธิบายบนหน้า พร้อมพารามิเตอร์ที่เฉพาะเจาะจงตามประเภท.
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);หมายเหตุลิงก์และการกระทำ
ลิงก์รวมสี่เหลี่ยมคลิกได้กับ PdfAction. ไลบรารีรองรับการกระทำ URI, GoTo, JavaScript, Named, และ 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");เพื่ออ่านลิงก์กลับหลังจากเปิด PDF ที่บันทึกไว้ ให้แคสต์ annotation เป็น LinkAnnotation และตรวจสอบคุณสมบัติ Uri ของมัน หรือแก้ไขพจนานุกรมการกระทำผ่าน PdfAction.Create.
การทำเครื่องหมายและคำอธิบายรูปร่าง
การทำเครื่องหมาย (highlight, underline, strikeout) ทำเครื่องหมายข้อความที่มีอยู่. การทำเครื่องหมายรูปทรง (square, circle, line, ink) วาดเรขาคณิตบนหน้า.
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);หมายเหตุแสตมป์
การทำเครื่องหมายแสตมป์ซ้อนภาพหรือไอคอนที่กำหนดไว้ล่วงหน้าบนหน้า.
var stamp = new StampAnnotation(doc);
// Configure stamp properties, then add to page
page.Annotations.Add(stamp);ทำให้คำอธิบายแบน
เรียก Flatten() บนหมายเหตุใด ๆ เพื่อบันทึกลักษณะการแสดงผลของมันลงในสตรีมเนื้อหาหน้ากระดาษและลบออกจากรายการหมายเหตุเชิงโต้ตอบ
foreach (var annot in doc.Pages[1].Annotations)
{
annot.Flatten();
}แพทเทิร์น Visitor กับ AnnotationSelector
AnnotationSelector ใช้รูปแบบ visitor เพื่อให้คุณสามารถกรอง annotations ตามประเภทโดยไม่ต้องทำการแคสท์ด้วยตนเอง.
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
}ส่งอินสแตนซ์ของการอธิบายประเภทที่กำหนดให้กับคอนสตรัคเตอร์เพื่อกรองเฉพาะประเภทนั้นเท่านั้น:
var linkFilter = new AnnotationSelector(new LinkAnnotation(page, Rectangle.Empty));
page.Accept(linkFilter);
// linkFilter.Selected contains only LinkAnnotation instancesฟิลด์แบบฟอร์มโต้ตอบ
เข้าถึงฟิลด์ AcroForm ผ่าน Document.Form. คลาส Form เปิดเผยการดำเนินการอ่าน/เขียนระดับฟิลด์และรองรับการส่งออก JSON.
using var doc = Document.Open(pdfBytes);
// Enumerate all fields
foreach (var field in doc.Form.Fields)
{
Console.WriteLine($"{field.FullName}: {field.Value}");
}คลาสย่อยของ Field รวมถึง TextBoxField, CheckboxField, RadioButtonField,
ComboBoxField, ListBoxField, ChoiceField, และ SignatureField.
การส่งออกข้อมูลฟอร์มเป็น JSON
WidgetAnnotation ให้ overload ExportToJson สำหรับการทำซีเรียลไลซ์ข้อมูลฟิลด์ไปยังสตรีมหรือเส้นทางไฟล์ พารามิเตอร์ ExportFieldsToJsonOptions ทางเลือกควบคุมการจัดรูปแบบผลลัพธ์.
using var doc = Document.Open(pdfBytes);
var widget = (WidgetAnnotation)doc.Pages[1].Annotations[1];
using var jsonStream = new MemoryStream();
widget.ExportToJson(jsonStream);เคล็ดลับและแนวทางปฏิบัติที่ดีที่สุด
- ระบุพิกัด
Rectangleอย่างชัดเจนในหน่วยพื้นที่ผู้ใช้ของ PDF (1/72 นิ้ว) - ใช้
AddLinkAnnotationพร้อมกับPdfActionเพื่อความยืดหยุ่นสูงสุด — รองรับ URI, GoTo, JavaScript, และ Named actions ทั้งหมด - เรียก
Flatten()ก่อนแจกจ่าย PDF หากต้องการให้หมายเหตุปรากฏในโปรแกรมดูที่ไม่โต้ตอบ - เข้าถึงฟิลด์ฟอร์มผ่าน
Document.Form.Fieldsแทนการวนลูปหมายเหตุในแต่ละหน้า — คอลเลกชันฟอร์มจัดการการจัดกลุ่มฟิลด์ข้ามหน้า - บันทึกและเปิดเอกสารใหม่เพื่อยืนยันความแม่นยำของการทำซ้ำหมายเหตุ โดยเฉพาะสำหรับการกระทำที่กำหนดเอง
ปัญหาทั่วไป
| Issue | Cause | Fix |
|---|---|---|
| Annotation ไม่ปรากฏหลังจากบันทึก | Rectangle มีพื้นที่ศูนย์หรืออยู่นอกขอบเขตของหน้า | ตรวจสอบให้แน่ใจว่าพิกัดอยู่ภายในหน้า MediaBox |
LinkAnnotation.Uri คืนค่า null | Link ใช้การกระทำ GoTo หรือ JavaScript ไม่ใช่การกระทำ URI | แก้ไขพจนานุกรมการกระทำผ่าน PdfAction.Create และตรวจสอบ ActionType |
| ค่า Form field เป็นสตริงว่าง | ฟิลด์มีอยู่แต่ไม่มีรายการ /V | ตรวจสอบว่า field.Value ไม่เป็น null ก่อนดำเนินการ |
Flatten() เกิดข้อยกเว้น | Annotation ไม่มีการอ้างอิง /P (page) | ตรวจสอบให้แน่ใจว่า annotation ถูกเพิ่มผ่าน Page.Annotations |
คำถามที่พบบ่อย
ฉันจะเพิ่มไฮเปอร์ลิงก์ไปยังหน้าของ PDF อย่างไร?
ใช้ page.Annotations.AddLinkAnnotation(rect, PdfAction.CreateUri(url)) เพื่อสร้างลิงก์ URI ที่คลิกได้บนสี่เหลี่ยมที่ระบุ.
ฉันสามารถอ่านค่าฟิลด์ฟอร์มจาก PDF ที่มีอยู่ได้หรือไม่?
ใช่. เปิดเอกสารด้วย Document.Open, จากนั้นวนซ้ำ Document.Form.Fields และอ่านคุณสมบัติ Value ของแต่ละ Field.
ไลบรารีรองรับประเภทของคำอธิบายอะไรบ้าง?
ไลบรารีรองรับ text, free-text, link, highlight, underline, strikeout,
square, circle, line, ink, stamp, caret, file-attachment, sound, polygon,
polyline, widget, watermark, และ 3D annotations. ประเภททั้งหมดสามารถใช้ได้ผ่าน
AnnotationCollection helper methods หรือการสร้างโดยตรง.
ฉันจะกรองคำอธิบายตามประเภทได้อย่างไร?
ใช้ AnnotationSelector พร้อมกับการระบุเทมเพลตที่มีประเภท. เรียก page.Accept(selector)
และตรวจสอบ selector.Selected สำหรับการระบุที่ตรงกัน.
ฉันสามารถทำให้แบนเฉพาะคำอธิบายที่ต้องการได้หรือไม่?
ใช่. เรียก Flatten() บนแต่ละอินสแตนซ์ของ Annotation แทนการวนซ้ำคอลเลกชันทั้งหมด.
สรุปการอ้างอิง API
| Class / Method | Description |
|---|---|
AnnotationCollection | คอลเลกชันที่มีประเภทบนแต่ละ Page; ให้เครื่องมือช่วยเหลือ Add* สำหรับทุกประเภทของคำอธิบาย |
AnnotationCollection.AddTextAnnotation | เพิ่มคำอธิบายแบบโน้ตติดกาว |
AnnotationCollection.AddLinkAnnotation | เพิ่มลิงก์ด้วย URI, ปลายทางหน้า, หรือการกระทำแบบกำหนดเอง |
AnnotationCollection.AddHighlightAnnotation | เพิ่มคำอธิบายการไฮไลท์ข้อความ |
AnnotationCollection.AddInkAnnotation | เพิ่มคำอธิบายการวาดด้วยมืออิสระ |
AnnotationCollection.AddSquareAnnotation | เพิ่มคำอธิบายรูปสี่เหลี่ยม |
AnnotationCollection.AddCircleAnnotation | เพิ่มคำอธิบายรูปวงรี |
AnnotationCollection.AddLineAnnotation | เพิ่มคำอธิบายเส้น |
Annotation.Flatten | ฝังลักษณะของคำอธิบายลงในเนื้อหาหน้า |
Annotation.Accept | ส่งต่อไปยังการโอเวอร์โหลด AnnotationSelector.Visit ที่มีประเภท |
AnnotationSelector | ผู้เยี่ยมชมที่รวบรวมคำอธิบายตามประเภท |
LinkAnnotation | คลาสย่อยของคำอธิบายที่บรรจุ URI หรือการกระทำ |
TextAnnotation | คำอธิบายแบบโน้ตติดกาว |
InkAnnotation | คำอธิบายการวาดด้วยมืออิสระพร้อมเส้นทางการวาด |
StampAnnotation | คำอธิบายการซ้อนภาพหรือไอคอน |
WidgetAnnotation.ExportToJson | แปลงข้อมูลฟอร์มฟิลด์เป็น JSON |
Form | ฟาซาดของ AcroForm; แสดงรายการและจัดการฟิลด์ |
Field | คลาสฐานสำหรับฟิลด์ฟอร์ม (TextBoxField, CheckboxField, ฯลฯ) |
CheckboxField | ฟิลด์ฟอร์มแบบช่องทำเครื่องหมาย |
TextBoxField | ฟิลด์อินพุตข้อความบรรทัดเดียว/หลายบรรทัด |
ComboBoxField | ฟิลด์ตัวเลือกแบบดรอปดาวน์ |
RadioButtonField | ฟิลด์กลุ่มปุ่มวิทยุ |
AnnotationType | การนับประเภทของคำอธิบาย |
PdfAction.CreateUri | โรงงานสำหรับการกระทำลิงก์ URI |
PdfAction.CreateJavaScript | โรงงานสำหรับการกระทำ JavaScript |