מבוא

הפוסט המבואי מכסה בקצרה את ההסברים: הדגשות, קווים תחתונים, פתקים דביקים וחותמות, שנוספו דרך Page.AddHighlight(), Page.AddUnderline(), ושיטות דומות. זהו חלק קטן ממה ש-Page תומך בפועל — גלריית ההסברים בספרייה זו כוללת סימון, צורות חופשיות, קישורים עם ניווט אמיתי ופעולות שליחת טפסים, וחיפוש, הכל נגיש ישירות מ-Page.

פוסט זה עובר על שאר המשטח הזה: שיטות ההסבר של צורות וחופשיות, מה פעולה של הסבר Link יכולה בפועל לעשות, ושתי הדרכים השונות לחיפוש תוכן ההסבר תלוי האם הטקסט שאתה מחפש נמצא במראה של ההסבר או בהערת /Contents שלו.

כל שיטת הסבר מחזירה מצביע טיפוסי המוגבל להסבר שהיא זה עתה יצרה, וכל הסבר בדף קריא לאחר מכן דרך page.Annotations.


מה נכלל

הסברים מסומנים

Page.AddHighlight(), Page.AddUnderline(), Page.AddSquiggly() ו-Page.AddStrikeOut() כולם מקבלים את אותה צורת אפשרויות — קבוצה של נקודות ריבועיות המסמנות את אזור הטקסט וצבע אופציונלי — וכל ארבעת הפונקציות מחזירות MarkupAnnotation. נקודות הריבוע בדרך כלל נגזרות מחיפוש טקסט או מלוחן טקסט ידוע.

const markup = (body: [number, number, number, number], sample: string,
  add: (quads: number[]) => void): void => {
  const yMid = (body[1] + body[3]) / 2 - 6;
  const textRect: [number, number, number, number] = [body[0] + 4, yMid, body[2] - 4, yMid + 16];
  page.AddText(sample, textRect[0], textRect[1], { fontSize: 12 });
  add(rectToQuads(textRect));
};

markup(cardBody, 'Highlight this phrase', (quads) =>
  page.AddHighlight({ quads, color: [1, 1, 0], contents: 'Yellow highlight' }));
markup(cardBody, 'Underline this phrase', (quads) =>
  page.AddUnderline({ quads, color: [0, 0, 1] }));
markup(cardBody, 'Squiggle this phrase', (quads) =>
  page.AddSquiggly({ quads, color: [1, 0.5, 0] }));
markup(cardBody, 'Strike this phrase out', (quads) =>
  page.AddStrikeOut({ quads, color: [1, 0, 0] }));

הערות וטקסט חופשי

Page.AddTextNote() מוסיף סמל פתק דביק קלאסי שפותח חלון קופץ של תגובה כאשר נלחץ, ומחזיר TextAnnotation. Page.AddFreeText() במקום זאת מצייר את הטקסט שלו ישירות על הדף בתוך תיבה ממוסגרת, עם גודל גופן, יישור וצבע מילוי משלו — שימושי לקריאות שצריכות להיות גלויות ללא צורך בפתיחה של דבר.

page.AddTextNote({
  rect: [x, y, x + 20, y + 20], icon: 'Note', author: 'Reviewer',
  contents: 'This is a sticky-note annotation.',
});

page.AddFreeText({
  rect: [220, 60, 520, 96],
  contents: 'FreeText sample', fontSize: 10, align: 'center',
  fill: [1, 1, 0.8], width: 1,
});

צורות ודיו חופשי

Page.AddSquare() ו-Page.AddCircle() מציירים מלבן או אליפסה עם גבול, כאשר לכל אחד יש אפשרות למילוי פנימי. Page.AddLine() מצייר קו ישר בין שני נקודות, עם סגנונות ראשי חץ ניתנים לבחירה באופן עצמאי (startEnding/endEnding, לדוגמה 'OpenArrow'/'ClosedArrow') בכל קצה. Page.AddPolygon() ו-Page.AddPolyline() מציירים צורות מרובות נקודות סגורות ופתוחות מרשימת קואורדינטות שטוחה, ו-Page.AddInk() מתעד אחד או יותר משיכות עט חופשיות כ-paths של רשימות נקודות.

