기술 문서

HotXLS로 Excel 이미지에서 태그된 PDF Figure

HotXLS가 자동 태깅을 켠 채 워크시트를 PDF로 내보낼 때, 대체 텍스트를 실은 워크시트 그림은 이제 Unicode /Alt 엔트리와 조밀한 페이지 로컬 marked-content 식별자, 정확한 부모 트리 엔트리를 실은 독립적인 /Figure 구조 요소로 나옵니다. 대체 텍스트가 없는 그림은 장식 artifact로 남고, 차트도 artifact로 남습니다. 이 정밀한 범위가 중요합니다. 정보성 이미지를 스크린 리더가 닿을 수 있게 하면서, 전체 PDF/UA 적합과 같은 것이 아닙니다

그 뒤의 기계장치는 기능 설명보다 더 흥미로운데, 그중 둘은 구조적으로 유효하면서 구조가 잘못된 콘텐츠를 가리키는 PDF를 조용히 만들어 내는 종류의 세부이기 때문입니다

무엇이 정보성 이미지로 치는가

비어 있지 않은 AltText만입니다. TXLSXImage.AltText 프로퍼티는 그림 비시각 프로퍼티의 OOXML descr 속성, 즉 Excel이 사용자가 alt-text 창에 친 텍스트를 저장하는 곳을 왕복 전달합니다. 저자가 그림을 장식이 아니라 정보를 실는 것으로 여겼다는 파일 안의 유일한 신호이므로, 내보내기가 신뢰하는 유일한 신호입니다

근접 실패 두 가지는 의도적으로 받아들이지 않습니다. 설명과 따로 저장되는 제목 필드는 대체물이 아닙니다. 제목은 오브젝트의 이름이지 텍스트적 동등물이 아니므로, 이를 /Alt로 승격하면 자동화 검사는 통과하면서 스크린 리더에는 "Picture 3"을 읽어 주는 문서가 만들어집니다. 빈 설명도 플레이스홀더로 채울 간극이 아닙니다. 이미지가 artifact로 남는다는 뜻이며, 로고나 구분선에는 그것이 올바른 결과입니다. 차트도 당분간 artifact로 남습니다. 차트의 텍스트적 동등물은 그 데이터이고, 계열에서 합성하는 것은 추출이 아니라 창작이기 때문입니다

비어 있지 않은 AltText를 가진 그림은 자기 MCID를 실은 PDF Figure 구조 요소로 내보내지고, 빈 설명과 차트는 artifact로 남음
AltText 안의 저자 설명만이 정보성 이미지의 신호입니다. 제목만으로는 절대 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];

    // 내보내기 전에 감사: 설명이 없는 이미지는
    // 장식 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 할당기 하나가 필요한 이유

부모 트리는 marked-content 식별자로 인덱스되는 배열이며, 두 할당기는 같은 슬롯을 주장하는 두 엔트리를 만들기 때문입니다. 태그된 PDF는 콘텐츠와 구조를 양방향으로 연결합니다. 콘텐츠 쪽에서 페이지 콘텐츠 스트림의 한 구간은 그 페이지 안에서 유일한 /MCID 번호를 실은 BDCEMC 연산자로 감싸집니다. 구조 쪽에서 페이지 사전은 문서 /ParentTree의 한 행을 이름 짓는 /StructParents 키를 실으며, 그 행은 인덱스 n의 요소가 MCID n을 소유하는 구조 요소인 배열입니다

워크시트 페이지에는 표 셀이 담기고, 이제는 figure도 담깁니다. 셀 태거가 식별자를 0부터 세고 figure 태거도 0부터 세면 첫 figure는 첫 셀이 이미 소유한 슬롯을 주장합니다. 결과 파일은 파서가 거부할 만큼 기형이 아닙니다. 구조 트리는 온전하고, marked content는 균형이 맞고, 검증기는 부모 트리를 갖춘 문서를 봅니다. 스크린 리더가 받는 것은 이미지로 읽혀지는 표 셀이거나, 셀의 텍스트로 읽혀지는 이미지입니다. 따라서 내보내기는 두 태거가 공유하는 페이지 수준 카운터 하나에서 할당하고, 참조하는 페이지가 정체를 갖기 전에는 부모 트리 행을 쓸 수 없으므로 페이지 오브젝트 번호를 알게 된 뒤에야 페이지 레코드를 고정합니다

