Bài viết kỹ thuật

Phần tử Figure PDF có tag từ ảnh Excel với HotXLS

Khi HotXLS xuất một bảng tính sang PDF với tagging tự động được bật, các ảnh bảng tính mang văn bản thay thế giờ phát ra như các phần tử cấu trúc /Figure độc lập với một mục /Alt Unicode, các định danh marked-content cục bộ trang dày đặc và các mục parent-tree chính xác. Những ảnh không có văn bản thay thế vẫn là artifact trang trí, và biểu đồ vẫn là artifact. Phạm vi chính xác đó có ý nghĩa: nó khiến các ảnh có thông tin với tới được một trình đọc màn hình, và nó không phải cùng một chuyện với tuân thủ PDF/UA trọn vẹn

Cơ chế đằng sau nó thú vị hơn mô tả tính năng, vì hai trong số đó là loại chi tiết lặng lẽ tạo ra một PDF hợp lệ về cấu trúc mà cấu trúc lại trỏ vào nội dung sai

Điều gì được tính là một ảnh có thông tin?

Chỉ một AltText không rỗng. Thuộc tính TXLSXImage.AltText giữ trọn vẹn thuộc tính descr OOXML của các thuộc tính phi thị giác của ảnh, nơi Excel lưu văn bản mà người dùng gõ vào ô alt-text. Đó là tín hiệu duy nhất trong tệp cho thấy tác giả coi ảnh mang thông tin chứ không phải trang trí, nên nó là tín hiệu duy nhất exporter tin

Hai trường hợp suýt đủ được cố tình không chấp nhận. Trường tiêu đề, được lưu tách khỏi mô tả, không phải một chất thay thế: tiêu đề là một tên cho đối tượng, không phải một bản tương đương văn bản của nó, và việc thăng nó vào /Alt sẽ tạo ra một tài liệu qua được phép kiểm tự động trong khi thông báo "Picture 3" cho một trình đọc màn hình. Một mô tả rỗng cũng không phải khoảng trống để lấp bằng một giữ chỗ; nó nghĩa là ảnh vẫn là artifact, kết quả đúng cho một logo hay một đường phân cách. Biểu đồ cũng vẫn là artifact hiện tại, vì bản tương đương văn bản của một biểu đồ là dữ liệu của nó, và việc tổng hợp một bản từ các chuỗi dữ liệu là bịa đặt chứ không phải trích xuất

Các ảnh có AltText không rỗng xuất thành các phần tử cấu trúc Figure PDF với MCID riêng; mô tả rỗng và biểu đồ vẫn là artifact
Chỉ mô tả của tác giả trong AltText báo hiệu một ảnh có thông tin; một tiêu đề đơn lẻ chưa từng trở thành alt text
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];

    // Kiểm toán trước khi xuất: một ảnh không có mô tả
    // sẽ được xuất như một artifact trang trí
    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;

Vì sao trang cần một bộ cấp MCID duy nhất?

Vì cây cha là một mảng được đánh chỉ số theo định danh marked-content, và hai bộ cấp tạo ra hai mục cùng tuyên bố một ô. PDF có tag nối nội dung với cấu trúc theo cả hai chiều. Phía nội dung, một đoạn của luồng nội dung trang được bọc trong các toán tử BDCEMC mang một số /MCID duy nhất trong trang đó. Phía cấu trúc, từ điển trang mang một khóa /StructParents nêu tên một hàng của /ParentTree tài liệu, và hàng đó là một mảng mà phần tử tại chỉ số n là phần tử cấu trúc sở hữu MCID n

Một trang bảng tính chứa các ô bảng và, giờ đây, các figure. Nếu bộ tag ô đếm các định danh của nó từ không và bộ tag figure cũng đếm từ không, figure đầu tiên tuyên bố ô mà ô đầu tiên đã sở hữu. Chẳng gì về tệp kết quả dị dạng đến mức một parser từ chối được: cây cấu trúc nguyên vẹn, marked content cân bằng, và một validator thấy một tài liệu có cây cha. Thứ trình đọc màn hình nhận được là một ô bảng được thông báo như một ảnh, hay một ảnh được thông báo với văn bản của một ô. Exporter vì vậy cấp phát từ một bộ đếm cấp trang dùng chung bởi cả hai bộ tag, và đóng băng bản ghi trang chỉ sau khi số object của trang đã biết, vì hàng cây cha không thể được ghi trước khi trang mà nó ám chỉ có một danh tính

Hai bộ tag ô và figure độc lập va chạm nhau tại ô cây cha số không; một bộ đếm MCID cấp trang giữ mọi dấu ánh xạ về một chủ sở hữu
Tệp va chạm vẫn qua được một validator cấu trúc; chỉ có thông báo của trình đọc màn hình là sai

