Artikel Teknis

Figure PDF Bertag dari Gambar Excel dengan HotXLS

Ketika HotXLS mengekspor worksheet ke PDF dengan penandaan otomatis aktif, gambar worksheet yang membawa teks alternatif kini dipancarkan sebagai elemen struktur /Figure independen dengan entri /Alt Unicode, marked-content identifier rapat lokal halaman, dan entri parent-tree yang persis. Gambar tanpa teks alternatif tetap menjadi artifact dekoratif, dan grafik juga tetap artifact. Cakupan presisi itu penting: ia membuat gambar informatif terjangkau oleh screen reader, dan itu bukan hal yang sama dengan kesesuaian PDF/UA penuh

Mekanika di baliknya lebih menarik daripada deskripsi fiturnya, karena dua di antaranya adalah jenis detail yang diam-diam menghasilkan PDF yang valid secara struktural dengan struktur yang menunjuk ke konten yang keliru

Apa yang dihitung sebagai gambar informatif?

Hanya AltText yang tidak kosong. Property TXLSXImage.AltText round-trip atribut descr OOXML dari properti non-visual gambar, tempat Excel menyimpan teks yang diketik pengguna ke panel alt-text. Itu satu-satunya sinyal di berkas bahwa penulis menganggap gambar membawa informasi alih-alih dekorasi, sehingga itulah satu-satunya sinyal yang dipercaya exporter

Dua hal yang nyaris lolos sengaja tidak diterima. Field judul, yang disimpan terpisah dari deskripsi, bukan pengganti: judul adalah nama untuk objek, bukan padanan tekstualnya, dan mempromosikannya ke /Alt akan menghasilkan dokumen yang lolos pemeriksaan otomatis sambil mengumumkan "Picture 3" ke screen reader. Deskripsi kosong juga bukan celah untuk diisi placeholder; itu berarti gambar tetap menjadi artifact, yang merupakan hasil yang benar untuk logo atau garis pembatas. Grafik juga tetap artifact untuk saat ini, karena padanan tekstual sebuah grafik adalah datanya dan menyintesiskan satu dari seri berarti mengarang, bukan mengekstraksi

Gambar dengan AltText tidak kosong diekspor sebagai elemen struktur Figure PDF dengan MCID miliknya sendiri; deskripsi kosong dan grafik tetap artifact
Hanya deskripsi penulis di AltText yang menandakan gambar informatif; judul saja tidak pernah menjadi teks alt
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];

    // Audit sebelum mengekspor: gambar tanpa deskripsi
    // akan diekspor sebagai artifact dekoratif
    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;

Mengapa halaman membutuhkan satu alokator MCID?

Karena parent tree adalah array yang diindeks oleh marked-content identifier, dan dua alokator menghasilkan dua entri yang mengklaim slot yang sama. PDF bertag menghubungkan konten ke struktur di kedua arah. Di sisi konten, satu rentang content stream halaman dibungkus operator BDC dan EMC yang membawa nomor /MCID yang unik dalam halaman itu. Di sisi struktur, dictionary halaman membawa kunci /StructParents yang menamai satu baris /ParentTree dokumen, dan baris itu adalah array yang elemennya pada indeks n adalah elemen struktur pemilik MCID n

Halaman worksheet memuat sel tabel dan, kini, figure. Jika penanda sel menghitung identifier-nya dari nol dan penanda figure juga menghitung dari nol, figure pertama mengklaim slot yang sudah dimiliki sel pertama. Tidak ada apa pun tentang berkas hasil yang cacat cukup untuk ditolak parser: pohon strukturnya utuh, marked content-nya seimbang, dan validator melihat dokumen dengan parent tree. Yang didapat screen reader adalah sel tabel yang diumumkan sebagai gambar, atau gambar yang diumumkan dengan teks sebuah sel. Exporter karenanya mengalokasikan dari satu penghitung level halaman yang dibagi kedua penanda, dan membekukan record halaman hanya setelah nomor objek halaman diketahui, karena baris parent-tree tidak bisa ditulis sebelum halaman yang dirujuknya punya identitas

