CheckFileComplianceA

Conformidade, inspeção de documentos

Descrição

O sufixo A indica o ponto de entrada ANSI (char) da DLL; a superfície ActiveX/COM expõe apenas a forma Unicode. O comportamento é idêntico ao de CheckFileCompliance e os argumentos de string são interpretados usando a página de código atual definida por SetAnsiMode

Lê um arquivo PDF externo e o valida contra um padrão de conformidade ISO escolhido. O valor retornado é zero (o arquivo passa limpo no teste escolhido) ou um handle StringListID não nulo que lista todo problema detectado. Cada entrada da lista é um código curto, dois-pontos e uma mensagem legível — exatamente o mesmo formato de código usado por GetPDFUADiagnostics. Enumere o resultado com GetStringListCount e GetStringListItem.

O teste PDF/A cobre todos os seis modos de conformidade (PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-3a, PDF/A-3b) e lê as entradas XMP pdfaid:part/pdfaid:conformance para decidir qual conjunto de regras aplicar.

O teste PDF/UA-1 (adicionado na v3.56.0) confere um PDF externo contra a ISO 14289-1 e emite códigos de diagnóstico na faixa 10xxx, para que permaneçam visualmente separados dos códigos 00xxx do PDF/A.

Sintaxe

Delphi

Function DLCheckFileComplianceA(InstanceID: Integer; InputFileName, Password: PAnsiChar; ComplianceTest, Options: Integer): Integer;

DLL

int DLCheckFileComplianceA(int InstanceID, const char * InputFileName, const char * Password, int ComplianceTest, int Options);

Parâmetros

InputFileNameCaminho completo do arquivo PDF a validar. O arquivo é aberto somente leitura e não é modificado.
PasswordSenha usada para abrir o arquivo. Passe uma string vazia para documentos não criptografados. Note that an encrypted document fails the PDF/A test (code 00006) regardless of whether the correct password is supplied — PDF/A forbids encryption.
ComplianceTestO padrão contra o qual validar.

1 — PDF/A (ISO 19005-1/-2/-3, todos os seis níveis de conformidade).
2 — PDF/UA-1 (ISO 14289-1:2014, PDF acessível).
OptionsBit flags que modificam o teste.

0 — Padrão: relata todo problema encontrado no documento.
1 — Para após o primeiro problema e retorna imediatamente. Útil quando o chamador só precisa de um sinal de aprovação/reprovação.

Valores retornados

0O arquivo está conforme com o padrão escolhido.
Non-zeroUm handle StringListID cujas entradas descrevem cada não conformidade detectada. O handle permanece válido até o documento ser fechado ou ReleaseStringList ser chamada.

PDF/A issue codes (ComplianceTest = 1)

00002A versão do PDF excede o máximo permitido pelo nível de conformidade (PDF/A-1 limita em 1.4; PDF/A-2 e PDF/A-3 limitam em 1.7). A linha de detalhe informa a versão em questão e o máximo permitido.
00003O Catalog contém /OCProperties (conteúdo opcional / camadas), proibido pelo PDF/A-1. O PDF/A-2 e o PDF/A-3 permitem camadas e não disparam esta verificação.
00005O par XMP pdfaid:part+pdfaid:conformance está ausente, malformado, ou contém um valor fora do conjunto legal 1A, 1B, 2A, 2B, 3A, 3B. A biblioteca não consegue determinar qual conjunto de regras aplicar, então isso é reportado como ocorrência fatal, independente de Options.
00006O documento está criptografado. O PDF/A proíbe criptografia em todos os parts.
00007O Catalog não tem entrada /OutputIntents. Todos os parts do PDF/A exigem um output intent, para que o espaço de cores de renderização fique definido sem ambiguidade.
00011O Catalog não tem entrada /MarkInfo. Exigido apenas para conformidade de nível a (PDF/A-1a, 2a, 3a) — o PDF marcado precisa se declarar.
00012O Catalog não tem entrada /StructTreeRoot. Exigido apenas para conformidade de nível a. Um documento de PDF marcado deve ter uma árvore de estruturas lógica.

PDF/UA-1 issue codes (ComplianceTest = 2)

