CheckFileComplianceA
Conformidade, inspeção de documentos
Descrição
O A final indica o ponto de entrada ANSI (char) da DLL; a superfície ActiveX/COM expõe apenas a forma Unicode. O comportamento é idêntico a CheckFileCompliance e os argumentos de cadeia são interpretados através da página de códigos atual de SetAnsiMode
Lê um ficheiro PDF externo e valida-o em relação a uma norma de conformidade ISO escolhida. O valor devolvido é zero (o ficheiro passa sem problemas o teste escolhido) ou um identificador StringListID diferente de zero que enumera todos os problemas detetados. Cada entrada da lista é um código curto, dois pontos e uma mensagem legível — exatamente o mesmo formato de código utilizado por GetPDFUADiagnostics. Enumere o resultado com GetStringListCount e GetStringListItem
O teste PDF/A abrange 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 o conjunto de regras a aplicar
O teste PDF/UA-1 (adicionado na v3.56.0) verifica um PDF externo em relação à ISO 14289-1 e emite códigos de diagnóstico no intervalo 10xxx, para que permaneçam visualmente distintos dos códigos PDF/A 00xxx
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
| InputFileName | Caminho completo do ficheiro PDF a validar. O ficheiro é aberto só para leitura e não é modificado |
|---|---|
| Password | Palavra-passe utilizada para abrir o ficheiro. Passe uma cadeia vazia para documentos não encriptados. Tenha em atenção que um documento encriptado falha o teste PDF/A (código 00006), independentemente de ser fornecida a palavra-passe correta — o PDF/A proíbe a encriptação |
| ComplianceTest | A norma a verificar. 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) |
| Options | Flags 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 necessita apenas de um sinal de aprovação/reprovação |
Valores devolvidos
| 0 | O ficheiro está em conformidade com a norma escolhida |
|---|---|
| Non-zero | Um identificador StringListID cujas entradas descrevem cada não conformidade detetada. O identificador permanece válido até o documento ser fechado ou até ser chamado ReleaseStringList |
Códigos de problemas PDF/A (ComplianceTest = 1)
| 00002 | A versão PDF excede o máximo permitido pelo nível de conformidade (PDF/A-1 está limitado a 1.4; PDF/A-2 e PDF/A-3 a 1.7). A linha de detalhes indica a versão em causa e o máximo permitido |
|---|---|
| 00003 | O Catalog contém /OCProperties (conteúdo opcional/camadas), proibido pelo PDF/A-1. PDF/A-2 e 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 o conjunto de regras a aplicar, pelo que esta situação é comunicada como problema fatal, independentemente de Options |
| 00006 | O documento está encriptado. O PDF/A proíbe a encriptação em todas as partes |
| 00007 | O Catalog não contém uma entrada /OutputIntents. Todas as partes PDF/A requerem uma intenção de saída para que o espaço de cor da composição seja definido sem ambiguidades |
| 00011 | O Catalog não tem uma entrada /MarkInfo. É necessária apenas para conformidade de nível a (PDF/A-1a, 2a, 3a) — o PDF etiquetado tem de declarar o seu próprio estado |
| 00012 | O Catálogo não tem uma entrada /StructTreeRoot. Exigida apenas para conformidade de nível a. Um documento Tagged PDF deve 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. ISO 14289-1 §5 exige que um ficheiro conforme se identifique através desta propriedade; ISO 14289-1 §6.2 proíbe a declaração de conformidade sem ela |
|---|---|
| 10002 | O Catalog do documento não tem um fluxo /Metadata. Uma declaração de conformidade PDF/UA-1 é registada neste fluxo; sem ela, o ficheiro não pode identificar-se como acessível |
| 10003 | O dicionário /MarkInfo do Catalog está em falta ou /Marked não é true. A norma ISO 14289-1 §7.1 exige que todos os ficheiros conformes se declarem etiquetados para que as tecnologias de apoio possam confiar na árvore de estrutura |
| 10004 | O Catálogo não tem uma entrada /StructTreeRoot. Um ficheiro PDF/UA-1 deve 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 respetiva entrada /DisplayDocTitle não é true. ISO 14289-1 §7.1 exige que os leitores conformes apresentem o título do documento no cromado da janela em vez do nome do ficheiro |
| 10006 | A entrada /Lang do Catalog está ausente ou vazia. A ISO 14289-1 §7.2 (que remete para a ISO 32000-1 §14.9.2) exige que todos os ficheiros conformes declarem o seu idioma natural, para que os leitores de ecrã selecionem a voz e as regras de pronúncia corretas |
| 10007 | O fluxo de metadados XMP não contém um dc:title Dublin Core não vazio. 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. ISO 14289-1 §7.1: os ficheiros que declaram conformidade PDF/UA têm de ter Suspects igual a false — o valor true assinala que a etiquetagem contém erros conhecidos |
| 10009 | O /RoleMap do documento remapeia um ou mais tipos de estrutura padrão. ISO 14289-1 §7.1: as etiquetas padrão definidas em ISO 32000-1 §14.8.4 (P, H1..H6, Figure, Table, etc.) não podem ser remapeadas. A linha de detalhes indica a primeira etiqueta padrão que foi remapeada |
| 10010 | O ficheiro está encriptado, mas o bit 10 da chave de permissões /P da encriptação (máscara 512, "Extrair para acessibilidade") não está definido. ISO 14289-1 §7.16 exige que todos os ficheiros conformes encriptados permitam a extração para acessibilidade, para que a tecnologia de apoio consiga aceder ao conteúdo |
| 10011 | Foi detetado um formulário XFA dinâmico: o pacote XDP de XFA contém <dynamicRender>required</dynamicRender>. ISO 14289-1 §7.15 proíbe formulários XFA dinâmicos em ficheiros conformes; é permitido XFA estático |
| 10012 | Foi detetado um Reference XObject (um Form XObject que contém 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. ISO 14289-1 §7.18.2 proíbe explicitamente TrapNet em ficheiros conformes. A linha de detalhes comunica quantas anotações foram encontradas |
| 10014 | Uma ou mais páginas contêm anotações, mas não definem /Tabs /S no respetivo dicionário de página. A norma ISO 14289-1 §7.18.3 exige que a ordem de tabulação nessas páginas siga a árvore de estrutura, indicada por /Tabs /S. A linha de detalhes comunica a contagem de páginas em causa |
| 10015 | Uma ou mais anotações Link não têm uma descrição alternativa /Contents não vazia. ISO 14289-1 §7.18.5 exige que cada anotação Link contenha uma descrição acessível, para que os leitores de ecrã possam anunciar o destino da ligação. A linha de detalhes comunica a contagem de anotações Link em falta |
| 10016 | Um ou mais dicionários FileSpec de ficheiros incorporados não contêm a chave /F de nome do ficheiro. A norma ISO 14289-1 §7.11 exige que cada FileSpec de ficheiro incorporado contenha /F e /UF |
| 10017 | Um ou mais dicionários FileSpec de ficheiros incorporados não incluem a chave de nome de ficheiro Unicode /UF. ISO 14289-1 §7.11 exige que cada FileSpec de ficheiro incorporado contenha /F e /UF |
| 10018 | Um ou mais dicionários de configuração de conteúdo opcional não têm uma cadeia de texto /Name não vazia. ISO 14289-1 §7.10 exige que todos os dicionários de configuração OCG (a entrada predefinida D e todos os dicionários em OCProperties/Configs) contenham um /Name não vazio |
| 10019 | Um ou mais dicionários de configuração de conteúdo opcional contêm a chave /AS proibida. A ISO 14289-1 §7.10 proíbe explicitamente /AS em qualquer dicionário de configuração OCG, para impedir ajustes automáticos do estado controlados por informações de utilização |
| 10020 | Um ou mais tipos de letra que não pertencem aos 14 tipos padrão referenciados pelo documento não incorporam o respetivo programa (não existe uma entrada FontFile, FontFile2 ou FontFile3 no FontDescriptor). A norma ISO 14289-1 §7.21.4.1 exige que todos os tipos de letra utilizados na composição incorporem o respetivo programa. Os tipos de letra Type 3 não são sujeitos a esta verificação porque os seus glifos são CharProcs inline |
| 10021 | Um ou mais descendentes CIDFontType2 não têm a entrada /CIDToGIDMap. ISO 14289-1 §7.21.3.2 exige que cada CIDFont Type 2 incorporado contenha /CIDToGIDMap (como fluxo que mapeia CIDs para índices de glifos ou como o nome Identity) |
| 10022 | Um ou mais dos 14 tipos de letra padrão (Helvetica, Times, Courier, Symbol, ZapfDingbats e respetivas variantes bold/oblique) são referenciados sem um programa de tipo de letra incorporado. A NOTA 5 de ISO 14289-1 §7.21.4 deixa claro que os 14 tipos de letra Type 1 padrão não estão isentos de incorporação |
| 10023 | Um ou mais tipos de letra não têm um CMap /ToUnicode e não correspondem à lista de exceções de §7.21.7. A lista de exceções abrange as codificações predefinidas MacRomanEncoding / MacExpertEncoding / WinAnsiEncoding, tipos de letra Type 0 cujo CIDFont descendente utiliza as coleções de carateres Adobe GB1 / CNS1 / Japan1 / Korea1 e tipos de letra TrueType não simbólicos |
| 10024 | O primeiro elemento de cabeçalho pela ordem do documento não é H1 (nem o H fortemente estruturado). ISO 14289-1 §7.4.2: "Se forem utilizadas etiquetas de cabeçalho, H1 deve ser a primeira" |
| 10025 | Foram detetados um ou mais saltos de nível de título na ordem do documento — por exemplo, um H1 imediatamente seguido por um H3, ignorando H2. A norma ISO 14289-1 §7.4.2 exige que as sequências descendentes de títulos avancem por ordem numérica estrita sem ignorar níveis intermédios |
| 10026 | Uma ou mais anotações Widget não têm 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 ser alcançado a partir da árvore de estrutura. A linha de detalhes comunica a contagem |
| 10027 | Uma ou mais anotações Widget têm uma entrada /StructParent, mas o valor não é resolvido através de StructTreeRoot/ParentTree para um elemento de estrutura com /S = Form. 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 ausente, aponta para algo que não é StructElem (número inteiro em bruto/dicionário MCR) ou designa uma etiqueta que não é Form |
| 10028 | Um ou mais tipos de letra TrueType não simbólicos têm /Encoding (ou /BaseEncoding de um dicionário Encoding's) que não é MacRomanEncoding nem WinAnsiEncoding. A norma 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 contêm uma entrada /Encoding no dicionário do tipo de letra. O quarto parágrafo da ISO 14289-1 §7.21.6 proíbe-o — a codificação TrueType simbólica deve ser expressa exclusivamente através da tabela cmap d'um programa de tipo de letra incorporado |
| 10030 | Um ou mais elementos de estrutura L (lista) não têm o atributo ListNumbering. A norma ISO 14289-1 §7.6 exige que todas as etiquetas L declarem o respetivo 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 contêm um dicionário de ações URI cuja entrada /IsMap é true. A ISO 14289-1 §7.18.5 proíbe /IsMap = true numa ação URI, salvo se existir uma funcionalidade equivalente noutro ponto do conteúdo sem uma chave /IsMap. Os autores com uma utilização legítima de IsMap devem suprimir este diagnóstico por sua conta |
| 10032 | Um ou mais elementos de estrutura Note não têm a entrada /ID. A norma ISO 14289-1 §7.9 exige que cada etiqueta Note declare um /ID exclusivo, para que as referências cruzadas possam apontar para um destino estável |
| 10033 | Dois ou mais elementos de estrutura Note partilham o mesmo valor /ID. A linha de detalhe indica 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 desmarcado e o fluxo FontFile2 presente) incorporam uma tabela cmap cuja única subtabela é a entrada simbólica Microsoft (3,0). O primeiro parágrafo de ISO 14289-1 §7.21.6 exige pelo menos uma subtabela cmap não simbólica, para que o programa possa apresentar os pontos de código declarados pelo respetivo /Encoding |
| 10035 | Um ou mais tipos de letra TrueType não simbólicos declaram uma entrada /Encoding com uma matriz /Differences que contém nomes de glifos que não pertencem à Adobe Glyph List 2.0. .notdef está incluído 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 todas as entradas Differences pertençam à AGL |
| 10042 | Um ou mais dicionários de dados de clipes multimédia (identificados por /S /MCD, opcionalmente /Type /MediaClip) não têm a entrada obrigatória de tipo de conteúdo /CT. A norma ISO 14289-1 §7.18.6 eleva esta chave opcional da Tabela 274 da ISO 32000-1 a obrigatória |
| 10043 | Um ou mais dicionários de dados de clipes multimédia não contêm a matriz /Alt obrigatória (pares de cadeia de idioma e texto alternativo). A norma ISO 14289-1 §7.18.6 torna obrigatória esta chave opcional da Tabela 274 da norma ISO 32000-1, 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 contêm mais do que um elemento subordinado H direto (título genérico). A norma ISO 14289-1 §7.4.4 proíbe-o 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. Deteta os problemas ao nível do documento que desqualificam imediatamente um ficheiro (versão PDF errada, OutputIntent em falta, árvore de estrutura em falta no 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 a espaços de cor de cada objeto desenhado — essas validações exigem um validador PDF/A dedicado (como o veraPDF). Utilize esta função como verificação inicial e como barreira de regressão nos pipelines de construção. Utilize CreatePreflightReport ou SavePreflightReport quando pretender que a biblioteca formate as listas de problemas num relatório de texto reutilizável. Utilize CreatePreflightReportEx ou SavePreflightReportEx para obter relatórios em texto, JSON, HTML ou CSV, ou consulte Relatórios de pré-verificação para conhecer o fluxo de trabalho completo dos relatórios
A API associada GetPDFUADiagnostics efetua verificações análogas de PDF/UA-1 (ISO 14289-1) no documento em memória que está a ser criado, em vez de num ficheiro externo
Ao produzir uma saída PDF/A com esta biblioteca, invoque SetPDFAMode antes de adicionar conteúdo. A proteção durante a geração dentro de SetPDFAMode bloqueia as operações proibidas pela parte escolhida, pelo que um documento assim criado passa normalmente CheckFileCompliance de forma automática
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
Relatórios de preflight, CreatePreflightReport, CreatePreflightReportEx, SavePreflightReport, SavePreflightReportEx, ComparePreflightReports, SetPDFAMode, GetPDFUADiagnostics, GetStringListCount, GetStringListItem, SetPDFUAMode