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
| InputFileName | Caminho completo do ficheiro PDF a validar; o ficheiro é aberto só de leitura e não é modificado |
|---|---|
| Password | Palavra-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 |
| ComplianceTest | A 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 |
| Options | Sinalizadores 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
| 0 | O ficheiro está conforme a norma escolhida |
|---|---|
| Não zero | Um 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)
| 00002 | A 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 |
|---|---|
| 00003 | O 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 |
| 00005 | O 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 |
| 00006 | O documento está encriptado; o PDF/A proíbe a encriptação em todas as partes |
| 00007 | O 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 |
| 00011 | O 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 |
| 00012 | O 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)
| 10001 | O 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 |
|---|---|
| 10002 | O 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 |
| 10003 | O 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 |
| 10004 | O 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 |
| 10005 | O 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 |
| 10006 | A 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 |
| 10007 | O 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» |
| 10008 | O 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 |
| 10009 | O /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 |
| 10010 | O 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 |
| 10011 | Foi 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 |
| 10012 | Foi 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 |
| 10013 | Foram 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 |
| 10014 | Uma 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 |
| 10015 | Uma 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 |
| 10016 | Um 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 |
| 10017 | Um 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 |
| 10018 | Um 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 |
| 10019 | Um 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 |
| 10020 | Um 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 |
| 10021 | Um 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) |
| 10022 | Um 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 |
| 10023 | Um 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 |
| 10024 | O 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» |
| 10025 | Foram 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 |
| 10026 | Uma 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 |
| 10027 | Uma 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 |
| 10028 | Um 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 |
| 10029 | Um 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 |
| 10030 | Um 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) |
| 10031 | Uma 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 |
| 10032 | Um 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 |
| 10033 | Dois 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 |
| 10034 | Um 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 |
| 10035 | Um 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 |
| 10036 | Uma 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 |
| 10037 | Uma 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 |
| 10038 | Um /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 |
| 10039 | Um /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 |
| 10040 | Um 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 |
| 10041 | Um 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 |
| 10042 | Um 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 |
| 10043 | Um 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 |
| 10044 | Um 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