Проверка Ghostscript + QPDF и PDF / A-1b: как добавить разделитель EOL до конца

Я пытаюсь определить современный метод для преобразования любого PDF в PDF / A-1b, способный пройти проверку 3-Heights . Я придумал этот скрипт, который использует ghostscript и qpdf :

#! /bin/bash # transforms input PDF into an optimized PDF/A-1b # usage: $0 input.pdf output.pdf gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dSAFER -sColorConversionStrategy=UseDeviceIndependentColor -dEmbedAllFonts=true -dPrinted=true -dPDFA -sProcessColorModel=DeviceRGB -dPDFACompatibilityPolicy=1 -dDetectDuplicateImages -r150 -sOutputFile=$2 $1 qpdf --linearize $2 $2.optimized mv $2.optimized $2 

Который преобразует любой PDF в веб-оптимизированный PDF / A-1b.

Все хорошо, за исключением того, что ghostscript, кажется, не добавляет отсутствующих EOL до endstreams, что не позволит обработанному документу пройти проверку. Это результат проверки, который я получаю:

 Validating file "document.pdf" for conformance level pdfa-1b The separator before 'endstream' must be an EOL. (5) The document does not conform to the requested standard. The file format (header, trailer, objects, xref, streams) is corrupted. Done. 

Знаете ли вы какой-либо способ или инструмент, с помощью которого можно добавлять эти разделители EOL?

Также приветствуются действительные и современные альтернативные предложения по конвертации PDF в PDF / A-1b.

Я был слепо сосредоточен на ghostscript , но благодаря Стивену, я узнал, что это связано с ошибкой в qpdf . Я отправлю отчет через GitHub.

Мы можем выполнять всю работу только с ghostscript , так как с версии 9.07 он может линеаризовать PDF-файлы с помощью простого дополнительного флага, о котором также сообщается здесь .

Я хочу завершить свой ответ не только с помощью современного метода для преобразования PDF-файла в формат A-1b с помощью ghostscript , но и для отчета о том, как его локально проверять с помощью инструмента java и preflight из библиотеки Apache PDFBox.

Преобразование любого PDF в PDF / A-1b с Ghostscript 9.19

 gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dSAFER -sColorConversionStrategy=UseDeviceIndependentColor -dEmbedAllFonts=true -dPrinted=true -dPDFA -sProcessColorModel=DeviceRGB -dPDFACompatibilityPolicy=1 -dDetectDuplicateImages -r150 -dFastWebView=true -sOutputFile=output.pdf input.pdf 

Проверка вашего PDF / A-1b локально с предпродажей Java 8 и Apache PDFBox

Вся информация в комментариях кода. Загрузите последнее preflight-app с сайта Apache PDFBox .

На момент написания последней версии 2.0.2.

 /** * Source: * https://pdfbox.apache.org/1.8/cookbook/pdfavalidation.html * * Compilation: * $ javac -cp preflight-app.2.0.2.jar:. Validator.java * * Usage: * $ java -cp preflight-app.2.0.2.jar:. Validator input.pdf */ import org.apache.pdfbox.preflight.ValidationResult; import org.apache.pdfbox.preflight.parser.PreflightParser; import org.apache.pdfbox.preflight.PreflightDocument; import org.apache.pdfbox.preflight.exception.SyntaxValidationException; import org.apache.pdfbox.preflight.ValidationResult.ValidationError; public class Validator { public static void main( String[] args ) throws Exception { ValidationResult result = null; PreflightParser parser = new PreflightParser(args[0]); try { parser.parse(); PreflightDocument document = parser.getPreflightDocument(); document.validate(); result = document.getResult(); document.close(); } catch (SyntaxValidationException e) { result = e.getResult(); } if( result.isValid() ) System.out.println("The file " + args[0] + " is a valid PDF/A-1b file"); else { System.out.println("The file " + args[0] + " is not valid, error(s) :"); for( ValidationError error : result.getErrorsList() ) System.out.println(error.getErrorCode() + " : " + error.getDetails()); } } }