Structure
Structure
این صفحه به ناوبری سند و ساختار منطقی آن میپردازد: سرفصلها (نشانهگذاریها)، فهرست مطالب، مقصدهای نامگذاریشده، و درخت ساختار برچسبدار که برای دسترسیپذیری و بازچیدمان استفاده میشود.
سرفصلها (نشانهگذاریها)
Document.GetOutlines() درخت سرفصل فعلی را به عنوان OutlineItem[] برمیگرداند ([] زمانی که /Outlines وجود ندارد)؛ Document.SetOutlines() آن را جایگزین میکند — ارسال [] سرفصل را بهطور کامل حذف میکند. هر OutlineItem دارای Title، یک Dest (شماره صفحه یا مقصد نامگذاریشده)، Children اختیاری برای تو در تویی، و سبکدهی (Color، Bold، Italic، Open) است.
const items: OutlineItem[] = sections.map((s) => {
const item: OutlineItem = { Title: s.title, Dest: { name: s.dest } };
if (s.subtype === 'sales') {
item.Open = true;
item.Children = ['Pasta', 'Pizza', 'Antipasti']
.map((cat) => ({ Title: cat, Dest: { name: s.dest } }));
}
return item;
});
doc.SetOutlines(items);فهرست مطالب
Page.AddTOC() فهرستی از اشیاء TOCEntry را رندر میکند — هر یک با یک title و یک شماره هدف page — داخل یک مستطیل در صفحه، با عناوین بستهشده، خطوط نقطهای، و برچسبهای صفحه راستتراز. این تابع یک AddTOCResult برمیگرداند که تعداد ورودیهای رسمشده را گزارش میدهد و وقتی جعبه خیلی کوچک باشد، remainder که جا نیفتادهاند را ارائه میدهد.
page.AddTOC(
sections.map((s, i) => ({ title: `${i + 1}. ${s.title}`, page: s.page.Number })),
[72, 160, 400, 400],
{ font: 'Helvetica', fontSize: 13, rowGap: 18 },
);مقاصد نامگذاریشده
Document.GetNamedDestinations() تمام مقصدهای نامدار را بازمیگرداند — درحال ترکیب درخت نام /Names /Dests و واژهنامه قدیمی /Dests — بهصورت جفتهای { name, dest }، که در آن dest یک PageDest ({ page, view }) است. اینها همان هدفهای نامدار هستند که یک OutlineItem.Dest یا حاشیهنویسی پیوند میتواند با نام بهجای شماره صفحه صریح ارجاع دهد.
const destNames = new Set(doc.GetNamedDestinations().map((d) => d.name));
for (const { name, dest } of doc.GetNamedDestinations()) {
console.log(name, '-> page', dest.page);
}درخت ساختار برچسبدار
Document.AutoTag() یک /StructTreeRoot را از چیدمان صفحه استنتاج و مینویسد — عنوانها بر اساس خوشهبندی اندازه قلم، پاراگرافها بر اساس بلوکهای متن، جدولها بر اساس هندسه خطوط، و تصمیمهای /Figure در مقابل /Artifact برای هر تصویر — و یک AutoTagReport با شمارشها برای هر نوع عنصر بازمیگرداند. Document.GetStructTree() نتیجهٔ StructTreeRoot را میخواند، یا null وقتی سند برچسبگذاری نشده باشد.
const report = doc.AutoTag({ lang: 'en-US', title: 'Quarterly Report', tables: true });
console.log(report.headings, report.paragraphs, report.tables, report.figures);
const tree = doc.GetStructTree();
console.log(tree ? tree.GetText() : '(no structure tree)');محتوایی که پس از اجرای AutoTag() اضافه میشود — برای مثال یک صفحه که پس از آن پر میشود — توسط آن عبور پوشش داده نمیشود و دوبار برچسبگذاری نخواهد شد. StructTreeRoot.Append() و StructElement.MarkContent() API دستی در کنار نسخهٔ هوریستیک هستند: Append() یک عنصر فرزند از نوع مشخص را اضافه میکند، و MarkContent() ناحیهای از صفحه را به عنوان متعلق به آن عنصر علامتگذاری میکند.
نکات و بهترین روشها
- دستور
Document.AutoTag()را یکبار اجرا کنید، پس از نهایی شدن محتوای صفحه — این ابزار محتواهای اضافهشده پس از آن را دوباره برچسبگذاری نمیکند، بنابراین هر چیزی که بعداً اضافه میشود را باStructTreeRoot.Append()/StructElement.MarkContent()بهصورت دستی برچسب بزنید. - مقدار
opts.titleرا بهAutoTag()پاس دهید — همچنین/ViewerPreferences /DisplayDocTitleرا تنظیم میکند، که PDF/UA بههمراه عنوان سند میطلبد. - یک
OutlineItem.Destمیتواند یا به یک صفحه صریح یا به یک مقصد نامدار ({ name: '...' }) هدفگذاری کند — زمانی که شماره صفحه هدف ممکن است با تغییر محتوا جابجا شود، از مقاصد نامدار استفاده کنید. - در زمان غیرفعال بودن صفحهبندی خودکار،
AddTOCResult.remainderرا بررسی کنید — جعبه فهرست مطالب که برای هر ورودی بیش از حد کوچک است، بهصورت ساکتانه رسم را متوقف میکند بهجای اینکه از جعبه عبور کند.
مشکلات رایج
| مشکل | دلیل | راهحل |
|---|---|---|
Document.GetStructTree() باز میگرداند null | سند برچسبگذاری نشده است | ابتدا Document.AutoTag() یا Document.CreateStructTree() را فراخوانی کنید |
| لینک یک مورد فهرست حل نمیشود | Dest آن یک مقصد را نام میبرد که در Document.GetNamedDestinations() وجود ندارد | تأیید کنید که مقصد نامگذاری شده وجود دارد، یا بهجای آن از صفحه صریح Dest استفاده کنید |
Page.AddTOC() قبل از آخرین بخش متوقف میشود | هدف rect برای هر ورودی بسیار کوچک است و autoPaginate غیرفعال است | اندازه rect را بزرگ کنید، autoPaginate: true را عبور دهید، یا AddTOCResult.remainder را مدیریت کنید |
محتوایی که پس از AutoTag() اضافه شده است، در درخت ساختار موجود نیست | AutoTag() فقط محتواهایی را برچسبگذاری میکند که هنگام اجرا موجود بودند | بهصورت دستی محتواهای بعدی را با StructTreeRoot.Append() / StructElement.MarkContent() برچسبگذاری کنید |
FAQ
چگونه بوکمارکها را به یک PDF اضافه کنم؟
یک آرایه از اشیای OutlineItem (Title، Dest، Children اختیاری) بسازید و آن را به Document.SetOutlines() پاس دهید.
آیا فهرست مطالب میتواند بر چند صفحه گسترش یابد؟
بله — autoPaginate: true را در گزینههای Page.AddTOC() پاس دهید، یا AddTOCResult.remainder را بررسی کنید و AddTOC() را دوباره در صفحهای جدید برای مواردی که جا نخوردهاند، فراخوانی کنید.
چگونه یک PDF قابل دسترس (برچسبگذاری شده) بسازم؟
از Document.AutoTag() فراخوانی کنید، که سرفصلها، پاراگرافها، جدولها و شکلها را از طرحبندی صفحه استخراج میکند. برای محتوای اضافهشده پس از آن، یا در مواردی که نتیجهٔ هِیُرستیک نیاز به اصلاح دارد، مستقیماً از StructTreeRoot.Append() و StructElement.MarkContent() استفاده کنید.
تفاوت بین مقصد شماره صفحه و مقصد نامدار چیست؟
یک مقصد شماره صفحه (PageDest) به یک صفحهٔ صریح با شمارهٔ ۱-پایه اشاره میکند. یک مقصد نامدار (NamedDest) به نامی اشاره میکند که نمایشگر آن را از طریق جدولهای مقصد-نامدار سند حل میکند — که زمانی مفید است که صفحهٔ هدف ممکن است جابجا شود.
API Reference خلاصه
| کلاس/متد | توضیح |
|---|---|
Document.GetOutlines() / Document.SetOutlines() | خواندن یا جایگزینی درخت طرح کلی سند (نشانک) |
OutlineItem | یک گره طرحواره: Title، Dest، اختیاری Children |
Page.AddTOC() | فهرست مطالب را در یک مستطیل صفحه رندر کنید |
TOCEntry / AddTOCResult | دادههای یک ردیف TOC و نتیجهٔ رسم آن |
Document.GetNamedDestinations() | تمام named destinationها در سند را فهرست کنید |
Document.AutoTag() | استنتاج و ایجاد درخت ساختار برچسبدار از طرح صفحه |
Document.GetStructTree() / Document.CreateStructTree() | خواندن یا ایجاد StructTreeRoot سند |
StructTreeRoot.Append() / StructElement.Append() / StructElement.MarkContent() | بهصورت دستی درخت ساختار را تدوین یا گسترش دهید |