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
| InputFileName | Pełna ścieżka pliku PDF do zweryfikowania. Plik jest otwierany tylko do odczytu i nie jest modyfikowany. |
|---|---|
| Password | Hasł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. |
| ComplianceTest | Standard, 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). |
| Options | Flagi 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
| 0 | Plik jest zgodny z wybranym standardem. |
|---|---|
| Wartość niezerowa | Uchwyt 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)
| 00002 | Wersja 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. |
|---|---|
| 00003 | Catalog 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. |
| 00005 | Brakuje 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. |
| 00006 | Dokument jest zaszyfrowany. PDF/A zabrania szyfrowania w każdej części. |
| 00007 | Catalog nie ma wpisu /OutputIntents. Wszystkie części PDF/A wymagają intencji wyjściowej, aby jednoznacznie określić przestrzeń barw renderowania. |
| 00011 | Catalog nie ma wpisu /MarkInfo. Jest wymagany tylko dla zgodności poziomu a (PDF/A-1a, 2a, 3a) — tagowany plik PDF musi deklarować ten fakt. |
| 00012 | Catalog 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)
| 10001 | Strumień 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. |
|---|---|
| 10002 | Catalog 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. |
| 10003 | Brakuje 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. |
| 10004 | Catalog nie ma wpisu /StructTreeRoot. Plik PDF/UA-1 musi zawierać drzewo struktury logicznej opisujące kolejność odczytu i semantykę dokumentu. |
| 10005 | Brakuje 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. |
| 10006 | Brakuje 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. |
| 10007 | Strumień metadanych XMP nie zawiera niepustego wpisu Dublin Core dc:title. ISO 14289-1 §7.1 wymaga "wpisu dc:title, który jednoznacznie identyfikuje dokument". |
| 10008 | W 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. |
| 10010 | Plik 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. |
| 10011 | Wykryto 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. |
| 10012 | Wykryto 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. |
| 10013 | Wykryto co najmniej jedną adnotację TrapNet. ISO 14289-1 §7.18.2 jawnie zabrania TrapNet w zgodnych plikach. Wiersz szczegółów podaje liczbę znalezionych adnotacji. |
| 10014 | Co 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. |
| 10015 | Co 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. |
| 10016 | W 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. |
| 10017 | W 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. |
| 10018 | W 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. |
| 10019 | Co 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. |
| 10020 | Co 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. |
| 10021 | W 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). |
| 10022 | Co 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. |
| 10023 | W 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. |
| 10024 | Pierwszy 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". |
| 10025 | W 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. |
| 10026 | Co 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ę. |
| 10027 | Co 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. |
| 10028 | Co 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. |
| 10029 | Co 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. |
| 10030 | W 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). |
| 10031 | Co 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ę. |
| 10032 | W 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. |
| 10033 | Co 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. |
| 10034 | Co 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. |
| 10035 | Co 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. |
| 10042 | W 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. |
| 10043 | W 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. |
| 10044 | Co 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