مقال تقني

أشكال PDF الموسومة من صور Excel مع HotXLS

عندما يصدّر HotXLS ورقة عمل إلى PDF مع تمكين الوسم التلقائي، تصدر صور ورقة العمل الحاملة لنص بديل الآن كعناصر بنية /Figure مستقلة مع مدخلة /Alt يونيكودية ومعرفات محتوى موسوم كثيفة محلية الصفحة ومدخلات شجرة أب دقيقة. تبقى الصور بلا نص بديل أثرا زخرفيا، وتبقى المخططات أثرا هي أيضا. ذلك الحصر الدقيق مهم: فهو يجعل الصور المعلوماتية قابلة للوصول لقارئ شاشة، وهو ليس الشيء نفسه كالتوافق الكامل مع PDF/UA

الآليات خلفه أكثر إثارة من وصف الميزة، لأن اثنتين منها من الصنف من التفاصيل الذي ينتج بصمت PDF صالحا بنيويا تشير بنيةه إلى محتوى خاطئ

ما الذي يعد صورة معلوماتية؟

فقط AltText غير الفارغ. تجتاز خاصية TXLSXImage.AltText سمة descr في OOXML للخصائص غير البصرية للصورة ذهابا وإيابا، وهي حيث يخزن Excel النص الذي يكتبه المستخدم في لوحة النص البديل. تلك هي الإشارة الوحيدة في الملف إلى أن المؤلف اعتبر الصورة تحمل معلومات لا زخرفة، فهي الإشارة الوحيدة التي يثق بها مصدر التصدير

حالتا شبه مطابقة لا تقبلان عمدا. حقل العنوان، المخزن بمعزل عن الوصف، ليس بديلا: العنوان اسم للكائن لا مقابل نصي له، وترقيته إلى /Alt سينتج مستندا يجتاز فحصا آليا بينما يعلن «صورة 3» لقارئ شاشة. والوصف الفارغ ليس هو الآخر فجوة تملأ بعنصر نائب؛ بل يعني أن الصورة تبقى أثرا، وهو النتيجة الصحيحة لشعار أو خط فاصل. وتبقى المخططات أثرا في الوقت الحالي أيضا، لأن المقابل النصي للمخطط بياناته، وتوليف واحد من السلاسل اختراع لا استخراج

الصور ذات AltText غير الفارغ تصدر كعناصر بنية Figure في PDF بمعرف MCID خاص بها؛ والأوصاف الفارغة والمخططات تبقى أثرا
وصف المؤلف في AltText وحده يشير إلى صورة معلوماتية؛ والعنوان وحده لا يصير نصا بديلا أبدا
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];

    // دقق قبل التصدير: صورة بلا وصف
    // ستصدر كأثر زخرفي
    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 واحد؟

لأن شجرة الأب مصفوفة مفهرسة بمعرف المحتوى الموسوم، وموزعان ينتجان مدخلتين تطالبان بالخانة نفسها. يربط PDF الموسوم المحتوى بالبنية في الاتجاهين. ومن جهة المحتوى، يلف مدى من مسار محتوى الصفحة بمعاملَي BDC وEMC يحملان رقما /MCID فريدا داخل تلك الصفحة. ومن جهة البنية، يحمل قاموس الصفحة مفتاح /StructParents يسمي صفا من /ParentTree للمستند، وذلك صف مصفوفة عنصرها عند الفهرس n هو عنصر البنية المالك لـ MCID n

تحوي صفحة ورقة عمل خلايا جدول، والآن، أشكالا. إذا عد واسم الخلايا معرفاته من الصفر وعد واسم الأشكال هو الآخر من الصفر، تطالب أول شكل بالخانة التي تملكها أول خلية أصلا. لا شيء في الملف الناتج مشوه بما يكفي ليرفضه محلل: شجرة البنية سليمة، والمحتوى الموسوم متوازن، ويرى المتحقق مستندا ذا شجرة أب. ما يحصل عليه قارئ الشاشة خلية جدول تعلن كصورة، أو صورة تعلن بنص خلية. لذا يوزع مصدر التصدير من عداد واحد على مستوى الصفحة يشترك فيه الوسمان، ويثبت سجل الصفحة فقط بعد معرفة رقم كائن الصفحة، لأن صف شجرة الأب لا يمكن كتابته قبل أن يكتسب الصفحة التي يشير إليها هوية

