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-FALSE | MarkInfo/Marked не равен true; документ не является тегированным PDF |
| LANG-MISSING | Запись /Lang в каталоге документа отсутствует или пуста. ISO 14289-1 §7.3 требует декларации естественного языка. |
| DISPLAYDOCTITLE-FALSE | ViewerPreferences/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:N | N аннотаций, не освобождённых от требования (кроме подтипов Widget, PrinterMark и TrapNet), не имеют записи Contents. Требуется по ISO 14289-1 §7.18.1. |
| EMBED-NO-AFR:N | N embedded files are missing an AFRelationship entry in their file specification dictionary. Required by ISO 14289-1 §7.11. |
| FIGURE-NO-ALT:N | N структурных элементов 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:N | N элементов структуры остались открытыми, потому что 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:N | N структурных элементов 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-TRUE | MarkInfo/Suspects равен true. ISO 14289-1 §7.1 требует, чтобы файлы, заявляющие соответствие PDF/UA, имели значение Suspects false. Значение true помечает тегирование как заведомо содержащее ошибки. После полного тегирования документа вызовите SetMarkInfo, чтобы сбросить Suspects в false. |
| ROLEMAP-STANDARD-REMAP:N | N стандартных типов структуры фигурируют как ключ "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:N | N страниц содержат одну или несколько аннотаций, но словарь страницы не задаёт /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:N | N Widget-аннотаций без записи /StructParent. ISO 14289-1 §7.18.4 требует, чтобы Widget-аннотации были вложены в структурный тег Form; без /StructParent Widget вообще недостижим из дерева структуры. Строка деталей сообщает количество. Проверка частичная — полная верификация, что разрешённый родитель имеет /S = Form, пока не реализована |
| LIST-NO-NUMBERING:N | N элементов структуры 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:N | N узлов дерева структуры содержат более одного прямого дочернего элемента 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