CheckFileCompliance

Zgodność, inspekcja dokumentów

Wybór profilu czytnika PDF/UA

Kontrole PDF/UA wybierają część 2, gdy XMP wskazuje pdfuaid:part=2, a w przeciwnym razie zachowują kontrole części 1; opisane tu starsze kontrole PDF/UA-1 nie obejmują automatycznie części 2

Profil PDF/UA-2 implementuje podstawowe kontrole identyfikacji, przestrzeni nazw, ról i struktury; raporty strukturalne używają PDF/UA-2 i ISO 14289-2 oraz ujawniają fullCertification=false i niezweryfikowany zakres

Użyj CheckFilePDFUACompliance lub RunPDFUAValidationPipelineTask, aby wymusić część docelową, oraz GetPDFUAReadValidationCoverageJSON, aby obejrzeć limity możliwości

Opis

Wczytuje zewnętrzny plik PDF i sprawdza go względem wybranego standardu zgodności ISO. Zwracana wartość to albo zero (plik przechodzi wybrany test bez zastrzeżeń), albo niezerowy uchwyt StringListID wyliczający każdy wykryty problem. Każdy wpis listy to krótki kod, dwukropek i komunikat czytelny dla człowieka — dokładnie ten sam format kodów, którego używa GetPDFUADiagnostics. Wynik wylicz za pomocą GetStringListCount i GetStringListItemTest PDF/A obejmuje wszystkie sześć trybów zgodności (PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-3a, PDF/A-3b) i odczytuje wpisy XMP

pdfaid:part/pdfaid:conformance, aby rozstrzygnąć, który zestaw reguł zastosowaćTest PDF/UA-1 (dodany w v3.56.0) sprawdza zewnętrzny plik PDF względem ISO 14289-1 i generuje kody diagnostyczne w zakresie

10xxx, aby pozostawały wizualnie oddzielone od kodów PDF/A 00xxx

Składnia

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);

Parametry

InputFileNamePełna ścieżka pliku PDF do sprawdzenia. Plik jest otwierany tylko do odczytu i nie jest modyfikowany.
PasswordHasło używane do otwarcia pliku. Dla dokumentów nieszyfrowanych przekaż pusty łańcuch. Zwróć uwagę, że zaszyfrowany dokument nie przechodzi testu PDF/A (kod 00006) niezależnie od tego, czy podano poprawne hasło — PDF/A zabrania szyfrowania.
ComplianceTestStandard, względem którego przeprowadzane jest sprawdzenie.

1 — PDF/A (ISO 19005-1/-2/-3, wszystkie sześć poziomów zgodności).
2 — PDF/UA-1 (ISO 14289-1:2014, dostępny plik PDF).
3 — PDF/X (ISO 15930, włącznie z rodziną PDF/X-6).
4 — PDF/VT-3 (ISO 16612-3:2020 na bazie rodziny PDF/X-6).
5 — PDF/R-1, ograniczona wymiana danych rastrowych.
6 — PDF/VCR-1, szablony zastępowania zawartości zmiennej.
7 — PDF/E-1, wymiana dokumentów inżynieryjnych.
OptionsFlagi bitowe modyfikujące test.

0 — Domyślnie: raportuj każdy problem znaleziony w dokumencie.
1 — Zatrzymaj się po pierwszym problemie i zwróć wynik natychmiast. Przydatne, gdy wywołujący potrzebuje tylko sygnału zaliczenia/niezaliczenia.

Wartości zwracane

0Plik jest zgodny z wybranym standardem.
NiezerowyUchwyt StringListID, którego wpisy opisują każdą wykrytą niezgodność. Uchwyt pozostaje ważny do zamknięcia dokumentu albo wywołania ReleaseStringList.

Kody problemów PDF/A (ComplianceTest = 1)

00002Wersja PDF przekracza maksimum dozwolone przez poziom zgodności (PDF/A-1 ogranicza do 1.4; PDF/A-2 i PDF/A-3 do 1.7). Linia szczegółów podaje problematyczną wersję i dozwolone maksimum.
00003Katalog zawiera /OCProperties (zawartość opcjonalna / warstwy), zabronione w PDF/A-1. PDF/A-2 i PDF/A-3 dopuszczają warstwy i nie wyzwalają tego sprawdzenia.
00005Para pdfaid:part+pdfaid:conformance w XMP jest brakująca, zniekształcona albo zawiera wartość poza dozwolonym zbiorem 1A, 1B, 2A, 2B, 3A, 3B. Biblioteka nie może rozstrzygnąć, który zestaw reguł zastosować, więc jest to raportowane jako problem krytyczny niezależnie od Options.
00006Dokument jest zaszyfrowany. PDF/A zabrania szyfrowania w każdej części.
00007Katalog nie ma wpisu /OutputIntents. Wszystkie części PDF/A wymagają intencji wyjściowej, aby przestrzeń kolorów renderowania była jednoznacznie określona.
00011Katalog nie ma wpisu /MarkInfo. Wymagane tylko dla zgodności na poziomie a (PDF/A-1a, 2a, 3a) — PDF z tagami musi się sam zadeklarować.
00012Katalog nie ma wpisu /StructTreeRoot. Wymagane tylko dla zgodności na poziomie a. Dokument PDF z tagami musi mieć drzewo struktury logicznej.