Figure phải bọc toàn bộ thể hiện nhìn thấy được

Cách đặt ngây thơ là bọc toán tử Do gọi image XObject, vì đó là toán tử vẽ bức ảnh. Điều đó chưa đủ. Một ảnh bảng tính thường được vẽ với một bóng đổ phía sau và một đường cắt bao quanh, và những nét đó là một phần của đối tượng nhìn thấy được. Bị bỏ lại ngoài phạm vi /Figure, chúng trở thành nội dung không được đánh dấu, chính xác trạng thái mà một kiểm toán cấu trúc gắn cờ

Vì vậy phạm vi marked-content mở trước bóng đổ và đóng sau khi vẽ ảnh, phủ cả đường cắt. Việc dùng chung được giữ ở nơi dùng chung là đúng: hai ô hiển thị cùng payload ảnh vẫn tham chiếu một image XObject, vì đó là một tối ưu hóa cấp tài nguyên và chẳng liên quan gì ngữ nghĩa. Thứ mà mỗi thể hiện nhìn thấy được nhận là MCID và phần tử cấu trúc riêng của nó, vì hai lần xuất hiện của cùng một logo ở những nơi khác nhau là hai thứ mà một người đọc gặp. Việc đặt ảnh và hình học EMU định vị các đối tượng này được đề cập trong bài viết về hình học ảnh

Dấu BDC mở phạm vi Figure trước bóng đổ và đường cắt, còn EMC đóng sau khi vẽ ảnh Do, phủ toàn bộ thể hiện nhìn thấy được
Chỉ bọc toán tử ảnh sẽ để bóng đổ và đường cắt thành nội dung không đánh dấu; dùng chung tài nguyên giữa các ô được giữ

Thứ tự đọc trên một trang bảng tính

Thứ tự đọc là một quyết định exporter phải đưa ra, vì một bảng tính không có dòng chảy được soạn như một tài liệu. Quy tắc được chọn ổn định và dễ giải thích: với mỗi trang, bảng đến trước, rồi các figure theo thứ tự vẽ. Người đọc vì vậy nghe nội dung dạng bảng của trang rồi mới tới các ảnh của nó, thay vì có ảnh đan xen ở bất kỳ vị trí nào mà các đối tượng vẽ tình cờ chiếm trong tệp

Thứ tự đó là theo trang chứ không theo tài liệu, điều quan trọng trên một sổ làm việc phân trang thành hàng chục trang: nhánh cấu trúc của mỗi trang tự chứa trọn vẹn, nên một người đọc di chuyển giữa các trang không nhảy ngược vào một bảng trước đó. Nếu bạn cần kiểm soát cách bảng phân trang ngay từ đầu, sự tương tác page-setup và vùng in được mô tả trong bài viết về bảo vệ và page setup

Điều này chứng nhận gì, và điều gì thì không

Nó chứng nhận rằng các ảnh có thông tin với tới được công nghệ hỗ trợ kèm mô tả do tác giả cung cấp, và ánh xạ nội dung-sang-cấu trúc là đúng chứ không chỉ hiện diện. Nó không khiến đầu ra tuân thủ PDF/UA, và mô tả theo cách đó sẽ là một tuyên bố mà hiện thực không thể đỡ được: biểu đồ vẫn là artifact, và một tuyên bố tuân thủ trọn vẹn đòi hỏi một cuộc kiểm toán về mọi loại cấu trúc, mọi phông, và metadata tài liệu như một tổng thể

Nếu yêu cầu của bạn là một hồ sơ lưu trữ hay tuân thủ thay vì cải thiện khả năng truy cập, đó là một cấu hình xuất khác và một bộ kiểm tra khác, được mô tả trong bài viết về xuất lưu trữ PDF/A. Hai cái kết hợp được, nhưng chúng trả lời những kiểm toán viên khác nhau

Một gợi ý thực tiễn cho pipeline báo cáo: kiểm toán văn bản thay thế tại điểm sổ làm việc được tạo ra, chứ không phải lúc xuất. Bộ sinh biết mỗi ảnh biểu đồ hay sơ đồ nhúng đại diện cho điều gì, và có thể viết một mô tả thật vào AltText; một lượt chạy lúc xuất chỉ có thể nói với bạn rằng một mô tả còn thiếu. HotXLS đọc và ghi XLS, XLSX, ODS và CSV thuần từ Delphi và C++Builder mà không phụ thuộc Excel, và các tùy chọn cấu hình xuất của nó được liệt kê trên trang sản phẩm HotXLS Delphi spreadsheet component