GetPDFUADiagnostics

PDF/UA и доступность

Описание

Возвращает список возможных нарушений соответствия PDF/UA-1 (ISO 14289-1), обнаруженных в текущем документе и разделённых переводами строк. Каждая строка содержит один код нарушения, затем двоеточие и понятное человеку описание. Если нарушений не найдено, возвращает пустую строку.

Синтаксис

Delphi

Function TPDFlib.GetPDFUADiagnostics: WideString;

ActiveX

Function PDFlib::GetPDFUADiagnostics() As String

DLL

const wchar_t * DLGetPDFUADiagnostics(int InstanceID);

Параметры

PDF-VERSION-LOWВерсия PDF документа (по заголовку файла) ниже 1.7, а PDF/UA-1 определён относительно ISO 32000-1:2008 (PDF 1.7). Вызовите SetPDFUAMode, чтобы автоматически поднять версию до 1.7
MARKED-FALSEMarkInfo/Marked не равен true; документ не является тегированным PDF
LANG-MISSINGЗапись /Lang в каталоге документа отсутствует или пуста. ISO 14289-1 §7.3 требует декларации естественного языка.
DISPLAYDOCTITLE-FALSEViewerPreferences/DisplayDocTitle не равен true. Требуется по ISO 14289-1 §7.1, чтобы заголовок документа отображался в строке заголовка окна.
DOCINFO-TITLE-MISSINGЗапись /Title словаря информации документа отсутствует или пуста. PDF/UA-1 требует заголовок документа, чтобы ассистивные технологии могли озвучить его при открытии. Проверка дополняет DISPLAYDOCTITLE-FALSE: та удостоверяет, что заголовок показан в просмотрщике, эта — что само значение заголовка существует. Задайте его вызовом SetInformation с ключом Title
XMP-NO-PDFUAIDПоток метаданных XMP не содержит записи pdfuaid:part. Требуется по ISO 14289-1 §7.2.
ANNOT-NO-CONTENTS:NN аннотаций, не освобождённых от требования (кроме подтипов Widget, PrinterMark и TrapNet), не имеют записи Contents. Требуется по ISO 14289-1 §7.18.1.
EMBED-NO-AFR:NN embedded files are missing an AFRelationship entry in their file specification dictionary. Required by ISO 14289-1 §7.11.
FIGURE-NO-ALT:NN структурных элементов Figure или Formula не имеют значения альтернативного текста. ISO 14289-1 §7.5 и ISO 32000-1 §14.9.3 требуют альтернативные описания как для графических рисунков, так и для математических формул.
HEADING-LEVEL-SKIP:NВ порядке следования документа обнаружено N скачков уровня заголовков (например, за H1 сразу следует H3, а H2 пропущен). ISO 14289-1 §7.1 и WCAG 2.x Success Criterion 1.3.1 требуют, чтобы заголовки вкладывались без пропусков.
STRUCT-UNCLOSED:NN элементов структуры остались открытыми, потому что EndTag вызывался не то число раз; в корне дерева структуры их не будет
TABLE-TH-NO-SCOPE:NУ N структурных элементов TH (ячейка заголовка таблицы) нет атрибута Scope. ISO 32000-1 §14.8.4.3.4, таблица 337, определяет Scope (Row, Column или Both) как атрибут, описывающий, к каким ячейкам данных применяется ячейка заголовка. Без него ассистивные технологии не могут надёжно связать заголовки с ячейками данных в сложных таблицах или таблицах с несколькими заголовками. Вызывайте SetStructElemScope (или AddTagAttribute с Owner='Table', Name='Scope') сразу после тегирования каждого элемента TH.
FORM-NO-TOOLTIP:NУ N интерактивных полей форм (аннотации Widget) нет записи TU (tooltip / доступное имя). ISO 14289-1 §7.18.4 требует, чтобы все интерактивные поля форм несли запись TU, чтобы ассистивные технологии могли сообщить пользователю назначение поля. /TU — доступное имя, которое зачитывают программы чтения с экрана; оно отлично от /T (частичное имя поля, используемое программно). Задавайте значение TU при создании или загрузке полей форм.
LIST-STRUCT:NN структурных элементов LI или LBody находятся вне требуемого родителя. ISO 32000-1 §14.8.4.4 требует, чтобы LI был прямым потомком L (list), а LBody — прямым потомком LI (list item). Испорченная вложенность списков мешает ассистивным технологиям корректно перемещаться по спискам. Проверьте последовательность вызовов BeginTag / EndTag у всех элементов, относящихся к спискам.
ROLEMAP-UNMAPPED:NВ документе присутствуют N пользовательских типов структурных элементов, но в словаре /RoleMap нет соответствующих записей. ISO 14289-1 §7.1 и ISO 32000-1 §14.7.3 требуют отображать каждый нестандартный тип структуры на стандартный тип PDF, чтобы ассистивные технологии понимали, как обращаться с элементом. Перед сохранением вызовите AddRoleMap для каждого пользовательского типа. В описании проблемы перечислены неотображённые имена типов.
SUSPECTS-TRUEMarkInfo/Suspects равен true. ISO 14289-1 §7.1 требует, чтобы файлы, заявляющие соответствие PDF/UA, имели значение Suspects false. Значение true помечает тегирование как заведомо содержащее ошибки. После полного тегирования документа вызовите SetMarkInfo, чтобы сбросить Suspects в false.
ROLEMAP-STANDARD-REMAP:NN стандартных типов структуры фигурируют как ключ "custom" в /RoleMap и при сохранении были бы перемаплены. ISO 14289-1 §7.1 запрещает перемаппинг стандартных тегов, определённых в ISO 32000-1 §14.8.4 (P, H1..H6, Figure, Table и т.д.). Строка деталей перечисляет проблемные имена стандартных тегов. Удалите затронутые вызовы AddRoleMap.
DC-TITLE-MISSINGВ потоке метаданных XMP отсутствует или пуста запись Dublin Core dc:title. ISO 14289-1 §7.1 требует, чтобы поток Metadata содержал запись dc:title, однозначно идентифицирующую документ. Эта проверка выполняется отдельно от DOCINFO-TITLE-MISSING, который проверяет только запись /Info /Title. Вызовите SetPDFUAMode, чтобы скопировать заголовок /Info в пакет XMP.
TRAPNET-ANNOT:NНа страницах документа найдено N аннотаций TrapNet. ISO 14289-1 §7.18.2 прямо запрещает TrapNet в файлах, соответствующих PDF/UA-1. Удалите проблемные аннотации перед сохранением.
ANNOT-PAGE-NO-TABS-S:NN страниц содержат одну или несколько аннотаций, но словарь страницы не задаёт /Tabs /S. ISO 14289-1 §7.18.3 требует, чтобы порядок табуляции на таких страницах следовал дереву структуры, на что указывает /Tabs /S. Задайте /Tabs /S в словаре каждой страницы, содержащей аннотации.
ENCRYPT-NO-ACCESSДокумент зашифрован, PDFUAMode активен, но бит 10 ключа разрешений шифрования /P (маска $200, извлечение для доступности) сброшен. ISO 14289-1 §7.16 требует, чтобы каждый зашифрованный соответствующий файл разрешал извлечение для доступности. Если PDFUAMode установлен до вызова Encrypt, бит включается автоматически; при обратном порядке вызовов словарь шифрования уже записан со старым значением /P — вызовите Encrypt ещё раз, чтобы словарь был записан заново
FIRST-HEADING-NOT-H1Первый по порядку документа заголовочный элемент — не H1 (в сильно структурированных документах тег H тоже считается уровнем 1). ISO 14289-1 §7.4.2 требует, чтобы первый заголовочный тег не-сильно-структурированного документа был H1; строка с деталями называет проблемный уровень
WIDGET-NO-STRUCTPARENT:NN Widget-аннотаций без записи /StructParent. ISO 14289-1 §7.18.4 требует, чтобы Widget-аннотации были вложены в структурный тег Form; без /StructParent Widget вообще недостижим из дерева структуры. Строка деталей сообщает количество. Проверка частичная — полная верификация, что разрешённый родитель имеет /S = Form, пока не реализована
LIST-NO-NUMBERING:NN элементов структуры L (list) без атрибута ListNumbering. ISO 14289-1 §7.6 требует, чтобы каждый тег L объявлял стиль нумерации этим атрибутом (допустимые значения по ISO 32000-1 Table 347: None, Disc, Circle, Square, Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha). Вызывайте SetStructElemListNumbering после открытия каждого тега L
MULTIPLE-H-CHILDREN:NN узлов дерева структуры содержат более одного прямого дочернего элемента H (общий заголовок). ISO 14289-1 §7.4.4 это запрещает — разделите родительский раздел или замените теги H нумерованными последовательностями H1..H6.

Возвращаемое значение

A newline-separated string of issue descriptions, or an empty string if no compliance issues are detected.

Примечания

Диагностический инструмент для разработчиков: проверяет текущее состояние документа в памяти и сообщает о проблемах, способных привести к провалу валидации PDF/UA-1. Вызывайте после загрузки или сборки документа, чтобы найти проблемы до сохранения

Когда активен SetPDFUAMode и документ сохраняется, часть проблем (ANNOT-NO-CONTENTS, EMBED-NO-AFR) автоматически исправляется при сохранении. GetPDFUADiagnostics сообщает состояние до сохранения; проблемы, которые будут исправлены при сохранении, всё равно перечисляются, если присутствуют

Функция не изменяет документ

Пример

var
  Diag: WideString;
begin
  PDFlib.SetPDFUAMode('en-US');
  // ... build document
  Diag := PDFlib.GetPDFUADiagnostics;
  if Diag <> '' then
    ShowMessage('PDF/UA issues found:'#10 + Diag);
end;

См. также

SetPDFUAMode, SetDocumentLanguage, SetEmbeddedFileAFRelationship