Kody problemów PDF/UA-1 (ComplianceTest = 2)

10001Strumień metadanych XMP nie zawiera pdfuaid:part albo wartość nie wynosi 1. ISO 14289-1 §5 wymaga, aby zgodny plik identyfikował się tą właściwością; ISO 14289-1 §6.2 zabrania deklarowania zgodności bez niej.
10002Katalog dokumentu nie ma strumienia /Metadata. Deklaracja zgodności PDF/UA-1 jest zapisywana w tym strumieniu; bez niego plik nie może ogłosić się dostępnym.
10003Słownik /MarkInfo katalogu jest brakujący albo /Marked nie ma wartości true. ISO 14289-1 §7.1 wymaga, aby każdy zgodny plik deklarował się jako oznaczony tagami, aby technologia wspomagająca mogła polegać na drzewie struktury.
10004Katalog nie ma wpisu /StructTreeRoot. Plik PDF/UA-1 musi zawierać drzewo struktury logicznej opisujące kolejność czytania i semantykę dokumentu.
10005Słownik /ViewerPreferences jest brakujący albo jego wpis /DisplayDocTitle nie ma wartości true. ISO 14289-1 §7.1 wymaga, aby zgodne czytniki pokazywały tytuł dokumentu w ramce okna zamiast nazwy pliku.
10006Wpis katalogu /Lang jest brakujący albo pusty. ISO 14289-1 §7.2 (w nawiązaniu do ISO 32000-1 §14.9.2) wymaga, aby każdy zgodny plik deklarował swój język naturalny, aby czytniki ekranu wybierały właściwy głos i reguły wymowy.
10007Strumień metadanych XMP nie niesie niepustego dc:title z Dublin Core. ISO 14289-1 §7.1 wymaga "wpisu dc:title, który jednoznacznie identyfikuje dokument".
10008Słownik /MarkInfo ma /Suspects ustawione na true. ISO 14289-1 §7.1: pliki deklarujące zgodność z PDF/UA muszą mieć wartość Suspects równą false — wartość true oznacza, że tagowanie zawiera znane błędy.
10009Dokument /RoleMap remapuje jeden lub więcej standardowych typów struktury. ISO 14289-1 §7.1: standardowych tagów zdefiniowanych w ISO 32000-1 §14.8.4 (P, H1..H6, Figure, Table itd.) nie wolno remapować. Linia szczegółów podaje pierwszy remapowany standardowy tag.
10010Plik jest zaszyfrowany, ale bit 10 klucza uprawnień szyfrowania /P (maska 512, "Extract for accessibility") nie jest ustawiony. ISO 14289-1 §7.16 wymaga, aby każdy zaszyfrowany zgodny plik zezwalał na ekstrakcję dla dostępności, aby technologia wspomagająca mogła dotrzeć do zawartości.
10011Wykryto dynamiczny formularz XFA: pakiet XDP XFA zawiera <dynamicRender>required</dynamicRender>. ISO 14289-1 §7.15 zabrania dynamicznych formularzy XFA w zgodnych plikach; statyczne XFA są dozwolone.
10012Wykryto Reference XObject (Form XObject niosący wpis /Ref). ISO 14289-1 §7.20 zabrania reference XObject, ponieważ pozwalają one osadzać jeden plik PDF w innym przez referencję bez ujawniania przywoływanej zawartości technologii wspomagającej.
10013Wykryto co najmniej jedną adnotację TrapNet. ISO 14289-1 §7.18.2 wprost zabrania TrapNet w zgodnych plikach. Linia szczegółów podaje, ile adnotacji znaleziono.
10014Co najmniej jedna strona ma adnotacje, ale nie ustawia /Tabs /S w swoim słowniku strony. ISO 14289-1 §7.18.3 wymaga, aby kolejność tabulatorów na takich stronach podążała za drzewem struktury, co sygnalizuje /Tabs /S. Linia szczegółów podaje liczbę problematycznych stron.
10015Co najmniej jedna adnotacja Link nie ma niepustego alternatywnego opisu /Contents. ISO 14289-1 §7.18.5 wymaga, aby każda adnotacja Link nosiła dostępny opis, aby czytniki ekranu mogły odczytać cel odnośnika. Linia szczegółów podaje liczbę problematycznych adnotacji Link.
10016Co najmniej jeden słownik FileSpec pliku osadzonego nie ma klucza nazwy pliku /F. ISO 14289-1 §7.11 wymaga, aby każdy FileSpec pliku osadzonego nosił zarówno /F, jak i /UF.
10017Co najmniej jeden słownik FileSpec pliku osadzonego nie ma klucza unikodowej nazwy pliku /UF. ISO 14289-1 §7.11 wymaga, aby każdy FileSpec pliku osadzonego nosił zarówno /F, jak i /UF.
10018Co najmniej jeden słownik konfiguracji zawartości opcjonalnej nie ma niepustego tekstowego łańcucha /Name. ISO 14289-1 §7.10 wymaga, aby każdy słownik konfiguracji OCG (domyślny wpis D plus każdy słownik w OCProperties/Configs) nosił niepusty /Name.
10019Co najmniej jeden słownik konfiguracji zawartości opcjonalnej zawiera zabroniony klucz /AS. ISO 14289-1 §7.10 wprost zabrania /AS w dowolnym słowniku konfiguracji OCG, aby zapobiec automatycznym korektom stanów napędzanym informacjami o użyciu.
10020Co najmniej jedna czcionka spoza standardowej czternastki przywoływana przez dokument nie osadza swojego programu czcionki (brak wpisu FontFile, FontFile2 lub FontFile3 w FontDescriptor). ISO 14289-1 §7.21.4.1 wymaga, aby każda czcionka używana do renderowania osadzała swój program. Czcionki Type 3 pomijają to sprawdzenie, bo ich glify są wbudowane jako CharProcs.
10021Co najmniej jeden potomek CIDFontType2 nie ma wpisu /CIDToGIDMap. ISO 14289-1 §7.21.3.2 wymaga, aby każda osadzona CIDFont typu 2 nosiła /CIDToGIDMap (jako strumień mapujący CID na indeksy glifów albo jako nazwa Identity).
10022Co najmniej jedna ze standardowych 14 czcionek (Helvetica, Times, Courier, Symbol, ZapfDingbats i ich warianty bold / oblique) jest przywoływana bez osadzonego programu czcionki. ISO 14289-1 §7.21.4 UWAGA 5 jednoznacznie stanowi, że dla 14 standardowych czcionek Type 1 nie ma zwolnienia z obowiązku osadzenia.
10023Co najmniej jedna czcionka nie ma mapy /ToUnicode i nie pasuje do listy zwolnień z §7.21.7. Lista zwolnień obejmuje predefiniowane MacRomanEncoding / MacExpertEncoding / WinAnsiEncoding, czcionki Type 0, których potomna CIDFont używa kolekcji znaków Adobe GB1 / CNS1 / Japan1 / Korea1, oraz niesymboliczne czcionki TrueType.
10024Pierwszy element nagłówka w kolejności dokumentu nie jest H1 (ani silnie ustrukturyzowanym H). ISO 14289-1 §7.4.2: "Jeśli używane są jakiekolwiek tagi nagłówków, H1 musi być pierwszy."
10025Wykryto co najmniej jedno przeskoczenie poziomu nagłówka w kolejności dokumentu — np. H1, bezpośrednio po którym następuje H3, z pominięciem H2. ISO 14289-1 §7.4.2 wymaga, aby opadające sekwencje nagłówków postępowały w ścisłej kolejności numerycznej bez pomijania poziomów pośrednich.
10026Co najmniej jedna adnotacja Widget nie ma wpisu /StructParent. ISO 14289-1 §7.18.4 wymaga, aby adnotacje Widget były zagnieżdżone w tagu struktury Form; bez /StructParent widżetu nie da się w ogóle osiągnąć z drzewa struktury. Linia szczegółów podaje liczbę.
10027Co najmniej jedna adnotacja Widget ma wpis /StructParent, ale jego wartość nie prowadzi przez StructTreeRoot/ParentTree do elementu struktury z /S = Form. ISO 14289-1 §7.18.4 wymaga, aby każda adnotacja Widget była zagnieżdżona w tagu struktury Form. Możliwe przyczyny: wpis /ParentTree całkowicie nie istnieje, wskazuje na coś innego niż StructElem (surowa liczba całkowita / słownik MCR) albo nazywa tag inny niż Form.
10028Co najmniej jedna niesymboliczna czcionka TrueType ma /Encoding (albo /BaseEncoding słownika Encoding) inne niż MacRomanEncoding lub WinAnsiEncoding. ISO 14289-1 §7.21.6 ogranicza kodowanie niesymbolicznych czcionek TrueType do tych dwóch predefiniowanych nazw.
10029Co najmniej jedna symboliczna czcionka TrueType niesie wpis /Encoding w słowniku czcionki. ISO 14289-1 §7.21.6, akapit czwarty, zabrania tego — kodowanie symbolicznej czcionki TrueType musi być wyrażone wyłącznie przez tablicę cmap osadzonego programu czcionki.
10030Co najmniej jeden element struktury L (lista) nie ma atrybutu ListNumbering. ISO 14289-1 §7.6 wymaga, aby każdy tag L deklarował przez ten atrybut swój styl numeracji. Poprawne wartości to None, Disc, Circle, Square, Decimal, UpperRoman, LowerRoman, UpperAlpha i LowerAlpha (ISO 32000-1, tabela 347).
10031Co najmniej jedna adnotacja Link niesie słownik akcji URI, którego wpis /IsMap ma wartość true. ISO 14289-1 §7.18.5 zabrania /IsMap = true w akcji URI, chyba że równoważna funkcjonalność jest zapewniona gdziekolwiek indziej w zawartości bez klucza /IsMap. Autorzy z uzasadnionym przypadkiem użycia IsMap powinni samodzielnie wyciszyć tę diagnostykę.
10032Co najmniej jeden element struktury Note nie ma wpisu /ID. ISO 14289-1 §7.9 wymaga, aby każdy tag Note deklarował unikalny /ID, aby odwołania krzyżowe mogły trafiać w stabilny cel.
10033Dwa lub więcej elementów struktury Note współdzieli tę samą wartość /ID. Linia szczegółów podaje liczbę wykrytych zduplikowanych par. ISO 14289-1 §7.9 wymaga, aby identyfikatory Note były unikalne w dokumencie.
10034Co najmniej jeden niesymboliczny program TrueType (FontDescriptor z wyzerowaną flagą Symbolic, obecny strumień FontFile2) osadza tablicę cmap, której jedyną podtablicą jest symboliczny wpis Microsoft (3,0). ISO 14289-1 §7.21.6, akapit pierwszy, wymaga co najmniej jednej niesymbolicznej podtablicy cmap, aby program mógł wyrenderować punkty kodowe zadeklarowane przez swój /Encoding.
10035Co najmniej jedna niesymboliczna czcionka TrueType deklaruje /Encoding z tablicą /Differences zawierającą nazwy glifów nienależące do Adobe Glyph List 2.0. .notdef jest na białej liście, ponieważ specyfikacja wprost go dopuszcza. ISO 14289-1 §7.21.6, akapit trzeci, wymaga, aby każdy wpis Differences trafiał do AGL.
10036Szerokości co najmniej jednej prostej czcionki TrueType różnią się od odpowiadających metryk w osadzonym programie czcionki o więcej niż jedną tysięczną em. ISO 14289-1 §7.21.5 wymaga, aby tablica /Widths zgadzała się z osadzonymi metrykami glifów.
10037Szerokości co najmniej jednej czcionki CIDFontType2 różnią się od odpowiadających metryk w osadzonym programie TrueType o więcej niż jedną tysięczną em. ISO 14289-1 §7.21.5 wymaga, aby tablica /W zgadzała się z osadzonymi metrykami glifów.
10038Deskryptor czcionki Type 1 /CharSet pomija co najmniej jedną nazwę glifu obecną w osadzonym programie czcionki. ISO 14289-1 §7.21.4.2 wymaga, aby wpis wyliczał każdy osadzony glif.
10039Deskryptor czcionki CID /CIDSet pomija co najmniej jeden CID mapujący się na glify w osadzonym programie czcionki. ISO 14289-1 §7.21.4.2 wymaga, aby zbiór bitów identyfikował każdy osadzony CID.
10040Form XObject zawierający tekst jest wywoływany z zawartości strony poza zawartością oznaczoną. ISO 14289-1 §7.20 wymaga, aby zawartość Form XObject była włączona do elementów struktury.
10041Co najmniej jeden operand pokazywania tekstu rozwiązuje się do glifu .notdef. ISO 14289-1 §7.21.8 zabrania odwołań do .notdef niezależnie od trybu renderowania tekstu.
10042Co najmniej jeden słownik danych klipu multimedialnego (identyfikowany przez /S /MCD, opcjonalnie /Type /MediaClip) nie ma wymaganego wpisu typu zawartości /CT. ISO 14289-1 §7.18.6 podnosi ten opcjonalny klucz z ISO 32000-1, tabela 274, do wymaganego.
10043Co najmniej jeden słownik danych klipu multimedialnego nie ma wymaganej tablicy /Alt (pary łańcuch-język + tekst alternatywny). ISO 14289-1 §7.18.6 podnosi ten opcjonalny klucz z ISO 32000-1, tabela 274, do wymaganego, aby technologia wspomagająca mogła odczytać opis osadzonych multimediów.
10044Co najmniej jeden węzeł drzewa struktury niesie więcej niż jednego bezpośredniego potomka H (nagłówek ogólny). ISO 14289-1 §7.4.4 wprost tego zabrania — podziel sekcję albo zastąp tagi H numerowanymi poziomami H1..H6.

