CheckFileComplianceA

Zgodność, Inspekcja dokumentu

Opis

Końcowa litera A oznacza punkt wejścia DLL ANSI (char); powierzchnia ActiveX/COM udostępnia wyłącznie postać Unicode. Zachowanie jest identyczne jak w CheckFileCompliance, a argumenty ciągów są interpretowane przy użyciu bieżącej strony kodowej SetAnsiMode

Odczytuje zewnętrzny plik PDF i weryfikuje go względem wybranego standardu zgodności ISO. Zwracana wartość to zero (plik przechodzi wybrany test bez problemów) albo niezerowy uchwyt StringListID zawierający wszystkie wykryte problemy. Każdy wpis listy składa się z krótkiego kodu, dwukropka i czytelnego komunikatu — w dokładnie takim samym formacie kodu, jakiego używa GetPDFUADiagnostics. Wynik można przejrzeć za pomocą GetStringListCount i GetStringListItem.

Test 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 ustalić właściwy zestaw reguł.

Test PDF/UA-1 (dodany w v3.56.0) sprawdza zewnętrzny plik PDF względem ISO 14289-1 i generuje kody diagnostyczne z zakresu 10xxx, aby pozostawały wizualnie odrębne od kodów PDF/A 00xxx.

Składnia

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

Parametry

InputFileNamePełna ścieżka pliku PDF do zweryfikowania. Plik jest otwierany tylko do odczytu i nie jest modyfikowany.
PasswordHasło używane do otwarcia pliku. Dla dokumentów niezaszyfrowanych przekaż pusty ciąg. Niezależnie od podania prawidłowego hasła dokument zaszyfrowany nie przechodzi testu PDF/A (kod 00006), ponieważ PDF/A zabrania szyfrowania.
ComplianceTestStandard, względem którego ma być wykonana kontrola.

1 — PDF/A (ISO 19005-1/-2/-3, wszystkie sześć poziomów zgodności).
2 — PDF/UA-1 (ISO 14289-1:2014, dostępny PDF).
OptionsFlagi bitowe modyfikujące test.

0 — Domyślnie: zgłoś każdy problem znaleziony w dokumencie.
1 — Zatrzymaj się po pierwszym problemie i natychmiast zwróć wynik. Przydatne, gdy kod wywołujący potrzebuje jedynie wyniku pozytywnego lub negatywnego.

Wartości zwracane

0Plik jest zgodny z wybranym standardem.
Wartość niezerowaUchwyt StringListID, którego wpisy opisują każdą wykrytą niezgodność. Uchwyt zachowuje ważność do zamknięcia dokumentu lub wywołania ReleaseStringList.

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