واسما الخلايا والأشكال المستقلان يتصادمان على خانة الصفر في شجرة الأب؛ وعداد MCID واحد على مستوى الصفحة يبقي كل وسم مقابلا لمالك واحد
الملف المتصادر ما يزال يجتاز متحققا بنيويا؛ والإعلان لقارئ الشاشة وحده هو الخاطئ

يجب أن يلف الشكل النسخة المرئية كاملة

الموضعة الساذجة لف معامل Do الذي يستدعي XObject الصورة، لأنه المعامل الذي يرسم الصورة. وهو ليس كافيا. فصورة ورقة العمل كثيرا ما ترسم بظل خلفها ومسار قص حولها، وتلك الوسوم جزء من الكائن المرئي. وتركها خارج نطاق /Figure يجعلها محتوى غير موسوم، وهو بالضبط الحالة التي يعلمها تدقيق البنية

فنطاق المحتوى الموسوم يفتح قبل الظل ويغلق بعد رسم الصورة، شاملا القص أيضا. وتُحفظ المشاركة حيث تكون المشاركة صائبة: خليتان تعرضان حمولة صورة واحدة ما تزالان تشيران إلى XObject صورة واحد، لأن ذلك تحسين على مستوى الموارد لا علاقة له بالدلالة. وما تحصل عليه كل نسخة مرئية هو MCID خاص بها وعنصر بنية خاص بها، لأن ورودين لشعار نفسه في مكانين هما شيئان يقابلهما القارئ. وموضعة الصور وهندسة EMU التي تموضع هذه الكائنات مشمولة في مقال هندسة الصور

وسم BDC يفتح نطاق الشكل قبل الظل والقص ويغلق EMC بعد رسم الصورة بـ Do، شاملا النسخة المرئية كاملة
لف معامل الصورة وحده سيترك الظل والقص محتوى غير موسوم؛ وتظل مشاركة الموارد بين الخلايا محفوظة

ترتيب القراءة في صفحة ورقة عمل

ترتيب القراءة قرار لا بد لمصدر التصدير من اتخاذه، لأن جدول البيانات لا يملك سريانا مؤلفا كما يملكه مستند. القاعدة المعتمدة مستقرة وسهلة الشرح: لكل صفحة، يأتي الجدول أولا، ثم الأشكال بترتيب الرسم. يسمع القارئ إذن المحتوى الجدولي للصفحة ثم صورها، بدل أن تتداخل الصور في أي موضع صادف أن تناولته كائنات الرسم في الملف

ذلك الترتيب لكل صفحة لا لكل مستند، وهو ما يهم في مصنف يرقم إلى عشرات الصفحات: فرع بنية كل صفحة مكتف بذاته، فالقارئ المتنقل بين الصفحات لا يقفز عائدا إلى جدول سابق. وإن كنت تحتاج التحكم في كيفية ترقيم الورقة للصفحات أصلا، فتفاعل إعداد الصفحة ومنطقة الطباعة موصوف في مقال الحماية وإعداد الصفحة

ما يصدّقه هذا، وما لا يصدقه

يصدّق أن الصور المعلوماتية تصل إلى تكنولوجيا المساعدة بوصفها المزود من المؤلف، وأن تقابل المحتوى إلى البنية صحيح لا مجرد موجود. وهو لا يجعل الخرج متوافقا مع PDF/UA، ووصفه بذلك سيكون دعوى لا يستطيعها التنفيذ: المخططات ما تزال أثرا، وتصريح التوافق الكامل يتطلب تدقيقا لكل نوع بنية، ولكل خط، ولبيانات المستند الوصفية ككل

إن كان مطلبك ملفا شخصيا أرشيفيا أو توافقا لا تحسينا لإمكانية الوصول، فذلك إعداد تصدير مختلف ومجموعة فحوص مختلفة، موصوفة في مقال التصدير الأرشيفي PDF/A. الاثنان يجتمعان، لكنهما يجيبان عن مدققين مختلفين

اقتراح عملي واحد لمسار تقارير: دقق النص البديل عند النقطة التي يتولد فيها المصنف، لا وقت التصدير. فالمولد يعرف ما يمثله كل صورة مخطط أو مخطط مضمن، ويستطيع كتابة وصف حقيقي في AltText؛ ومرور وقت التصدير لا يستطيع إلا إخبارك بأن وصفا مفقود. يقرأ HotXLS ويكتب XLS وXLSX وODS وCSV أصليا من Delphi وC++Builder دون أي اعتمادية Excel، وخيارات إعداد التصدير لديه مدرجة في صفحة منتج HotXLS Delphi spreadsheet component