وقتی HotXLS یک کاربرگ را با فعالبودن برچسبزنی خودکار به PDF صادر میکند، تصاویر کاربرگی که متن جایگزین حمل میکنند اکنون بهعنوان عناصر ساختار /Figure مستقل با یک entry یونیکد /Alt، شناسههای محتوای نشاندار متراکم صفحه-محلی و entryهای دقیق درخت والد ساطع میشوند. تصاویر بدون متن جایگزین artifactهای تزئینی میمانند، و نمودارها هم artifact میمانند. آن دامنه دقیق اهمیت دارد: تصاویر اطلاعاتی را برای صفحهخوان در دسترس میکند، و همان چیزی نیست که انطباق کامل PDF/UA است
سازوکارهای پشت آن جذابتر از توصیف ویژگیاند، چون دو مورد از آنها از جنس جزئیاتیاند که بیسروصدا PDF از نظر ساختاری معتبری تولید میکند که ساختارش به محتوای غلطی اشاره میکند
چه چیزی یک تصویر اطلاعاتی به حساب میآید؟
فقط یک AltText غیرخالی. پراپرتی TXLSXImage.AltText صفت descr مربوط به OOXML از پراپرتیهای غیربصری تصویر را رفتوبرگشت میکند، که جایی است که اکسل متنی را که کاربر در پنل alt-text تایپ میکند ذخیره میکند. آن تنها سیگنال در فایل است که مؤلف تصویر را حامل اطلاعات دانسته نه تزئین، پس تنها سیگنالی است که exporter به آن اعتماد میکند
دو شبه-خطا عمداً پذیرفته نمیشوند. فیلد عنوان، که جدا از توصیف ذخیره میشود، جایگزین نیست: یک عنوان نامی برای آبجکت است، نه معادل متنی آن، و ارتقایش به /Alt سندی تولید میکرد که یک بررسی خودکار را پاس میکند در حالی که «تصویر 3» را به صفحهخوان اعلام میکند. یک توصیف خالی هم شکافی برای پرشدن با جاینگهدار نیست؛ یعنی تصویر artifact میماند، که نتیجه درست برای یک لوگو یا یک خط جداکننده است. نمودارها هم فعلاً artifact میمانند، چون معادل متنی یک نمودار دادههایش است و سنتز آن از روی سریها اختراع است نه استخراج
uses
lxHandleX, lxPDF;
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Exporter: TXLSPDFExport;
I: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('regional-review.xlsx');
Sheet := Book.Sheets.ByPos[0];
// پیش از صادرکردن ممیزی کن: تصویری بدون توصیف
// بهعنوان artifact تزئینی صادر خواهد شد
for I := 0 to Sheet.Images.Count - 1 do
if Sheet.Images[I].AltText = '' then
Sheet.Images[I].AltText := DescribeImage(Sheet.Images[I].Name);
Exporter := TXLSPDFExport.Create;
try
Exporter.TagMode := xlsPdfTagsAutomatic;
Exporter.DocumentLanguage := 'en-US';
Exporter.SaveAsPDF(Sheet, 'regional-review.pdf');
finally
Exporter.Free;
end;
finally
Book.Free;
end;
end;
چرا صفحه به یک تخصیصدهنده MCID واحد نیاز دارد؟
چون درخت والد آرایهای است که با شناسه محتوای نشاندار اندیس میشود، و دو تخصیصدهنده دو entry تولید میکنند که همان جایگاه را ادعا میکنند. PDF برچسبخورده محتوا را در هر دو جهت به ساختار وصل میکند. در سمت محتوا، بازهای از جریان محتوای صفحه در عملگرهای BDC و EMC پیچیده میشود که یک شماره /MCID حمل میکنند که درون آن صفحه یکتاست. در سمت ساختار، دیکشنری صفحه کلید /StructParents را حمل میکند که یک سطر از /ParentTree سند را نام میبرد، و آن سطر آرایهای است که عنصرش در اندیس n عنصر ساختاری است که مالک MCID شماره n است
یک صفحه کاربرگ سلولهای جدول و حالا فیگورها را دارد. اگر برچسبزن سلول شناسههایش را از صفر بشمارد و برچسبزن فیگور هم از صفر بشمارد، اولین فیگور جایگاهی را ادعا میکند که اولین سلول از قبل مالکش است. هیچچیز در فایل حاصل آنقدر بدشکل نیست که یک تجزیهگر ردش کند: درخت ساختار سالم است، محتوای نشاندار متوازن است، و یک اعتبارسنج سندی با یک درخت والد میبیند. چیزی که صفحهخوان میگیرد یک سلول جدول است که بهعنوان تصویر اعلام میشود، یا تصویری که با متن یک سلول اعلام میشود. پس exporter از یک شمارنده سطح-صفحه که هر دو برچسبزن مشترکشاند تخصیص میدهد، و رکورد صفحه را فقط وقتی منجمد میکند که شماره آبجکت صفحه معلوم باشد، چون سطر درخت-والد را نمیتوان پیش از آنکه صفحهای که به آن ارجاع میدهد هویت پیدا کند نوشت
Figure باید کل نمونه مرئی را بپوشاند
جایگذاری سادهلوحانه پیچیدن عملگر Doای است که XObject تصویر را فراخوانی میکند، چون آن عملگری است که عکس را میکشد. کافی نیست. یک تصویر کاربرگ اغلب با سایهای پشتش و مسیر برش دورش کشیده میشود، و آن نشانها بخشی از آبجکت مرئیاند. رهاشده بیرون قلمرو /Figure محتوای بینشان میشوند، که دقیقاً همان وضعیتی است که یک ممیزی ساختار پرچمش میزند
پس قلمرو محتوای نشاندار پیش از سایه باز و پس از ترسیم تصویر بسته میشود، و برش را هم پوشش میدهد. اشتراک جایی که درست است حفظ میشود: دو سلول که همان بار عکس را نشان میدهند همچنان به یک XObject تصویر ارجاع میدهند، چون آن یک بهینهسازی سطح-منبع است و ربطی به معناشناسی ندارد. چیزی که هر نمونه مرئی میگیرد MCID و عنصر ساختار خودش است، چون دو وقوع از همان لوگو در جایهای متفاوت دو چیزی هستند که خواننده با آنها روبهرو میشود. جایگذاری تصویر و هندسه EMU که این آبجکتها را مینشاند در مقاله هندسه تصویر پوشش داده شده است
ترتیب خواندن روی یک صفحه کاربرگ
ترتیب خواندن تصمیمی است که exporter باید بگیرد، چون یک صفحهگسترده جریان مؤلفمحور سندی را به آن شکل ندارد. قاعده اتخاذشده پایدار و بهآسانی توضیحپذیر است: برای هر صفحه، اول جدول میآید، بعد فیگورها به ترتیب ترسیم. پس خواننده محتوای جدولی صفحه و بعد تصاویرش را میشنود، بهجای اینکه تصاویر در هر جایگاهی که آبجکتهای ترسیمی اتفاقاً در فایل اشغال کرده بودند در هم بیفتند
آن ترتیب بهازای هر صفحه است نه هر سند، که در workbookی که به دهها صفحه صفحهبندی میشود اهمیت دارد: شاخه ساختار هر صفحه خودبسنده است، پس خوانندهای که میان صفحات حرکت میکند به یک جدول پیشین برنمیگردد. اگر به کنترل بر اینکه sheet اصلاً چطور صفحهبندی میشود نیاز دارید، تعامل page-setup و ناحیه چاپ در مقاله حفاظت و page setup توصیف شده است
این چه چیزی را گواهی میکند و چه چیزی را نه
گواهی میدهد که تصاویر اطلاعاتی با توصیف تأمینشده توسط مؤلف به فناوری کمکی میرسند، و اینکه نگاشت محتوا-به-ساختار درست است نه صرفاً موجود. خروجی را PDF/UA منطبق نمیکند، و توصیفش به آن شکل ادعایی است که پیادهسازی نمیتواند پشتیبانی کند: نمودارها همچنان artifactاند، و یک بیانیه انطباق کامل ممیزی هر نوع ساختار، هر فونت و متادیتای سند را بهطور کل میطلبد
اگر الزام شما یک پروفایل آرشیوی یا انطباق است نه بهبود دسترسپذیری، آن یک پیکربندی صادرات متفاوت و مجموعه بررسیهای متفاوتی است، که در مقاله صادرات آرشیوی PDF/A توصیف شده است. این دو ترکیب میشوند، اما به ممیزان متفاوتی پاسخ میدهند
یک پیشنهاد عملی برای یک خط لوله گزارش: متن جایگزین را در نقطهای که workbook تولید میشود ممیزی کنید، نه در زمان صادرات. مولد میداند هر تصویر نمودار یا نمودار تعبیهشده نمایانگر چیست، و میتواند یک توصیف واقعی در AltText بنویسد؛ یک گذر در زمان صادرات فقط میتواند بگوید توصیفی غایب است. HotXLS فرمتهای XLS، XLSX، ODS و CSV را بهطور بومی از Delphi و C++Builder بدون وابستگی به Excel میخواند و مینویسد، و گزینههای پیکربندی صادراتش در صفحه محصول HotXLS Delphi spreadsheet component فهرست شده است