نحوه کار با ساختار PDF در TypeScript

نحوه کار با ساختار PDF در TypeScript

این راهنما نشان می‌دهد چگونه ناوبری سند و ساختار منطقی را در فایل‌های PDF با Aspose.PDF FOSS برای TypeScript بسازید: فهرست مطالب قابل کلیک در یک صفحه، نمای کلی نشانک‌های سطح سند، مقصدهای نام‌گذاری‌شده، و یک درخت ساختار برچسب‌گذاری‌شده برای دسترس‌پذیری. نیاز به Node.js 22 یا بالاتر دارد.

راهنمای گام به گام

گام ۱: نصب بسته

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

گام ۲: وارد کردن کلاس‌های مورد نیاز

برای باز کردن فایل Document را وارد کنید و برای ورودی‌های نشانک ساخته شده در گام ۴ OutlineItem را انجام دهید:

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

گام ۳: افزودن فهرست مطالب

Page.AddTOC() یک آرایه از ورودی‌های { title, page }، یک rect محدود کننده و گزینه‌های سبک می‌گیرد؛ خطوط نقطه‌ای و لینک‌های کلیک‌پذیر به صفحات هدف رسم می‌کند:

const page = doc.Pages[0];

page.AddTOC(
  [
    { title: '1.  Introduction', page: 2 },
    { title: '2.  Methodology', page: 5 },
    { title: '3.  Results', page: 9 },
  ],
  [72, 160, 400, 600],
  { font: 'Helvetica', fontSize: 13, color: [0.1, 0.1, 0.15], rowGap: 18 },
);

گام ۴: افزودن نشانک‌ها

Document.SetOutlines() پانل نشانک‌های سند را با یک آرایه از اشیاء OutlineItem جایگزین می‌کند. هر مورد می‌تواند یک Dest (مقصد صفحه)، استایل (Color، Bold) و Children تو در تو برای یک درخت قابل جمع شدن داشته باشد:

const items: OutlineItem[] = [
  { Title: 'Sales', Dest: { name: 'section.sales' }, Open: true, Color: [0.1, 0.4, 0.1] },
  { Title: 'Appendix', Dest: { name: 'section.appendix' } },
];

doc.SetOutlines(items);

گام ۵: خواندن طرح‌واره‌ها و مقصدهای نام‌گذاری‌شده

Document.GetOutlines() درخت نشانک‌های فعلی را برمی‌گرداند. Document.GetNamedDestinations() هر مقصد نام‌گذاری‌شده ثبت‌شده در سند را برمی‌گرداند — که برای تأیید این که هر هدف طرح‌واره و لینک فهرست مطالب واقعاً به صفحه‌ای واقعی ارجاع می‌دهد، مفید است:

const destNames = new Set(doc.GetNamedDestinations().map((d) => d.name));

const walk = (nodes: OutlineItem[]): void => {
  for (const item of nodes) {
    if (item.Dest && 'name' in item.Dest) {
      console.log(destNames.has(item.Dest.name), item.Title);
    }
    if (item.Children) walk(item.Children);
  }
};
walk(doc.GetOutlines());

گام ۶: ساخت درخت ساختار برچسب‌دار

Document.GetStructTree() درخت ساختار موجود را برمی‌گرداند (یا null اگر سند هنوز برچسب‌گذاری نشده باشد). StructTreeRoot.Append(tag) یک عنصر فرزند مانند 'H2' یا 'P' اضافه می‌کند و یک StructElement برمی‌گرداند، و StructElement.MarkContent(page, quad) آن عنصر را با محتوای صفحه‌ای که توصیف می‌کند مرتبط می‌سازد:

function tagPage(doc: Document, page: Page, headingText: string): void {
  const root = doc.GetStructTree();
  if (!root) throw new Error('tagPage: the document is not tagged yet');

  for (const block of page.GetStructuredText()) {
    const text = block.text.trim();
    if (text.length === 0) continue;
    const el = root.Append(text.startsWith(headingText) ? 'H2' : 'P');
    el.MarkContent(page, block.quad);
  }
}

مشکلات رایج و راه‌حل‌ها

Document.GetStructTree() returns null. سند هنوز برچسب‌گذاری نشده است — تماس بگیرید Document.CreateStructTree() (یا Document.AutoTag()) قبل از نوشتن دستی عناصر با StructTreeRoot.Append() / StructElement.MarkContent().

یک مورد رئوس به صفحه صحیح پرش نمی‌کند. OutlineItem.Dest باید مقصدی که واقعاً وجود دارد را نام بگذارد — بررسی متقابل item.Dest.name against Document.GetNamedDestinations() قبل از ذخیره‌سازی، همان‌طور که در گام 5 نشان داده شده است.

Page.AddTOC() ورودی‌ها به صفحه اشتباه اشاره می‌کنند. page در هر ورودی فهرست مطالب، شماره صفحه هدف همان شماره صفحه خود است — آن را در برابر page.Number در هدف واقعی Page، نه یک شاخص آرایه فرضی.

نشانک‌ها پس از یک بعدی ناپدید می‌شوند Document.SetOutlines() فراخوانی. SetOutlines() کل درخت نشانک‌ها را جایگزین می‌کند — درخت فعلی را با Document.GetOutlines() ابتدا، آرایه را ویرایش کنید، سپس اگر نشانک‌ها اضافه می‌شوند نه اینکه جایگزین شوند، کل آرایه را برگردانید.

سوالات متداول

آیا می‌توان یک نشانک را به‌صورت از پیش باز شده باز کرد؟

بله — Open: true را روی OutlineItem تنظیم کنید تا فرزندان آن گره به‌طور پیش‌فرض در پنل نشانک‌ها قابل مشاهده باشند.

تفاوت بین نشانک و مقصد نام‌دار چیست؟

یک نشانک (OutlineItem) ورودی قابل مشاهده‌ای در پنل ناوبری است؛ یک مقصد نام‌دار (Document.GetNamedDestinations() / SetNamedDestination()) هدف صفحه داخلی و قابل استفاده مجددی است که یک نشانک، یک ورودی فهرست مطالب یا یک حاشیه‌نویسی پیوند می‌توانند با نام به آن اشاره کنند.

آیا برچسب‌گذاری یک سند بر ظاهر آن تأثیر می‌گذارد؟

نه — یک درخت ساختار (StructTreeRoot, StructElement) لایه منطقی موازی‌ای است که ترتیب خواندن و معنا را توصیف می‌کند؛ این لایه محتویات قابل مشاهده صفحه را تغییر نمی‌دهد.

آیا می‌توانم نشانک‌ها را تو در تو کنم؟

بله — Children را روی یک OutlineItem به آرایه‌ای از اشیاء OutlineItem بیشتر تنظیم کنید تا درختی چندسطحی و قابل جمع شدن بسازید.

همچنین ببینید:

 فارسی