CheckFileCompliance

Conformidade, inspeção de documentos

Descrição

Lê um ficheiro PDF externo e valida-o contra uma norma de conformidade ISO à escolha; o valor devolvido é zero (o ficheiro passa limpamente o teste escolhido) ou um identificador StringListID não zero que lista cada problema detetado; cada entrada da lista é um código curto, dois-pontos e uma mensagem legível por humanos — exatamente o mesmo formato de código usado por GetPDFUADiagnostics; enumere o resultado com GetStringListCount e GetStringListItemO teste PDF/A cobre 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 que conjunto de regras aplicarO teste PDF/UA-1 (adicionado na v3.56.0) verifica um PDF externo contra a ISO 14289-1 e emite códigos de diagnóstico no intervalo

10xxx, de modo a permanecerem visualmente separados dos códigos PDF/A 00xxx

Sintaxe

Delphi

Function TPDFlib.CheckFileCompliance(Const InputFileName, Password: WideString; ComplianceTest, Options: Integer): Integer;

ActiveX

Function PDFlib::CheckFileCompliance(InputFileName As String, Password As String, ComplianceTest As Long, Options As Long) As Long

DLL

int DLCheckFileCompliance(int InstanceID, const wchar_t * InputFileName, const wchar_t * Password, int ComplianceTest, int Options);

Parâmetros

InputFileNameCaminho completo do ficheiro PDF a validar; o ficheiro é aberto só de leitura e não é modificado
PasswordPalavra-passe usada para abrir o ficheiro; passe uma cadeia vazia para documentos não encriptados; note que um documento encriptado falha o teste PDF/A (código 00006), independentemente de a palavra-passe correta ser fornecida — o PDF/A proíbe a encriptação
ComplianceTestA norma a verificar.

1 — PDF/A (ISO 19005-1/-2/-3, os seis níveis de conformidade).
2 — PDF/UA-1 (ISO 14289-1:2014, PDF acessível).
3 — PDF/X (ISO 15930, incluindo a família PDF/X-6).
4 — PDF/VT-3 (ISO 16612-3:2020 sobre uma base da família PDF/X-6).
5 — troca restrita de imagens raster PDF/R-1.
6 — modelos de substituição de conteúdo variável PDF/VCR-1.
7 — troca de documentos de engenharia PDF/E-1
OptionsSinalizadores de bits que modificam o teste.

0 — Predefinição: comunicar todos os problemas encontrados no documento.
1 — Parar após o primeiro problema e devolver imediatamente; útil quando o chamador só precisa de um sinal de aprovação/reprovação

Valores devolvidos

0O ficheiro está conforme a norma escolhida
Não zeroUm identificador StringListID cujas entradas descrevem cada não conformidade detetada; o identificador permanece válido até o documento ser fechado ou ser chamada ReleaseStringList

Códigos de problemas PDF/A (ComplianceTest = 1)

00002A versão de PDF excede o máximo permitido pelo nível de conformidade (o PDF/A-1 limita a 1.4; o PDF/A-2 e o PDF/A-3 limitam a 1.7); a linha de detalhe indica a versão em causa e o máximo permitido
00003O catálogo 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 acionam esta verificação
00005O par XMP pdfaid:part+pdfaid:conformance está em falta, é malformado ou contém um valor fora do conjunto legal 1A, 1B, 2A, 2B, 3A, 3B; a biblioteca não consegue determinar que conjunto de regras aplicar, pelo que isto é comunicado como um problema fatal independentemente de Options
00006O documento está encriptado; o PDF/A proíbe a encriptação em todas as partes
00007O catálogo não tem entrada /OutputIntents; todas as partes do PDF/A exigem uma intenção de saída para que o espaço de cor de renderização fique definido sem ambiguidade
00011O catálogo não tem entrada /MarkInfo; exigido apenas para a conformidade de nível a (PDF/A-1a, 2a, 3a) — o PDF etiquetado tem de declarar-se
00012O catálogo não tem entrada /StructTreeRoot; exigido apenas para a conformidade de nível a; um documento PDF etiquetado tem de ter uma árvore de estrutura lógica

