Sprawdzanie poprawności Ghostscript PDF / A kończy się niepowodzeniem

5

Opracowuję przepływ pracy „bez papieru” i planuję zapisać wszystkie pliki w formacie PDF / A-1b.

Próbuję opracować prosty plik wsadowy do konwersji plików PDF, które tworzę lub odbieram do formatu PDF / A-1b. Począwszy od tej odpowiedzi , mam następujący plik wsadowy:

gswin32c ^
   -dPDFA ^
   -dNOOUTERSAVE ^
   -sProcessColorModel=DeviceCMYK ^
   -dUseCIEColor ^
   -sDEVICE=pdfwrite ^
   -o %2 ^
   -dPDFACompatibilityPolicy=1 ^
    "C:\Program Files (x86)\gs\gs9.07\mylib\PDFA_def.ps" ^
    %1

W PDFA_def.ps wypróbowałem kilka różnych profili ICC, w tym jeden znaleziony w moim systemie

C:/Windows/System32/spool/drivers/color/CalibratedDisplayProfile-5.icc

i sRGB_IEC61966-2-1_no_black_scaling.iccz color.org .

Mój testowy plik wejściowy to 1-stronicowy e-mail wydrukowany z Microsoft Outlook 2010 przy użyciu CutePDF 2.8 (który używa Ghostscript 8.15).

Po przekonwertowaniu za pomocą mojego pliku wsadowego i Ghostscript 9.07 program Adobe Reader uważa, że ​​dane wyjściowe to PDF / A, ale sprawdzenie poprawności PDF / A-1b przez pdf-tools.com kończy się niepowodzeniem z komunikatem „Wartość klucza N wynosi 4, ale musi wynosić 3 . ”

Prześledziłem to z powrotem do następującej konstrukcji w pliku wyjściowym PDF:

<</Filter/FlateDecode
/N 4/Length 2595>>stream

Jeśli zmienię /N 4na /N 3, komunikat „wartość klucza N” zniknie. /Nnajwyraźniej reprezentuje liczbę obiektów w strumieniu następującym po tym nagłówku. Nie wiem, jak odczytać zakodowany strumień, więc nie rozumiem, co zawiera, ani dlaczego pdf-tools uważa, że ​​musi zawierać tylko 3 obiekty.

Plik PDF / A wydrukowany przy użyciu Bullzip, który również korzysta z Ghostscript, również nie sprawdza poprawności komunikatem „klucz N to 4, ale musi być 3”.

Czy to ma coś wspólnego z przestrzenią kolorów? Jestem poza moją głębią. Myślę, że byłbym zadowolony z „zwykłej” przestrzeni sRGB. Dokumenty Ghostscipt mówią, że kodowanie PDF / A musi być CMYK . Adobe sugeruje, że RGB lub CMYK działa w przypadku plików PDF / A. Nie jestem więc pewien, jak znaleźć odpowiedni profil .icc.

A może weryfikator się myli i wszystko jest w porządku?

Mark Berry
źródło

Odpowiedzi:

7

Z pomocą programisty GhostScript w tym raporcie o błędach udało mi się rozwiązać /Nproblem. Zdobyta wiedza:

  • Dokument GhostScript wymieniony w moim pytaniu jest nieaktualny. Obecny dokument mówi tutaj , że ProcessColorModel = DeviceRGB jest w porządku.
  • Profile ICC opisują przestrzeń kolorów. Niektóre prawidłowe przestrzenie kolorów to SZARY, RGB i CMYK. Możesz sprawdzić przestrzeń kolorów profilu ICC za pomocą bezpłatnego Inspektora profili ICC .
  • W sekcji pliku PDF powodującej błędy sprawdzania poprawności /Nreprezentuje liczbę barwników.
  • Plik PDFA_def.ps emituje /Nwartość. Próbka zawarta w Ghostscript 9.07 emituje tylko /N 1(dla ProcessColorModel = DeviceGray) lub /N 4(dla dowolnego innego ProcessColorModel).
  • Mój oryginalny test określił ProcessColorModel = DeviceCMYK, który spowodował /N 4, ale użył profilu ICC opisującego przestrzeń kolorów RGB. Walidatorzy poprawnie wychwycili tę rozbieżność: obiecałem 4 kolory, ale opisałem tylko 3.

Większość profili ICC, które znalazłem dla wyświetlaczy i drukarek biurowych, opisuje przestrzeń kolorów RGB. (CMYK wydaje się bardziej specyficzny dla wysokiej klasy maszyn drukarskich i niektórych rodzajów papieru.) Dla moich celów preferuję RGB. Poniższy plik wsadowy konwertuje plik PDF na PDF / A-1b z przestrzenią kolorów RGB:

gswin32c ^
   -dPDFA ^
   -dNOOUTERSAVE ^
   -sProcessColorModel=DeviceRGB ^
   -dUseCIEColor ^
   -sDEVICE=pdfwrite ^
   -o %2 ^
   -dPDFACompatibilityPolicy=1 ^
    "C:\Program Files (x86)\gs\gs9.07\mylib\PDFA_def.ps" ^
    %1

