כיצד לעבוד עם אנוטציות ב-TypeScript

כיצד לעבוד עם אנוטציות ב-TypeScript

מדריך זה מציג כיצד להוסיף, לשטוח ולחפש סימוני PDF באמצעות Aspose.PDF FOSS עבור TypeScript. המחלקה Page חושפת שיטה Add* אחת לכל תת-סוג של סימון — סימון (הדגשה, קו תחתון, קו חוצה, קו משולב), צורות (ריבוע, מעגל, קו, פוליגון, דיו), טקסט (פתק דביק, טקסט חופשי), וקישורים — שכל אחת מחזירה מצביע Annotation מסוג שיכול להיקרא חזרה או להיות משטוח מאוחר יותר. נדרש Node.js 22 או גרסה מאוחר יותר.

מדריך שלב-אחר-שלב

שלב 1: התקנת החבילה

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run build

אמת את ההתקנה על-ידי ייבוא המחלקה Document בקובץ TypeScript חדש — שורה זו צריכה להיפתר ללא שגיאה לאחר שהחבילה מותקנת:

import { Document } from '@asposefoss/pdf';

שלב 2: ייבוא המחלקות הדרושות

ייבא Document כדי לפתוח את הקובץ וPage לחתימות סוגי ההערות המשמשות בשלבים למטה:

import { Document, Page } from '@asposefoss/pdf';

שלב 3: הוסף הערות סימון

Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() ו-Page.AddStrikeOut() כולם מקבלים מערך quads — קוודרופל של 8 מספרים (x1,y1,x2,y2,x3,y3,x4,y4) לכל אזור טקסט מודגש — בנוסף ל-color ו-contents אופציונלי. הספרייה מייצרת את זרם המראה (/AP) לכל ארבעת תתי-הסוגים באופן אוטומטי:

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');

שלב 4: הוסף צורות והערות דיו

Page.AddSquare() ו-Page.AddCircle() מקבלים rect תוחם בנוסף ל-color (קו) ו-fill אופציונלי. Page.AddLine() מקבל line של 4 מספרים (x1,y1,x2,y2) וסיומות חץ אופציונליות. Page.AddInk() מקבל paths — מערך של מערכי נקודות משטחים, אחד לכל משיכת עט:

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,
});

שלב 5: הוסף פתק דביק וטקסט חופשי

Page.AddTextNote() מציב סמל שניתן ללחוץ עליו הפותח חלון קופץ של תגובה. Page.AddFreeText() מצייר טקסט ישירות על הדף בתוך rect שלו:

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,
});

שלב 6: הפשט הערה לתוכן סטטי

כל ידית של הערה שמוחזרת בקריאת Add* כוללת שיטה Flatten() שמטמיעה את מראה ההערה בזרם התוכן של העמוד ומסירה אותה מ-/Annots. לאחר השטחה אין עוד דבר שניתן ללחוץ עליו או לערוך בתצוגה:

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

שלב 7: חיפוש טקסט של ההערה

Page.SearchAnnotationText() and Page.SearchAnnotations() אינם חופפים בשני הכיוונים: SearchAnnotationText() מתאים למטא-נתוני ההסבר המילוליים (/Contents, /T, /Subj), בעוד ש SearchAnnotations() מתאים ל rendered הטקסט של הסימונים המסומנים כגון 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);

בעיות נפוצות ותיקונים

Page.AddHighlight() (או שיטת סימון אחרת) מצייר במקום הלא נכון. quads הוא מערך שטוח של 8 מספרים (x1,y1,x2,y2,x3,y3,x4,y4), ולא a rect — העברת מלבן בעל 4 מספרים מייצרת קווגון דגומתי או חסר. בנה קווגון אחד לכל שורה של טקסט מודגש.

ההערה המשטחת עדיין ניתנת ללחיצה. Flatten() חייב להתקרא על האובייקט המוחזר על ידי ה Add* קריאה, והמסמך חייב להישמר (doc.WriteTo() / doc.Save()) לאחר השטחה — השינוי קיים רק בזיכרון עד שהקובץ נכתב חזרה.

SearchAnnotationText() מחזיר ללא תוצאות למרות שהטקסט נראה בעמוד. הוא מחפש רק שדות מטא-נתונים של ההערה (/Contents, /T, /Subj) — טקסט סימון נראה שנוצר מהמראה של ההערה עצמה (למשל a FreeText body) נמצא על-ידי SearchAnnotations() במקום זאת, ואף אחד מהם אינו מחפש תוכן דף רגיל (השתמש Page.GetText() or Page.Search() בשביל זה).

סימוני מחיקה אינם מופיעים בעת חיפוש הערות. Page.AddRedact() יוצר RedactAnnotation, תת-סוג נפרד מהסימונים/הצורות/הטקסטים המתוארים כאן — ראה את Redaction מדריך.

שאלות נפוצות

כמה תתי-סוגי הערות Page תומך?

הספרייה מייצרת הופעות לסימון (highlight, underline, strikeout, squiggly), צורות (square, circle, line, polygon, ink), טקסט (sticky note, free text), קישורים וחותמות — וכן הערות קבצים מצורפים והערות מחיקה, המכוסות במדריכי how-to שלהם.

האם אני יכול לקרוא הערות שכבר קיימות בעמוד?

כן — Page.Annotations מחזיר את ההערות הקיימות כמערך של typed handles שניתן לבחון, לערוך או לשטוח, ו-Page.RemoveAnnotation(a) מסיר אחת.

מה ההבדל בין שיטוח הערה ליישום מחיקה?

Flatten() מטמיע את appearance לתוך העמוד ומסיר את אובייקט ההערה, אך כל טקסט או תוכן תמונה מתחתיו נשאר ללא שינוי. ApplyRedactions() מכתוב באופן הרסני את זרם התוכן כך שהתוכן המכוסה נעלם — ראה את מדריך המחיקה לפרטים.

האם ההערות נשמרות במהלך סיבוב שמירה/פתיחה?

כן — ההערות שנוספו לפני doc.WriteTo() / doc.Save() נכתבות לתוך ה-PDF ונקראות בחזרה כראוי ב-Document.Open() / Document.OpenFile() הבא.

ראה גם

 עברית