독립적인 셀·figure 태거가 부모 트리 슬롯 0에서 충돌. 페이지 수준 MCID 카운터 하나가 모든 마크를 하나의 소유자에 매핑
충돌하는 파일도 구조 검증기는 통과합니다. 틀린 것은 스크린 리더 안내뿐입니다

Figure는 보이는 인스턴스 전체를 감싸야 합니다

순진한 배치는 그림을 그리는 연산자인 이미지 XObject를 부르는 Do 연산자를 감싸는 것입니다. 부족합니다. 워크시트 그림은 뒤에 그림자와 주위에 클리핑 경로를 두고 그려지는 경우가 많고, 그 마크들이 보이는 오브젝트의 일부입니다. /Figure 범위 밖에 두면 unmarked content가 되는데, 구조 감사가 표시하는 바로 그 상태입니다

그래서 marked-content 범위는 그림자 전에 열리고 이미지 드로우 뒤에 닫혀 클립까지 덮습니다. 공유는 공유가 올바른 곳에서는 보존됩니다. 같은 그림 페이로드를 보여주는 두 셀은 여전히 하나의 이미지 XObject를 참조합니다. 그것은 리소스 수준 최적화이며 의미론과는 무관하기 때문입니다. 각 보이는 인스턴스가 받는 것은 자기 MCID와 자기 구조 요소입니다. 다른 장소에서의 같은 로고의 두 등장은 독자가 마주치는 두 가지이기 때문입니다. 이미지 배치와 이 오브젝트들을 위치시키는 EMU 지오메트리는 이미지 지오메트리 문서에서 다룹니다

BDC 마크가 그림자와 클립 전에 Figure 범위를 열고 EMC가 Do 이미지 드로우 뒤에 닫아 보이는 인스턴스 전체를 커버
이미지 연산자만 감싸면 그림자와 클립이 unmarked content로 남습니다. 셀 간 리소스 공유는 보존됩니다

워크시트 페이지의 읽기 순서

읽기 순서는 내보내기가 정해야 할 결정입니다. 스프레드시트에는 문서처럼 저작된 흐름이 없기 때문입니다. 채택한 규칙은 안정적이고 설명하기 쉽습니다. 각 페이지에서 표가 먼저 오고, 그다음 그리기 순서의 figure입니다. 따라서 독자는 페이지의 표 콘텐츠를 먼저 듣고 그다음 이미지를 듣습니다. 드로잉 오브젝트가 파일에서 우연히 차지한 위치에 이미지가 끼어드는 대신입니다

그 순서는 문서별이 아니라 페이지별이며, 수십 페이지로 분할되는 통합 문서에서 중요합니다. 각 페이지의 구조 분기는 자족적이므로 페이지 사이를 움직이는 독자가 이전 표로 점프해 돌아가지 않습니다. 시트가 애초에 어떻게 분할되는지 통제가 필요하다면 페이지 설정과 인쇄 영역 상호작용은 보호 및 페이지 설정 문서에서 설명합니다

이것이 인증하는 것과 하지 않는 것

이것이 인증하는 것은 정보성 그림이 저자가 공급한 설명과 함께 보조 기술에 닿고, 콘텐츠-구조 매핑이 단지 존재하는 것이 아니라 올바르다는 것입니다. 출력을 PDF/UA 적합으로 만들지는 않으며, 그렇게 기술하는 것은 구현이 뒷받침할 수 없는 주장입니다. 차트는 여전히 artifact이고, 완전한 적합 선언에는 모든 구조 타입, 모든 폰트, 문서 메타데이터 전체에 대한 감사가 필요합니다

요구 사항이 접근성 개선이 아니라 아카이브나 적합 프로파일이라면 그것은 다른 내보내기 구성이자 다른 검사 집합이며, PDF/A 아카이브 내보내기 문서에서 설명합니다. 둘은 결합되지만 대답하는 감사자가 다릅니다

보고 파이프라인을 위한 실무적 제안 하나. 대체 텍스트는 내보내기 시점이 아니라 통합 문서가 생성되는 지점에서 감사하십시오. 생성기는 각 차트 이미지나 내장 다이어그램이 무엇을 나타내는지 알고 진짜 설명을 AltText에 쓸 수 있습니다. 내보내기 시점 패스는 설명이 빠졌다는 것만 말해 줄 수 있습니다. HotXLS는 Excel 의존성 없이 Delphi와 C++Builder에서 XLS, XLSX, ODS, CSV를 네이티브로 읽고 쓰며, 내보내기 구성 옵션은 HotXLS Delphi spreadsheet component 제품 페이지에 정리되어 있습니다