W pliku PDFA_def.ps określ profil ICC opisujący przestrzeń kolorów RGB i zmień sekcję dotyczącą definiowania profilu ICC w następujący sposób:

% Define an ICC profile :

[/_objdef {icc_PDFA} /type /stream /OBJ pdfmark
[{icc_PDFA} <</N systemdict /ProcessColorModel get /DeviceGray eq {1} {systemdict /ProcessColorModel get /DeviceRGB eq {3} {4} ifelse} ifelse >> /PUT pdfmark
[{icc_PDFA} ICCProfile (r) file /PUT pdfmark

Długi wiersz zawiera zagnieżdżoną ifelseinstrukcję, która wykryje ProcessColorModel = DeviceRGB i wyśle ​​odpowiednią /N 3. Wynikowy plik powinien przejść walidację na pdf-tools.com .

Aktualizacja: I utworzeniu nieco bardziej zdolny program wsadowy i opublikował je w blogu: Batch Convert PDF do PDF / A .

Mark Berry
źródło
Właśnie użyłem narzędzi pdf, a jedynym błędem sprawdzania poprawności, jaki dostałem, było „Wartość klucza N wynosi 4, ale musi wynosić 3.”. Nie możesz sobie wyobrazić, jak cieszę się z przeczytania twojej szczegółowej odpowiedzi tutaj. Stukrotne dzięki.
Jan-Philip Gehrcke
3

Proponuję najpierw ponownie przetestować twój problem w najnowszej wersji 9.07 Ghostscript, na wypadek, gdyby problem został już rozwiązany.

Jeśli to nie pomoże, potrzeba prawdziwego guru PDF, aby rozwiązać ten problem. Podejrzewam, że problem ma coś wspólnego z konfliktem między zawartością pliku .ps a parametrami polecenia gswin32c.

Ponieważ jednak problematyczny plik jest generowany przez ghostscript, masz prawo opublikować swoje pytanie na stronie Bugzilla ghostscript (wymagana rejestracja), gdzie programiści odpowiedzą na twoje pytanie. Jeśli jest to błąd w ghostscript, najprawdopodobniej zostanie naprawiony w następnej wersji.

Oprócz opisu problemu jak w poście należy dołączyć przykładowy plik wejściowy .ps i wynikowy plik .pdf. Spróbuj zminimalizować ich rozmiary.

W przeszłości zgłaszałem kilka podejrzanych błędów ghostscript na tym forum i zawsze otrzymałem dobrą odpowiedź, a wszystkie znalezione przeze mnie błędy zostały naprawione.

harrymc
źródło
Dziękuję za odpowiedź. Mogłem pomylić rzeczy, wspominając, że oryginał został utworzony przez CutePDF 2.8, który używa GhostScript 8.15. Jednak faktyczna konwersja, którą próbuję debugować, została wykonana za pomocą GhostScript 9.07. Jestem trochę zaskoczony, że konwersja PDF / A nie została jeszcze rozwiązana i zweryfikowana, ale nie znalazłem dokładnego samouczka. Mogę wypróbować forum ghostscript.
Mark Berry
Pamiętaj tylko, że nie jest to forum zorientowane na użytkownika, ale witryna z raportem błędów, na którą odpowiadają bezpośrednio i tylko programiści.
harrymc
Przed zgłoszeniem błędu postanowiłem pobrać wersję próbną programu Adobe Acrobat XI. Tam moje dokumenty testowe przechodzą walidację PDF / A-1b przed lotem. Czy Ghostscript (i inni) skłaniają się ku interpretacji standardu przez Adobe? Jeśli tak, prawdopodobnie nie ma sensu traktować tego jako błędu.
Mark Berry
Zgodnie z tym, co mówisz, produkty oparte na Ghostscript uznają to / N za niezgodne. Acrobat nie wykrywa go, może to być po prostu błąd w programie sprawdzającym Acrobat. W moim własnym czytaniu specyfikacji PDF nie znalazłem / N na liście legalnych parametrów FlateDecode, więc nie mam pojęcia, dlaczego jest w ogóle emitowany (możesz spróbować go usunąć i sprawdzić, czy pdf nadal działa ). Nie musisz się martwić, że przedstawię programistom Ghostscript fałszywy błąd - zrobiłem to już więcej niż raz i zawsze byłem traktowany z uprzejmością.
harrymc
Utworzyłem bugs.ghostscript.com/show_bug.cgi?id=693830 . Jak najlepiej mogę powiedzieć, / N nie jest parametrem FlateDecode; raczej „FlateDecode”, „N” i „Length” wszystkie opisują, jak należy interpretować następujący „strumień”. Narzędzie „Wewnętrzna struktura PDF” programu Acrobat pokazuje, że obiekt ten znajduje się w OutputIntents> 0> DestOutputProfile i że strumień jest strumieniem profilu ICC, ale nadal nie jestem pewien, co oznacza / N.
Mark Berry