page.AddSquare({ rect: [50, 400, 130, 435], color: [0.8, 0, 0], fill: [1, 1, 0.5], width: 2 });
page.AddCircle({ rect: [150, 400, 230, 435], color: [0, 0.5, 0], width: 2 });

page.AddLine({
  line: [260, 417, 420, 417],
  color: [0, 0, 0.7], width: 2,
  startEnding: 'OpenArrow', endEnding: 'ClosedArrow',
});

const stroke: number[] = [];
[-8, 6, -4, 10, -2, 8, -6].forEach((dy, i) => stroke.push(440 + i * 12, 417 + dy));
page.AddInk({ paths: [stroke], color: [0.6, 0, 0.6], width: 2 });

קישורים והפעולות שלהם

Page.AddLink() מחזיר LinkAnnotation שבו action קובע מה קורה בלחיצה: { type: 'uri', uri: '...' } פותח כתובת URL חיצונית, { type: 'goto', page: N } קופץ לעמוד בתוך אותו המסמך, ו-{ type: 'submit', url: '...', format: 'html' } מגיש את ערכי השדות בטופס הנוכחי לנקודת קצה. מספר עמוד goto מחוץ לטווח או אובייקט פעולה מעוות נדחים בזמן היצירה במקום להתקבל בשקט.

const uriLink = page.AddLink({
  rect: [10, 10, 100, 30], action: { type: 'uri', uri: 'https://example.com' },
});

const gotoLink = page.AddLink({
  rect: [10, 40, 100, 60], action: { type: 'goto', page: 2 },
});

const submitLink = page.AddLink({
  rect: [10, 70, 100, 90],
  action: { type: 'submit', url: 'https://example.com/post', format: 'html' },
});

// page.AddLink({ rect: [...], action: { type: 'goto', page: 99 } }) throws RangeError
// when 99 is out of range for the document.

חיפוש תוכן ההערה

שתי שיטות שונות מחפשות בטקסט ההסבר, והן מודעות להפרדתן בכוונה: Page.SearchAnnotations() מחפשת את הטקסט של המראה עצמו של ההסבר מציג — התווית הגלויה על FreeText או חותמת, לדוגמה — כאשר Page.SearchAnnotationText() מחפשת את הטקסט שנושא בהסבר של /Contents כניסה, כגון גוף ההערה של פתק דביק. התאמה באחת אינה מרמזת על התאמה באחרת.

page.SearchAnnotations('bravo');          // finds it if the annotation's drawn appearance contains it
page.SearchAnnotationText('bravo');       // finds it if the annotation's /Contents comment contains it

ניתן להסיר הערות שאינן נדרשות עוד ישירות עם Page.RemoveAnnotation(), על-ידי העברת ידית ההערה או המילון הפנימי שלה.


התחלה מהירה

התקן את החבילה, ולאחר מכן הוסף הדגשה, קישור והערת מדבקה לדף קיים:

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
import { Document } from '@asposefoss/pdf';

const doc = Document.OpenFile('input.pdf');
const page = doc.Pages[0];

page.AddHighlight({ quads: [72, 700, 300, 700, 72, 715, 300, 715], color: [1, 1, 0] });

page.AddLink({
  rect: [72, 670, 200, 690], action: { type: 'uri', uri: 'https://example.com' },
});

page.AddTextNote({
  rect: [320, 670, 340, 690], icon: 'Note', author: 'Reviewer',
  contents: 'Please double-check this figure.',
});

doc.WriteTo('annotated.pdf');

פורמטים נתמכים

פורמטסיומתקריאהכתיבה
PDFpdf✓✓
Markdownmd✓✓
SVGsvg✓✓
TIFFtiff✓✓
DOCXdocx—✓
HTMLhtml—✓
PNGpng—✓
EPUBepub—✓

קוד פתוח ורישוי

Aspose.PDF FOSS עבור TypeScript משוחרר תחת רישיון MIT, עם קוד מקור שפורסם ב-GitHub. אין סימן מים להערכת, מגבלת שימוש, או קובץ רישיון נפרד לניהול, והספרייה יכולה לשמש במוצרים מסחריים ללא תמלוגים.

החבילה נמצאת כעת בגרסה 0.1.0, מה שמצביע על פיתוח פעיל בשלבים מוקדמים. Node.js (>=22) הוא הדרישה היחידה בזמן הריצה, ולחבילה אין תלות של צד שלישי אחרת.


התחלה

משאבים קשורים