Uwagi

Test PDF/A jest przeznaczony jako szybka samokontrola przed dostarczeniem. Wyłapuje problemy na poziomie dokumentu, które od razu dyskwalifikują plik (niewłaściwa wersja PDF, brak OutputIntent, brak drzewa struktury na poziomie A, szyfrowanie, warstwy w PDF/A-1). Nie przechodzi jednak przez każdy operator strumienia zawartości ani nie weryfikuje osadzenia czcionek ani referencji przestrzeni kolorów dla każdego rysowanego obiektu — te walidacje wymagają dedykowanego walidatora PDF/A (takiego jak veraPDF). Używaj tej funkcji jako kontroli pierwszej linii i jako bramki regresji w potokach budowania. Użyj CreatePreflightReport lub SavePreflightReport, jeśli chcesz, aby biblioteka sformatowała listy problemów do raportu tekstowego wielokrotnego użytku. Użyj CreatePreflightReportEx lub SavePreflightReportEx dla raportów w formacie tekstowym, JSON, HTML lub CSV, albo zobacz Preflight Reports, aby poznać pełny obieg pracy z raportamiSiostrzany interfejs API

GetPDFUADiagnostics wykonuje analogiczne sprawdzenia dla PDF/UA (ISO 14289-1) na budowanym właśnie dokumencie w pamięci, a nie na zewnętrznym plikuPrzy produkcji wyjścia PDF/A tą biblioteką wywołaj