Códigos de problemas PDF/UA-1 (ComplianceTest = 2)

10001O fluxo de metadados XMP não contém pdfuaid:part, ou o valor não é 1; a ISO 14289-1 §5 exige que um ficheiro conforme se identifique através desta propriedade; a ISO 14289-1 §6.2 proíbe comunicar conformidade sem ela
10002O catálogo do documento não tem fluxo /Metadata; uma declaração de conformidade PDF/UA-1 é registada dentro deste fluxo; sem ele, o ficheiro não se pode anunciar como acessível
10003O dicionário /MarkInfo do catálogo está em falta ou /Marked não é true; a ISO 14289-1 §7.1 exige que cada ficheiro conforme se declare como etiquetado, para que a tecnologia de apoio possa confiar na árvore de estrutura
10004O catálogo não tem entrada /StructTreeRoot; um ficheiro PDF/UA-1 tem de incluir uma árvore de estrutura lógica que descreva a ordem de leitura e a semântica do documento
10005O dicionário /ViewerPreferences está em falta ou a sua entrada /DisplayDocTitle não é true; a ISO 14289-1 §7.1 exige que os leitores conformes apresentem o título do documento no respetivo contorno de janela em vez do nome do ficheiro
10006A entrada /Lang do catálogo está em falta ou vazia; a ISO 14289-1 §7.2 (referindo à ISO 32000-1 §14.9.2) exige que cada ficheiro conforme declare a sua língua natural, para que os leitores de ecrã selecionem as regras corretas de voz e pronúncia
10007O fluxo de metadados XMP não transporta 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; a ISO 14289-1 §7.1: os ficheiros que declaram conformidade PDF/UA têm de ter um valor Suspects de false — um valor true marca a etiquetagem como sabidamente propensa a erros
10009O /RoleMap do documento remapeia um ou mais tipos de estrutura padrão; a ISO 14289-1 §7.1: as etiquetas 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 indica a primeira etiqueta padrão remapeada
10010O ficheiro está encriptado, mas o bit 10 da chave de permissões de encriptação /P (máscara 512, «extração para acessibilidade») não está definido; a ISO 14289-1 §7.16 exige que cada ficheiro conforme encriptado permita a extração para acessibilidade, para que a tecnologia de apoio alcance o conteúdo
10011Foi detetado um formulário XFA dinâmico: o pacote XDP XFA contém <dynamicRender>required</dynamicRender>; a ISO 14289-1 §7.15 proíbe formulários XFA dinâmicos em ficheiros conformes; o XFA estático é permitido
10012Foi detetado um Reference XObject (um Form XObject que transporta uma entrada /Ref); a ISO 14289-1 §7.20 proíbe reference XObjects porque permitem que um PDF incorpore outro por referência sem expor o conteúdo referenciado à tecnologia de apoio
10013Foram detetadas uma ou mais anotações TrapNet; a ISO 14289-1 §7.18.2 proíbe explicitamente TrapNet em ficheiros conformes; a linha de detalhe comunica quantas anotações foram encontradas
10014Uma ou mais páginas transportam anotações mas não definem /Tabs /S no respetivo dicionário de página; a ISO 14289-1 §7.18.3 exige que a ordem de tabulação nessas páginas siga a árvore de estrutura, sinalizada por /Tabs /S; a linha de detalhe comunica a contagem de páginas em causa
10015Uma ou mais anotações Link carecem de uma descrição alternativa /Contents não vazia; a ISO 14289-1 §7.18.5 exige que cada anotação Link transporte uma descrição acessível, para que os leitores de ecrã anunciem o destino da ligação; a linha de detalhe comunica a contagem de anotações Link em causa
10016Um ou mais dicionários FileSpec de ficheiros incorporados carecem da chave de nome de ficheiro /F; a ISO 14289-1 §7.11 exige que cada FileSpec de ficheiro incorporado transporte tanto /F como /UF
10017Um ou mais dicionários FileSpec de ficheiros incorporados carecem da chave de nome de ficheiro Unicode /UF; a ISO 14289-1 §7.11 exige que cada FileSpec de ficheiro incorporado transporte tanto /F como /UF
10018Um ou mais dicionários de configuração de conteúdo opcional carecem de uma cadeia de texto /Name não vazia; a ISO 14289-1 §7.10 exige que cada dicionário de configuração OCG (a entrada predefinida D mais cada dicionário em OCProperties/Configs) transporte 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 OCG, para evitar ajustes automáticos de estado orientados por informação de utilização
10020Um ou mais tipos de letra fora dos Standard 14 referenciados pelo documento não incorporam o respetivo programa de tipo de letra (sem entrada FontFile, FontFile2 ou FontFile3 no FontDescriptor); a ISO 14289-1 §7.21.4.1 exige que cada tipo de letra usado para renderização incorpore o seu programa; os tipos de letra Type 3 ignoram esta verificação porque os seus glifos são CharProcs em linha
10021Um ou mais descendentes CIDFontType2 carecem da entrada /CIDToGIDMap; a ISO 14289-1 §7.21.3.2 exige que cada CIDFont Type 2 incorporado transporte /CIDToGIDMap (quer como um fluxo que mapeia CIDs para índices de glifos, quer como o nome Identity)
10022Um ou mais tipos de letra Standard 14 (Helvetica, Times, Courier, Symbol, ZapfDingbats e as suas variantes negrito / oblíquo) são referenciados sem um programa de tipo de letra incorporado; a ISO 14289-1 §7.21.4 NOTA 5 deixa claro que não há isenção de incorporação para os 14 tipos de letra Type 1 padrão
10023Um ou mais tipos de letra carecem de um CMap /ToUnicode e não correspondem à lista de isenções da §7.21.7; a lista de isenções cobre as codificações predefinidas MacRomanEncoding / MacExpertEncoding / WinAnsiEncoding, os tipos de letra Type 0 cujo CIDFont descendente usa as coleções de carateres Adobe GB1 / CNS1 / Japan1 / Korea1, e os tipos de letra TrueType não simbólicos
10024O primeiro elemento de título pela ordem do documento não é H1 (ou o H fortemente estruturado); ISO 14289-1 §7.4.2: «se forem usadas etiquetas de título, o H1 deve ser o primeiro»
10025Foram detetados um ou mais saltos de nível de título pela ordem do documento — por exemplo, um H1 imediatamente seguido de um H3, saltando o H2; a ISO 14289-1 §7.4.2 exige que as sequências descendentes de títulos progridam em ordem numérica estrita sem saltar níveis intermédios
10026Uma ou mais anotações Widget carecem de uma entrada /StructParent; a ISO 14289-1 §7.18.4 exige que as anotações Widget estejam aninhadas numa etiqueta de estrutura Form; sem /StructParent, o Widget não pode de modo algum ser alcançado a partir da árvore de estrutura; a linha de detalhe comunica a contagem
10027Uma ou mais anotações Widget têm uma entrada /StructParent, mas o valor não se resolve através de StructTreeRoot/ParentTree até a um elemento de estrutura com /S = Form; a ISO 14289-1 §7.18.4 exige que cada anotação Widget esteja aninhada numa etiqueta de estrutura Form; causas possíveis: a entrada /ParentTree está totalmente em falta, aponta para um não StructElem (inteiro bruto / dicionário MCR) ou nomeia uma etiqueta que não é Form
10028Um ou mais tipos de letra TrueType não simbólicos têm /Encoding (ou o /BaseEncoding dum dicionário Encoding) que não é MacRomanEncoding nem WinAnsiEncoding; a ISO 14289-1 §7.21.6 restringe a codificação TrueType não simbólica a estes dois nomes predefinidos
10029Um ou mais tipos de letra TrueType simbólicos transportam uma entrada /Encoding no dicionário do tipo de letra; o quarto parágrafo da ISO 14289-1 §7.21.6 proíbe-no — a codificação TrueType simbólica tem de ser expressa apenas através da tabela cmap do programa de tipo de letra incorporado
10030Um ou mais elementos de estrutura L (lista) carecem do atributo ListNumbering; a ISO 14289-1 §7.6 exige que cada etiqueta L declare o seu estilo de numeração através deste atributo; os valores válidos são None, Disc, Circle, Square, Decimal, UpperRoman, LowerRoman, UpperAlpha e LowerAlpha (ISO 32000-1 Tabela 347)
10031Uma ou mais anotações Link transportam um dicionário de ação URI cuja entrada /IsMap é true; a ISO 14289-1 §7.18.5 proíbe /IsMap = true numa ação URI, a menos que funcionalidade equivalente seja fornecida noutro ponto do conteúdo sem uma chave /IsMap; os autores com um caso de utilização legítimo de IsMap devem suprimir este diagnóstico por sua conta
10032Um ou mais elementos de estrutura Note carecem da entrada /ID; a ISO 14289-1 §7.9 exige que cada etiqueta Note declare um /ID único, para que as referências cruzadas possam aterrar num destino estável
10033Dois ou mais elementos de estrutura Note partilham o mesmo valor /ID; a linha de detalhe comunica o número de pares duplicados detetados; 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 sinalizador Symbolic limpo, com fluxo FontFile2 presente) incorporam uma tabela cmap cuja única subtabla é a entrada simbólica (3,0) da Microsoft; o primeiro parágrafo da ISO 14289-1 §7.21.6 exige pelo menos uma subtabla cmap não simbólica, para que o programa possa renderizar os pontos de código declarados pelo seu /Encoding
10035Um ou mais tipos de letra TrueType não simbólicos declaram um /Encoding com uma matriz /Differences contendo nomes de glifos que não são membros da Adobe Glyph List 2.0; .notdef está na lista de permissões porque a especificação o permite implicitamente; o terceiro parágrafo da ISO 14289-1 §7.21.6 exige que cada entrada Differences caia na AGL
10036Uma ou mais larguras de tipos de letra TrueType simples diferem das métricas correspondentes no programa de tipo de letra incorporado por mais de um milésimo de um em; a ISO 14289-1 §7.21.5 exige que a matriz /Widths concorde com as métricas dos glifos incorporados
10037Uma ou mais larguras de CIDFontType2 diferem das métricas correspondentes no programa TrueType incorporado por mais de um milésimo de um em; a ISO 14289-1 §7.21.5 exige que a matriz /W concorde com as métricas dos glifos incorporados
10038Um /CharSet de descritor de tipo de letra Type 1 omite um ou mais nomes de glifos presentes no respetivo programa de tipo de letra incorporado; a ISO 14289-1 §7.21.4.2 exige que a entrada enumere cada glifo incorporado
10039Um /CIDSet de descritor de fonte CID omite um ou mais CIDs que mapeiam para glifos no respetivo programa de tipo de letra incorporado; a ISO 14289-1 §7.21.4.2 exige que o conjunto de bits identifique cada CID incorporado
10040Um Form XObject contendo texto é invocado a partir de conteúdo de página fora de conteúdo marcado; a ISO 14289-1 §7.20 exige que o conteúdo de um Form XObject seja incorporado em elementos de estrutura
10041Um ou mais operandos de mostragem de texto resolvem para o glifo .notdef; a ISO 14289-1 §7.21.8 proíbe referências a .notdef independentemente do modo de renderização de texto
10042Um ou mais dicionários de dados de corte de média (identificados por /S /MCD, opcionalmente /Type /MediaClip) carecem da entrada de tipo de conteúdo /CT exigida; a ISO 14289-1 §7.18.6 promove esta chave opcional da ISO 32000-1 Tabela 274 a exigida
10043Um ou mais dicionários de dados de corte de média carecem da matriz /Alt exigida (pares de cadeia de língua + texto alternativo); a ISO 14289-1 §7.18.6 promove esta chave opcional da ISO 32000-1 Tabela 274 a exigida, para que a tecnologia de apoio possa anunciar uma descrição da multimédia incorporada
10044Um ou mais nós da árvore de estrutura transportam mais do que um filho direto H (título genérico); a ISO 14289-1 §7.4.4 proíbe-no explicitamente — divida a secção, ou substitua as etiquetas H por níveis numerados H1..H6