00002Wersja PDF przekracza maksimum dozwolone przez poziom zgodności (PDF/A-1 ogranicza ją do 1.4, a PDF/A-2 i PDF/A-3 do 1.7). Wiersz szczegółów podaje nieprawidłową wersję i dozwolone maksimum.
00003Catalog zawiera /OCProperties (zawartość opcjonalną lub warstwy), czego zabrania PDF/A-1. PDF/A-2 i PDF/A-3 zezwalają na warstwy i nie uruchamiają tej kontroli.
00005Brakuje pary XMP pdfaid:part+pdfaid:conformance, jest ona nieprawidłowa albo zawiera wartość spoza dozwolonego zbioru 1A, 1B, 2A, 2B, 3A, 3B. Biblioteka nie może ustalić zestawu reguł, dlatego jest to zgłaszane jako problem krytyczny niezależnie od Options.
00006Dokument jest zaszyfrowany. PDF/A zabrania szyfrowania w każdej części.
00007Catalog nie ma wpisu /OutputIntents. Wszystkie części PDF/A wymagają intencji wyjściowej, aby jednoznacznie określić przestrzeń barw renderowania.
00011Catalog nie ma wpisu /MarkInfo. Jest wymagany tylko dla zgodności poziomu a (PDF/A-1a, 2a, 3a) — tagowany plik PDF musi deklarować ten fakt.
00012Catalog nie ma wpisu /StructTreeRoot. Jest wymagany tylko dla zgodności poziomu a. Tagowany dokument PDF 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ę za pomocą tej właściwości; ISO 14289-1 §6.2 zabrania deklarowania zgodności bez niej.
10002Catalog dokumentu nie ma strumienia /Metadata. Deklaracja zgodności PDF/UA-1 jest zapisywana w tym strumieniu; bez niego plik nie może zadeklarować dostępności.
10003Brakuje słownika /MarkInfo w Catalog albo /Marked nie ma wartości true. ISO 14289-1 §7.1 wymaga, aby każdy zgodny plik deklarował tagowanie, dzięki czemu technologie wspomagające mogą polegać na drzewie struktury.
10004Catalog nie ma wpisu /StructTreeRoot. Plik PDF/UA-1 musi zawierać drzewo struktury logicznej opisujące kolejność odczytu i semantykę dokumentu.
10005Brakuje słownika /ViewerPreferences albo jego wpis /DisplayDocTitle nie ma wartości true. ISO 14289-1 §7.1 wymaga, aby zgodne czytniki wyświetlały tytuł dokumentu w pasku okna zamiast nazwy pliku.
10006Brakuje wpisu /Lang w Catalog albo jest on pusty. ISO 14289-1 §7.2 (odwołujący się do ISO 32000-1 §14.9.2) wymaga, aby każdy zgodny plik deklarował język naturalny, dzięki czemu czytniki ekranu wybiorą prawidłowy głos i reguły wymowy.
10007Strumień metadanych XMP nie zawiera niepustego wpisu Dublin Core dc:title. ISO 14289-1 §7.1 wymaga "wpisu dc:title, który jednoznacznie identyfikuje dokument".
10008W słowniku /MarkInfo wpis /Suspects ma wartość 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.
10009/RoleMap dokumentu odwzorowuje ponownie co najmniej jeden standardowy typ 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 odwzorowywać ponownie. Wiersz szczegółów podaje pierwszy taki standardowy tag.
10010Plik jest zaszyfrowany, ale bit 10 klucza uprawnień szyfrowania /P (maska 512, "Wyodrębnianie na potrzeby dostępności") nie jest ustawiony. ISO 14289-1 §7.16 wymaga, aby każdy zaszyfrowany zgodny plik zezwalał na wyodrębnianie na potrzeby dostępności, tak aby technologie wspomagające mogły dotrzeć do zawartości.
10011Wykryto dynamiczny formularz XFA: pakiet XFA XDP 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 zawierający wpis /Ref). ISO 14289-1 §7.20 zabrania obiektów Reference XObject, ponieważ pozwalają osadzić jeden plik PDF w drugim przez odwołanie bez udostępniania wskazanej zawartości technologiom wspomagającym.
10013Wykryto co najmniej jedną adnotację TrapNet. ISO 14289-1 §7.18.2 jawnie zabrania TrapNet w zgodnych plikach. Wiersz szczegółów podaje liczbę znalezionych adnotacji.
10014Co najmniej jedna strona zawiera adnotacje, ale nie ustawia /Tabs /S w swoim słowniku strony. ISO 14289-1 §7.18.3 wymaga, aby kolejność przechodzenia klawiszem Tab na takich stronach była zgodna z drzewem struktury, co sygnalizuje /Tabs /S. Wiersz szczegółów podaje liczbę nieprawidłowych stron.
10015Co najmniej jedna adnotacja Link nie ma niepustego opisu alternatywnego /Contents. ISO 14289-1 §7.18.5 wymaga dostępnego opisu dla każdej adnotacji Link, aby czytniki ekranu mogły ogłosić cel łącza. Wiersz szczegółów podaje liczbę nieprawidłowych adnotacji Link.
10016W co najmniej jednym słowniku FileSpec pliku osadzonego brakuje klucza nazwy pliku /F. ISO 14289-1 §7.11 wymaga, aby każdy FileSpec pliku osadzonego zawierał zarówno /F, jak i /UF.
10017W co najmniej jednym słowniku FileSpec pliku osadzonego brakuje klucza nazwy pliku Unicode /UF. ISO 14289-1 §7.11 wymaga, aby każdy FileSpec pliku osadzonego zawierał zarówno /F, jak i /UF.
10018W co najmniej jednym słowniku konfiguracji zawartości opcjonalnej brakuje niepustego ciągu tekstowego /Name. ISO 14289-1 §7.10 wymaga, aby każdy słownik konfiguracji OCG (domyślny wpis D oraz każdy słownik w OCProperties/Configs) zawierał niepusty /Name.
10019Co najmniej jeden słownik konfiguracji zawartości opcjonalnej zawiera niedozwolony klucz /AS. ISO 14289-1 §7.10 jawnie zabrania /AS w każdym słowniku konfiguracji OCG, aby zapobiec automatycznym zmianom stanu zależnym od informacji o użyciu.
10020Co najmniej jedna czcionka spoza Standard-14 używana przez dokument nie osadza swojego programu czcionki (brak wpisu FontFile, FontFile2 lub FontFile3 w FontDescriptor). ISO 14289-1 §7.21.4.1 wymaga osadzenia programu każdej czcionki używanej do renderowania. Czcionki Type 3 pomijają tę kontrolę, ponieważ ich glify są osadzone bezpośrednio jako CharProcs.
10021W co najmniej jednej czcionce potomnej CIDFontType2 brakuje wpisu /CIDToGIDMap. ISO 14289-1 §7.21.3.2 wymaga, aby każda osadzona czcionka Type 2 CIDFont zawierała /CIDToGIDMap (jako strumień odwzorowujący CID na indeksy glifów albo nazwę Identity).
10022Co najmniej jedna z czcionek Standard 14 (Helvetica, Times, Courier, Symbol, ZapfDingbats oraz ich warianty pogrubione i pochyłe) jest używana bez osadzonego programu czcionki. ISO 14289-1 §7.21.4 NOTE 5 wyjaśnia, że 14 standardowych czcionek Type 1 nie jest zwolnionych z obowiązku osadzania.
10023W co najmniej jednej czcionce brakuje CMap /ToUnicode, a czcionka nie pasuje do listy wyjątków z §7.21.7. Lista 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żyto jakichkolwiek tagów nagłówków, H1 musi być pierwszy".
10025W kolejności dokumentu wykryto co najmniej jedno pominięcie poziomu nagłówka — np. H1 bezpośrednio poprzedza H3, z pominięciem H2. ISO 14289-1 §7.4.2 wymaga, aby maleją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 zagnieżdżenia adnotacji Widget w tagu struktury Form; bez /StructParent do elementu Widget nie można dotrzeć z drzewa struktury. Wiersz szczegółów podaje liczbę.
10027Co najmniej jedna adnotacja Widget ma wpis /StructParent, ale jego wartości nie można rozwiązać przez StructTreeRoot/ParentTree do elementu struktury z /S = Form. ISO 14289-1 §7.18.4 wymaga zagnieżdżenia każdej adnotacji Widget w tagu struktury Form. Możliwe przyczyny: brak całego wpisu /ParentTree, wskazanie na obiekt inny niż StructElem (surową liczbę całkowitą lub słownik MCR) albo nazwę tagu innego niż Form.
10028Co najmniej jedna niesymboliczna czcionka TrueType ma /Encoding (lub /BaseEncoding słownika Encoding's) inny 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 zawiera wpis /Encoding w słowniku czcionki. Czwarty akapit ISO 14289-1 §7.21.6 tego zabrania — kodowanie symbolicznej czcionki TrueType musi być wyrażone wyłącznie przez tabelę cmap osadzonego programu czcionki's.
10030W co najmniej jednym elemencie struktury L (listy) brakuje atrybutu ListNumbering. ISO 14289-1 §7.6 wymaga, aby każdy tag L deklarował styl numerowania za pomocą tego atrybutu. Prawidłowe wartości to None, Disc, Circle, Square, Decimal, UpperRoman, LowerRoman, UpperAlpha i LowerAlpha (ISO 32000-1 Table 347).
10031Co najmniej jedna adnotacja Link zawiera 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 w innym miejscu zawartości bez klucza /IsMap. Autorzy z uzasadnionym zastosowaniem IsMap powinni samodzielnie wyciszyć tę diagnostykę.
10032W co najmniej jednym elemencie struktury Note brakuje wpisu /ID. ISO 14289-1 §7.9 wymaga, aby każdy tag Note deklarował unikatowy /ID, dzięki czemu odsyłacze mogą wskazywać stabilny cel.
10033Co najmniej dwa elementy struktury Note mają tę samą wartość /ID. Wiersz szczegółów podaje liczbę wykrytych zduplikowanych par. ISO 14289-1 §7.9 wymaga unikatowych identyfikatorów Note w obrębie dokumentu.
10034Co najmniej jeden niesymboliczny program TrueType (FontDescriptor z wyczyszczoną flagą Symbolic i obecnym strumieniem FontFile2) osadza tabelę cmap, której jedyną podtabelą jest symboliczny wpis Microsoft (3,0). Pierwszy akapit ISO 14289-1 §7.21.6 wymaga co najmniej jednej niesymbolicznej podtabeli cmap, aby program mógł renderować punkty kodowe deklarowane przez /Encoding.
10035Co najmniej jedna niesymboliczna czcionka TrueType deklaruje /Encoding z tablicą /Differences zawierającą nazwy glifów spoza Adobe Glyph List 2.0. .notdef znajduje się na białej liście, ponieważ specyfikacja pośrednio na to zezwala. Trzeci akapit ISO 14289-1 §7.21.6 wymaga, aby każdy wpis Differences należał do AGL.
10042W co najmniej jednym słowniku danych klipu multimedialnego (identyfikowanym przez /S /MCD, opcjonalnie /Type /MediaClip) brakuje wymaganego wpisu typu zawartości /CT. ISO 14289-1 §7.18.6 podnosi ten opcjonalny klucz z ISO 32000-1 Table 274 do rangi wymaganego.
10043W co najmniej jednym słowniku danych klipu multimedialnego brakuje wymaganej tablicy /Alt (par ciągu języka i tekstu alternatywnego). ISO 14289-1 §7.18.6 podnosi ten opcjonalny klucz z ISO 32000-1 Table 274 do rangi wymaganego, aby technologia wspomagająca mogła ogłosić opis osadzonych multimediów.
10044Co najmniej jeden węzeł drzewa struktury zawiera więcej niż jeden bezpośredni element potomny H (nagłówek ogólny). ISO 14289-1 §7.4.4 jawnie tego zabrania — podziel sekcję albo zastąp tagi H numerowanymi poziomami H1..H6.

Uwagi

Test PDF/A jest przeznaczony do szybkiej samokontroli przed przekazaniem pliku. Wykrywa problemy na poziomie dokumentu, które bezwarunkowo 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 bądź odwołań do przestrzeni barw dla każdego rysowanego obiektu — te kontrole wymagają dedykowanego walidatora PDF/A, takiego jak veraPDF. Użyj tej funkcji jako kontroli pierwszej linii i bramki regresji w potokach kompilacji. Użyj CreatePreflightReport lub SavePreflightReport, gdy biblioteka ma sformatować listy problemów w raport tekstowy wielokrotnego użytku. Do raportu w formacie tekstowym, JSON, HTML lub CSV użyj CreatePreflightReportEx albo SavePreflightReportEx; pełny przepływ raportowania opisano też w Preflight Reports.

Powiązany interfejs API GetPDFUADiagnostics wykonuje analogiczne kontrole PDF/UA-1 (ISO 14289-1) dla aktualnie tworzonego dokumentu w pamięci, a nie dla pliku zewnętrznego.

Podczas tworzenia wyjścia PDF/A za pomocą tej biblioteki wywołaj SetPDFAMode przed dodaniem jakiejkolwiek zawartości. Zabezpieczenie po stronie generowania wewnątrz SetPDFAMode blokuje operacje zabronione przez wybraną część standardu, dlatego tak utworzony dokument zwykle automatycznie przechodzi CheckFileCompliance.

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