SetPDFAMode przed dodaniem jakiejkolwiek zawartości. Strażnik po stronie generowania wewnątrz SetPDFAMode blokuje operacje zabronione przez wybraną część, więc dokument zbudowany w ten sposób zwykle przejdzie CheckFileCompliance automatycznie

Przykład

// 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;

Zobacz również

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

Test zgodności 3 audytuje PDF/X (ISO 15930): identyfikację edycji, output intent, geometrię strony, osadzone fonty i zestaw cech zabronionych; dla PDF/X-6 weryfikuje też flagi adnotacji i utrwalone wyglądy, wyglądy AcroForm i podpisów, wyjątki XFA oraz wyglądów generowanych przez przeglądarkę, rozmieszczenie akcji, łańcuchy akcji, dozwolony zestaw akcji nazwanych i każdą wartość UseBlackPtComp

Test zgodności 4 audytuje metadane identyfikacyjne PDF/VT-3, jego bazę z rodziny PDF/X-6, graf DPartRoot i DPart, nazwy i wartości DPM, poziom rekordu, kolejność stron i dokładne pokrycie liści; złożone kontrole dzielą jeden przebieg parsera

Test zgodności 5 audytuje rozmieszczenie znaczników PDF/R-1, wersję i szyfrowanie, obiekty pośrednie generacji zero, ograniczone słowniki i filtry, jednostrumieniowe programy stron, uporządkowane pasma rastrowe, kodowania obrazów, pokrycie strony i skuteczną rozdzielczość; może ponownie użyć wspólnego przebiegu potoku walidacji

Test zgodności 6 audytuje podstawę PDF/X i identyfikację XMP PDF/VCR-1, pojedynczy bezpośredni korzeń szablonu, zadeklarowane pola, opcjonalne pole wyboru strony i każdy liściasty symbol zastępczy zamiany PassThrough, powiązanie strony, MCID i prostokąt otaczający; może ponownie użyć wspólnego przebiegu potoku walidacji

Test zgodności 7 audytuje identyfikację i metadane cyklu życia PDF/E-1, identyfikatory trailer, dozwolone szyfrowanie, output intenty i przestrzenie barw urządzeń, operatory treści, fonty, adnotacje, formularze, treść opcjonalną, akcje, referencje do plików zewnętrznych, stany grafiki i ograniczenia strumieni 3D; może ponownie użyć wspólnego przebiegu potoku walidacji