Penanda sel dan figure independen bertabrakan pada slot parent tree nol; satu penghitung MCID level halaman menjaga setiap tanda terpetakan ke satu pemilik
Berkas yang bertabrakan tetap lolos validator struktural; hanya pengumuman screen reader yang keliru

Figure harus membungkus seluruh instansi yang terlihat

Penempatan naifnya adalah membungkus operator Do yang memanggil XObject gambar, karena itulah operator yang menggambar gambarnya. Itu tidak cukup. Gambar worksheet sering digambar dengan bayangan di belakangnya dan clipping path di sekelilingnya, dan tanda-tanda itu bagian dari objek yang terlihat. Ditinggal di luar scope /Figure mereka menjadi konten tak bertanda, yang persis adalah keadaan yang ditandai audit struktur

Jadi scope marked-content terbuka sebelum bayangan dan tertutup setelah penggambaran gambar, mencakup clip juga. Pembagian dipertahankan di tempat pembagian benar: dua sel yang menampilkan payload gambar yang sama tetap merujuk satu XObject gambar, karena itu optimasi level resource dan tidak ada sangkut pindanya dengan semantik. Yang didapat setiap instansi terlihat adalah MCID dan elemen strukturnya sendiri, karena dua kemunculan logo yang sama di tempat berbeda adalah dua hal yang dijumpai pembaca. Penempatan gambar dan geometri EMU yang memosisikan objek-objek ini dibahas dalam artikel geometri gambar

Tanda BDC membuka scope Figure sebelum bayangan dan clip serta EMC menutup setelah penggambaran gambar Do, mencakup seluruh instansi yang terlihat
Membungkus hanya operator gambar akan menyisakan bayangan dan clip sebagai konten tak bertanda; pembagian resource antar sel dipertahankan

Urutan baca pada halaman worksheet

Urutan baca adalah keputusan yang harus dibuat exporter, karena spreadsheet tidak punya alur yang ditulis sebagaimana dokumen. Aturan yang diadopsi stabil dan mudah dijelaskan: untuk setiap halaman, tabel datang lebih dulu, lalu figure dalam urutan gambar. Pembaca karenanya mendengar konten tabular halaman lalu gambarnya, alih-alih gambar diselangi pada posisi apa pun yang kebetulan ditempati objek menggambar di berkas

Urutan itu per halaman alih-alih per dokumen, yang penting pada workbook yang berpaginasi menjadi lusinan halaman: cabang struktur setiap halaman berdiri sendiri, sehingga pembaca yang berpindah antar halaman tidak melompat kembali ke tabel yang lebih awal. Jika Anda membutuhkan kendali atas bagaimana sheet berpaginasi sejak awal, interaksi page-setup dan print-area dijelaskan dalam artikel proteksi dan page setup

Apa yang disertifikasi ini, dan apa yang tidak

Ia menyertifikasi bahwa gambar informatif mencapai teknologi bantu dengan deskripsi yang disediakan penulisnya, dan bahwa pemetaan konten-ke-struktur benar, bukan sekadar ada. Ia tidak membuat output PDF/UA sesuai, dan menggambarkannya demikian adalah klaim yang tidak dapat didukung implementasi: grafik masih artifact, dan pernyataan kesesuaian penuh mensyaratkan audit setiap tipe struktur, setiap font, dan metadata dokumen secara keseluruhan

Jika kebutuhan Anda adalah profil arsip atau kesesuaian alih-alih peningkatan aksesibilitas, itu konfigurasi ekspor berbeda dan set pemeriksaan berbeda, dijelaskan dalam artikel ekspor arsip PDF/A. Keduanya bisa digabung, tetapi keduanya menjawab auditor yang berbeda

Satu saran praktis untuk pipeline pelaporan: audit teks alternatif pada titik di mana workbook dibuat, bukan pada saat ekspor. Generator tahu apa yang diwakili setiap gambar grafik atau diagram tertanam, dan bisa menulis deskripsi sungguhan ke AltText; lintasan saat ekspor hanya bisa memberi tahu Anda bahwa sebuah deskripsi hilang. HotXLS membaca dan menulis XLS, XLSX, ODS, dan CSV secara native dari Delphi dan C++Builder tanpa dependensi Excel, dan opsi konfigurasi ekspornya tercantum di halaman produk HotXLS Delphi spreadsheet component