5

Я разрабатываю "безбумажный" рабочий процесс и планирую сохранить все файлы в формате PDF/A-1b.

Я пытаюсь разработать простой пакетный файл для преобразования PDF-файлов, которые я создаю или получаю в PDF/A-1b. Исходя из этого ответа, у меня есть следующий пакетный файл:

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

В PDFA_def.ps я пробовал несколько разных профилей ICC, в том числе один в своей системе

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

и sRGB_IEC61966-2-1_no_black_scaling.icc от color.org.

Мой тестовый входной файл представляет собой одностраничное электронное письмо, напечатанное из Microsoft Outlook 2010 с использованием CutePDF 2.8 (в котором используется Ghostscript 8.15).

После конвертации с моим пакетным файлом и Ghostscript 9.07 Adobe Reader считает, что вывод PDF/A, но проверка PDF/A-1b на pdf-tools.com завершается неудачно с сообщением «Значение ключа N равно 4, но должно быть 3 «.

Я проследил это до следующей конструкции в выходном файле PDF:

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

Если я изменю /N 4 на /N 3 , сообщение "значение ключа N" исчезнет. /N видимому, представляет количество объектов в потоке, который следует за этим заголовком. Я не знаю, как читать закодированный поток, поэтому я не понимаю, что он содержит, и почему pdf-tools считает, что он должен содержать только 3 объекта.

PDF/A, напечатанный с использованием Bullzip, который также использует Ghostscript, также не проходит проверку с сообщением «ключ N равен 4, но должен быть 3».

Это как-то связано с цветовым пространством? Я вне моей глубины там. Я думаю, что я был бы счастлив с "простым" пространством sRGB. Документы Ghostscipt говорят, что кодировка PDF/A должна быть CMYK. Adobe подразумевает, что RGB или CMYK работают для PDF/A. Так что мне неясно, как найти подходящий профиль .icc.

А может, валидатор не прав и все нормально?

2 ответа2

7

С помощью разработчика GhostScript в этом отчете об ошибках я смог решить проблему /N Уроки выучены:

  • Документ GhostScript, на который есть ссылка в моем вопросе, устарел. Нынешний документ, здесь, говорит , что ProcessColorModel = DeviceRGB хорошо.
  • Профили ICC описывают цветовое пространство. Некоторые допустимые цветовые пространства: СЕРЫЙ, RGB и CMYK. Вы можете проверить цветовое пространство профиля ICC, используя бесплатный ICC Profile Inspector.
  • В разделе файла PDF, вызывающего ошибки проверки, /N представляет количество красителей.
  • Файл PDFA_def.ps испускает значение /N Образец, включенный в Ghostscript 9.07, выдает только /N 1 (для ProcessColorModel = DeviceGray) или /N 4 (для любого другого ProcessColorModel).
  • Мой первоначальный тест указал ProcessColorModel = DeviceCMYK, который вызвал /N 4 , но использовал профиль ICC, описывающий цветовое пространство RGB. Валидаторы правильно уловили это несоответствие: я обещал 4 цвета, но описал только 3.

Большинство профилей ICC, которые я нашел для дисплеев и офисных принтеров, описывают цветовое пространство RGB. (CMYK более специфичен для высокопроизводительных печатных машин и определенных видов бумаги.) Для моих целей RGB предпочтительнее. Следующий пакетный файл преобразует PDF-файл в PDF/A-1b с цветовым пространством 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

В PDFA_def.ps укажите профиль ICC, который описывает цветовое пространство RGB, и измените раздел для определения профиля ICC следующим образом:

% 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

Длинная строка содержит вложенный оператор ifelse , который обнаружит ProcessColorModel = DeviceRGB и выдаст соответствующий /N 3 . Полученный файл должен пройти проверку на pdf-tools.com .

Обновление: я создал несколько более мощную пакетную программу и опубликовал ее в сообщении в блоге: Пакетное преобразование PDF в PDF/A.

3

Я бы предложил сначала повторно протестировать вашу проблему на последней версии 9.07 ghostscript, на тот случай, если эта проблема уже была устранена.

Если это не поможет, потребуется настоящий гуру PDF, чтобы ответить на эту проблему. Я подозреваю, что проблема как-то связана с конфликтом между содержимым файла .ps и параметрами команды gswin32c.

Однако, поскольку проблемный файл создается ghostscript, вы имеете право разместить свой вопрос на странице Bugzilla ghostscript (требуется регистрация), где разработчики ответят на ваш вопрос. Если это ошибка в ghostscript, скорее всего, она будет исправлена в следующей версии.

В дополнение к описанию проблемы, как в вашем посте, вы должны приложить пример входного файла .ps и полученный файл .pdf. Постарайтесь минимизировать их размеры.

В прошлом я сообщал о нескольких подозрительных ошибках ghostscript на этом форуме, и на них всегда давали хорошие ответы, и все обнаруженные мной реальные ошибки были исправлены.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .