Cách làm việc với Annotations trong TypeScript
Hướng dẫn này chỉ ra cách thêm, làm phẳng và tìm kiếm các chú thích PDF với Aspose.PDF FOSS cho TypeScript. Lớp Page cung cấp một phương thức Add* cho mỗi loại phụ chú — đánh dấu (tô sáng, gạch chân, gạch ngang, gạch gợn), hình dạng (hình vuông, vòng tròn, đường thẳng, đa giác, mực), văn bản (ghi chú dính, văn bản tự do), và liên kết — mỗi phương thức trả về một handle Annotation có kiểu có thể được đọc lại hoặc làm phẳng sau này. Yêu cầu Node.js 22 trở lên.
Hướng dẫn từng bước
Bước 1: Cài đặt gói
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run buildXác minh việc cài đặt bằng cách nhập lớp Document vào một tệp TypeScript mới — dòng này nên được giải quyết mà không có lỗi một khi gói đã được cài đặt:
import { Document } from '@asposefoss/pdf';Bước 2: Nhập các lớp cần thiết
Nhập Document để mở tệp và Page cho các chữ ký kiểu chú thích được sử dụng trong các bước bên dưới:
import { Document, Page } from '@asposefoss/pdf';Bước 3: Thêm chú thích đánh dấu
Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() và Page.AddStrikeOut() đều nhận một mảng quads — một hình tứ giác 8 số (x1,y1,x2,y2,x3,y3,x4,y4) cho mỗi vùng văn bản được đánh dấu — cộng thêm một color và tùy chọn contents. Thư viện tạo luồng hiển thị (/AP) cho cả bốn kiểu phụ một cách tự động:
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');Bước 4: Thêm chú thích Hình dạng và Mực
Page.AddSquare() và Page.AddCircle() nhận một rect bao quanh cộng với color (đường viền) và fill tùy chọn. Page.AddLine() nhận một line gồm 4 số (x1,y1,x2,y2) và các đầu mũi tên tùy chọn. Page.AddInk() nhận paths — một mảng các mảng cặp điểm phẳng, một cho mỗi nét bút:
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,
});Bước 5: Thêm Ghi chú Dán và Văn bản Tự do
Page.AddTextNote() đặt một biểu tượng có thể nhấp được để mở cửa sổ bật lên bình luận. Page.AddFreeText() vẽ văn bản trực tiếp trên trang bên trong rect của nó:
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,
});Bước 6: Làm phẳng một chú thích thành Nội dung tĩnh
Mỗi handle chú thích được trả về bởi một lời gọi Add* có phương thức Flatten() mà nhúng giao diện của chú thích vào luồng nội dung của trang và loại bỏ nó khỏi /Annots. Sau khi làm phẳng, không còn gì để nhấp hoặc chỉnh sửa trong trình xem:
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
Bước 7: Tìm kiếm văn bản chú thích
Page.SearchAnnotationText() and Page.SearchAnnotations() được tách rời nhau ở cả hai hướng: SearchAnnotationText() khớp siêu dữ liệu chú thích nguyên văn (/Contents, /T, /Subj), trong khi SearchAnnotations() khớp với rendered văn bản của các chú thích đánh dấu như 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);Các vấn đề thường gặp và cách khắc phục
Page.AddHighlight() (hoặc một phương pháp đánh dấu khác) được vẽ ở vị trí sai. quads là một mảng phẳng gồm 8 số (x1,y1,x2,y2,x3,y3,x4,y4), không phải là một rect — việc truyền một hình chữ nhật 4 số tạo ra một quad suy biến hoặc thiếu. Tạo một quad cho mỗi dòng văn bản được tô sáng.
Một chú thích đã được làm phẳng vẫn có thể nhấp được. Flatten() phải được gọi trên đối tượng được trả về bởi the Add* gọi, và tài liệu phải được lưu (doc.WriteTo() / doc.Save()) sau khi flattening — thay đổi chỉ tồn tại trong bộ nhớ cho đến khi tệp được ghi lại.
SearchAnnotationText() không trả về kết quả nào mặc dù văn bản hiển thị trên trang. Nó chỉ tìm kiếm các trường siêu dữ liệu chú thích./Contents, /T, /Subj) — văn bản markup có thể hiển thị được tạo ra từ giao diện riêng của chú thích (ví dụ: một FreeText body) được tìm thấy bởi SearchAnnotations() thay vào đó, và cũng không tìm kiếm nội dung trang thông thường (sử dụng Page.GetText() or Page.Search() cho việc đó).
Các dấu che không xuất hiện khi tìm kiếm chú thích. Page.AddRedact() tạo ra một RedactAnnotation, một kiểu phụ biệt so với các chú thích markup/shape/text được đề cập ở đây — xem Redaction hướng dẫn.
Câu hỏi thường gặp
Page hỗ trợ bao nhiêu loại phụ chú thích?
Thư viện tạo ra các appearance cho markup (highlight, underline, strikeout, squiggly), shapes (square, circle, line, polygon, ink), text (sticky note, free text), links và stamps — cộng thêm các chú thích file attachment và redaction, những thứ này được trình bày trong các hướng dẫn cách thực hiện riêng của chúng.
Tôi có thể đọc các chú thích đã tồn tại trên một trang không?
Có — Page.Annotations trả về các chú thích hiện có dưới dạng một mảng các typed handles mà bạn có thể inspect, edit, hoặc flatten, và Page.RemoveAnnotation(a) xóa một.
Sự khác biệt giữa việc flatten một chú thích và việc áp dụng một redaction là gì?
Flatten() tạo ra một chú thích. appearance vào trang và xóa đối tượng chú thích, nhưng bất kỳ nội dung văn bản hoặc hình ảnh nào nằm dưới nó vẫn không bị ảnh hưởng. ApplyRedactions() ghi đè luồng nội dung một cách phá hủy nên nội dung được che phủ bị mất — xem hướng dẫn Redaction để biết chi tiết.
Các chú thích có được bảo tồn qua vòng lưu/mở không?
Có — các chú thích được thêm trước doc.WriteTo() / doc.Save() sẽ được ghi vào PDF và được đọc lại một cách chính xác trong Document.Open() / Document.OpenFile() tiếp theo.