10001O stream de metadados XMP não contém pdfuaid:part, ou o valor não é 1. A ISO 14289-1 §5 exige que um arquivo conforme se identifique por esta propriedade; a ISO 14289-1 §6.2 proíbe reportar conformidade sem ela.
10002O Catalog do documento não tem stream /Metadata. A declaração de conformidade PDF/UA-1 é registrada dentro deste stream; sem ele, o arquivo não pode se anunciar como acessível.
10003O dicionário /MarkInfo do Catalog está ausente ou /Marked não é true. A ISO 14289-1 §7.1 exige que todo arquivo conforme se declare como marcado, para que a tecnologia assistiva possa confiar na árvore de estruturas.
10004O Catalog não tem entrada /StructTreeRoot. Um arquivo PDF/UA-1 deve incluir uma árvore de estruturas lógica descrevendo a ordem de leitura e a semântica do documento.
10005O dicionário /ViewerPreferences está ausente ou a entrada /DisplayDocTitle dele não é true. A ISO 14289-1 §7.1 exige que readers conformes exponham o título do documento no chrome da janela deles, em vez do nome do arquivo.
10006A entrada /Lang do Catalog está ausente ou vazia. A ISO 14289-1 §7.2 (referindo-se à ISO 32000-1 §14.9.2) exige que todo arquivo conforme declare o idioma natural dele, para que screen readers selecionem a voz e as regras de pronúncia corretas.
10007O stream de metadados XMP não carrega um dc:title Dublin Core não vazio. A ISO 14289-1 §7.1 exige "uma entrada dc:title que identifique claramente o documento".
10008O dicionário /MarkInfo tem /Suspects definido como true. ISO 14289-1 §7.1: arquivos que declaram conformidade PDF/UA precisam ter valor Suspects igual a false — um valor true marca a marcação como sabidamente contendo erros.
10009O /RoleMap do documento remapeia um ou mais tipos de estrutura padrão. ISO 14289-1 §7.1: tags padrão definidas na ISO 32000-1 §14.8.4 (P, H1..H6, Figure, Table etc.) não devem ser remapeadas. A linha de detalhe nomeia a primeira tag padrão que foi remapeada.
10010O arquivo está criptografado, mas o bit 10 da chave de permissões /P de criptografia (máscara 512, "Extract for accessibility") não está definido. A ISO 14289-1 §7.16 exige que todo arquivo criptografado conforme permita a extração para acessibilidade, para que a tecnologia assistiva alcance o conteúdo.
10011Foi detectado um formulário XFA dinâmico: o pacote XFA XDP contém <dynamicRender>required</dynamicRender>. A ISO 14289-1 §7.15 proíbe formulários XFA dinâmicos em arquivos conformes; XFA estático é permitido.
10012Foi detectado um Reference XObject (Form XObject com entrada /Ref). A ISO 14289-1 §7.20 proíbe reference XObjects porque permitem que um PDF embuta outro por referência sem expor o conteúdo referenciado à tecnologia assistiva.
10013Uma ou mais anotações TrapNet foram detectadas. A ISO 14289-1 §7.18.2 proíbe explicitamente TrapNet em arquivos conformes. A linha de detalhe informa quantas anotações foram encontradas.
10014Uma ou mais páginas têm anotações mas não definem /Tabs /S no dicionário de página delas. A ISO 14289-1 §7.18.3 exige que a ordem de tabulação nessas páginas siga a árvore de estruturas, o que é sinalizado por /Tabs /S. A linha de detalhe reporta a contagem de páginas em questão.
10015Uma ou mais anotações Link não têm uma descrição alternativa /Contents não vazia. A ISO 14289-1 §7.18.5 exige que cada anotação Link carregue uma descrição acessível, para que screen readers possam anunciar o alvo do link. A linha de detalhe reporta a contagem de anotações Link em questão.
10016Um ou mais dicionários FileSpec de arquivos embutidos não têm a chave de nome de arquivo /F. A ISO 14289-1 §7.11 exige que todo FileSpec de arquivo embutido carregue tanto /F quanto /UF.
10017Um ou mais dicionários FileSpec de arquivos embutidos não têm a chave de nome de arquivo Unicode /UF. A ISO 14289-1 §7.11 exige que todo FileSpec de arquivo embutido carregue tanto /F quanto /UF.
10018Um ou mais dicionários de configuração de conteúdo opcional não têm uma text string /Name não vazia. A ISO 14289-1 §7.10 exige que todo dicionário de configuração de OCG (a entrada padrão D mais todo dicionário em OCProperties/Configs) carregue um /Name não vazio.
10019Um ou mais dicionários de configuração de conteúdo opcional contêm a chave proibida /AS. A ISO 14289-1 §7.10 proíbe explicitamente /AS em qualquer dicionário de configuração de OCG, para evitar ajustes automáticos de estado guiados por informações de uso.
10020Uma ou mais fontes fora das Standard 14 referenciadas pelo documento não embutem o programa de fonte delas (nenhuma entrada FontFile, FontFile2 ou FontFile3 no FontDescriptor). A ISO 14289-1 §7.21.4.1 exige que toda fonte usada para renderizar embuta o programa dela. Fontes Type 3 pulam esta verificação porque os glifos delas são CharProcs inline.
10021Um ou mais descendentes CIDFontType2 não têm a entrada /CIDToGIDMap. A ISO 14289-1 §7.21.3.2 exige que todo CIDFont Type 2 embutido carregue /CIDToGIDMap (como um stream que mapeia CIDs para índices de glifo, ou como o nome Identity).
10022Uma ou mais fontes Standard 14 (Helvetica, Times, Courier, Symbol, ZapfDingbats e as variantes bold/oblique delas) são referenciadas sem um programa de fonte embutido. A ISO 14289-1 §7.21.4 NOTA 5 deixa claro que não há isenção de embutimento para as 14 fontes Type 1 padrão.
10023Uma ou mais fontes não têm uma CMap /ToUnicode e não se encaixam na lista de isenções da §7.21.7. A lista cobre as codificações predefinidas MacRomanEncoding / MacExpertEncoding / WinAnsiEncoding, fontes Type 0 cujo CIDFont descendente usa as coleções de caracteres Adobe GB1 / CNS1 / Japan1 / Korea1, e fontes TrueType não simbólicas.
10024O primeiro elemento de título na ordem do documento não é H1 (ou o H de documento fortemente estruturado). ISO 14289-1 §7.4.2: "Se tags de título forem usadas, H1 deve ser o primeiro."
10025One or more heading-level skips were detected in document order — e.g. an H1 immediately followed by an H3, skipping H2. ISO 14289-1 §7.4.2 requires descending heading sequences to proceed in strict numerical order without skipping intervening levels.
10026Uma ou mais anotações Widget não têm a entrada /StructParent. A ISO 14289-1 §7.18.4 exige que anotações Widget estejam aninhadas dentro de uma tag de estrutura Form; sem /StructParent o Widget não tem como ser alcançado a partir da árvore de estruturas. A linha de detalhe reporta a contagem.
10027Uma ou mais anotações Widget têm uma entrada /StructParent, mas o valor não resolve por StructTreeRoot/ParentTree até um elemento de estrutura com /S = Form. A ISO 14289-1 §7.18.4 exige que toda anotação Widget esteja aninhada dentro de uma tag de estrutura Form. Causas possíveis: a entrada /ParentTree falta por completo, aponta para algo que não é um StructElem (inteiro bruto / dicionário MCR) ou nomeia uma tag que não é Form.
10028One or more non-symbolic TrueType fonts have /Encoding (or an Encoding dictionary's /BaseEncoding) that is not MacRomanEncoding or WinAnsiEncoding. ISO 14289-1 §7.21.6 restricts non-symbolic TrueType encoding to these two predefined names.
10029Uma ou mais fontes TrueType simbólicas carregam uma entrada /Encoding no dicionário da fonte. O quarto parágrafo da ISO 14289-1 §7.21.6 proíbe isso — a codificação TrueType simbólica deve ser expressa apenas pela tabela cmap do programa de fonte embutido.
10030Um ou mais elementos de estrutura L (list) não têm o atributo ListNumbering. A ISO 14289-1 §7.6 exige que toda tag L declare o estilo de numeração dela por este atributo. Valores válidos: None, Disc, Circle, Square, Decimal, UpperRoman, LowerRoman, UpperAlpha e LowerAlpha (Tabela 347 da ISO 32000-1).
10031Uma ou mais anotações Link carregam um dicionário de ação URI cuja entrada /IsMap é true. A ISO 14289-1 §7.18.5 proíbe /IsMap = true em uma ação URI, a menos que funcionalidade equivalente seja fornecida em outra parte do conteúdo sem a chave /IsMap. Autores com um caso de uso legítimo de IsMap devem suprimir este diagnóstico por conta própria.
10032Um ou mais elementos de estrutura Note não têm a entrada /ID. A ISO 14289-1 §7.9 exige que toda tag Note declare um /ID único, para que referências cruzadas possam cair em um alvo estável.
10033Dois ou mais elementos de estrutura Note compartilham o mesmo valor de /ID. A linha de detalhe reporta o número de pares duplicados detectados. A ISO 14289-1 §7.9 exige que os IDs de Note sejam únicos no documento.
10034Um ou mais programas TrueType não simbólicos (FontDescriptor com o flag Symbolic limpo, stream FontFile2 presente) embutem uma tabela cmap cuja única subtabela é a entrada simbólica (3,0) da Microsoft. O primeiro parágrafo da ISO 14289-1 §7.21.6 exige ao menos uma subtabela cmap não simbólica, para que o programa possa renderizar os codepoints declarados pelo /Encoding dele.
10035Uma ou mais fontes TrueType não simbólicas declaram um /Encoding com um array /Differences contendo nomes de glifo que não são membros da Adobe Glyph List 2.0. .notdef está na lista de permissões porque a especificação implicitamente o permite. O terceiro parágrafo da ISO 14289-1 §7.21.6 exige que toda entrada de Differences caia na AGL.
10042Um ou mais dicionários de media clip data (identificados por /S /MCD, opcionalmente /Type /MediaClip) não têm a entrada obrigatória de content-type /CT. A ISO 14289-1 §7.18.6 promove esta chave opcional da Tabela 274 da ISO 32000-1 a obrigatória.
10043Um ou mais dicionários de media clip data não têm o array obrigatório /Alt (pares de string de idioma + texto alternativo). A ISO 14289-1 §7.18.6 promove esta chave opcional da Tabela 274 da ISO 32000-1 a obrigatória, para que a tecnologia assistiva possa anunciar uma descrição da multimídia embutida.
10044Um ou mais nós da árvore de estrutura carregam mais de um filho H (heading genérico) direto. A ISO 14289-1 §7.4.4 proíbe isso explicitamente — divida a seção ou substitua as tags H por níveis numerados H1..H6.

Observações

O teste PDF/A serve como autoverificação rápida antes da entrega. Ele captura os problemas de nível de documento que desqualificam um arquivo de imediato (versão de PDF errada, OutputIntent ausente, árvore de estrutura ausente no nível A, criptografia, layers no PDF/A-1). Ele não percorre cada operador de content stream nem verifica embutimento de fonte ou referências de color space para cada objeto pintado — essas validações exigem um validador PDF/A dedicado (como o veraPDF). Use esta função como checagem de primeira linha e como gate de regressão em pipelines de build. Use CreatePreflightReport ou SavePreflightReport quando quiser que a biblioteca formate as listas de problemas em um relatório de texto reutilizável. Use CreatePreflightReportEx ou SavePreflightReportEx para saída de relatório em texto, JSON, HTML ou CSV, ou veja Preflight Reports para o fluxo completo de relatórios.

A API companheira GetPDFUADiagnostics executa verificações análogas para PDF/UA-1 (ISO 14289-1) no documento em memória que está sendo construído, em vez de em um arquivo externo.

Ao produzir saída PDF/A com esta biblioteca, chame SetPDFAMode antes de adicionar qualquer conteúdo. O guarda do lado da geração dentro de SetPDFAMode bloqueia as operações proibidas pelo part escolhido, então um documento construído assim normalmente passa no CheckFileCompliance automaticamente.

Exemplo

// Validate a delivered PDF/A file and print all issues
var
  Issues, Count, I: Integer;
begin
  Issues := PDF.CheckFileCompliance('archive.pdf', '', 1, 0);
  if Issues = 0 then
    WriteLn('archive.pdf: PDF/A conformant')
  else
  begin
    Count := PDF.GetStringListCount(Issues);
    WriteLn('archive.pdf: ', Count, ' PDF/A issue(s) detected:');
    for I := 1 to Count do
      WriteLn('  ', PDF.GetStringListItem(Issues, I));
  end;
end;

// Fast pass/fail gate in a CI pipeline — stop on the first issue
var
  Failed: Boolean;
begin
  Failed := PDF.CheckFileCompliance('build/output.pdf', '', 1, 1) <> 0;
  if Failed then
    Halt(1);
end;

Veja também

Preflight Reports, CreatePreflightReport, CreatePreflightReportEx, SavePreflightReport, SavePreflightReportEx, ComparePreflightReports, SetPDFAMode, GetPDFUADiagnostics, GetStringListCount, GetStringListItem, SetPDFUAMode