Observações

O teste PDF/A destina-se a uma autoverificação rápida antes da entrega; apanha os problemas ao nível do documento que desqualificam de imediato um ficheiro (versão de PDF errada, OutputIntent em falta, árvore de estrutura em falta ao nível A, encriptação, camadas em PDF/A-1); não percorre todos os operadores dos fluxos de conteúdo nem verifica a incorporação de tipos de letra ou as referências de espaços de cor de cada objeto pintado — essas validações exigem um validador PDF/A dedicado (como o veraPDF); use esta função como verificação de primeira linha e como porta de regressão em pipelines de compilação; use CreatePreflightReport ou SavePreflightReport quando quiser que a biblioteca formate as listas de problemas num relatório de texto reutilizável; use CreatePreflightReportEx ou SavePreflightReportEx para saída de relatórios em texto, JSON, HTML ou CSV, ou consulte Preflight Reports para o fluxo de relatórios completoA API complementar

GetPDFUADiagnostics efetua verificações análogas para PDF/UA-1 (ISO 14289-1) sobre o documento em memória atualmente em construção, em vez de sobre um ficheiro externoAo produzir saída PDF/A com esta biblioteca, chame

SetPDFAMode antes de adicionar qualquer conteúdo; a guarda do lado da geração dentro de SetPDFAMode bloqueia as operações proibidas pela parte escolhida, pelo que um documento construído dessa forma normalmente passa 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;

Consulte também

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

O teste de conformidade 3 audita PDF/X (ISO 15930): identificação da edição, intenção de saída, geometria de páginas, tipos de letra incorporados e o conjunto de funcionalidades proibidas; para PDF/X-6 valida também sinalizadores de anotações e aparências fixas, aparências AcroForm e de assinaturas, exclusões de aparências geradas por XFA e pelo visualizador, colocação de ações, cadeias de ações, o conjunto de ações nomeadas permitido e todos os valores UseBlackPtCompO teste de conformidade 4 audita os metadados de identificação PDF/VT-3, a base da família PDF/X-6, o grafo DPartRoot e DPart, nomes e valores DPM, nível de registo, ordem de páginas e cobertura exata de folhas; as verificações compostas partilham uma passagem de análiseO teste de conformidade 5 audita a colocação de marcadores PDF/R-1, versão e encriptação, objetos indiretos de geração zero, dicionários e filtros restritos, programas de página de fluxo único, faixas raster ordenadas, codificações de imagem, cobertura de páginas e resolução efetiva; pode reutilizar uma passagem de análise partilhada do pipeline de validaçãoO teste de conformidade 6 audita a base PDF/X e a identificação XMP PDF/VCR-1, a raiz única direta do modelo, campos declarados, campo opcional de seleção de páginas e todos os marcadores de posição de substituição PassThrough folha, ligação de páginas, MCID e caixa delimitadora; pode reutilizar uma passagem de análise partilhada do pipeline de validaçãoO teste de conformidade 7 audita a identificação e os metadados de ciclo de vida PDF/E-1, identificadores do trailer, encriptação permitida, intenções de saída e espaços de cor de dispositivo, operadores de conteúdo, tipos de letra, anotações, formulários, conteúdo opcional, ações, referências a ficheiros externos, estados gráficos e restrições de fluxos 3D; pode reutilizar uma passagem de análise partilhada do pipeline de validação