Validação do Ghostscript + QPDF e PDF / A-1b: como adicionar o separador EOL antes dos fluxos finais

1

Estou tentando definir um método atualizado para converter qualquer PDF em um PDF / A-1b capaz de passar 3-Heights validação. Eu criei este script que usa ghostscript e 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

Que transforma qualquer PDF em um PDF / A-1b otimizado para a Web.

Tudo está bem, exceto que o ghostscript parece não adicionar EOLs ausentes antes dos fluxos finais, o que não permitirá que o documento processado passe na validação. Este é o resultado da validação que recebo:

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.

Você conhece alguma forma ou ferramenta com a qual esses separadores EOL possam ser adicionados?

Sugestões alternativas válidas e atualizadas para converter PDF para PDF / A-1b também são bem-vindas.

    
por Luca C 08.08.2016 / 20:20

1 resposta

0

Eu estava cegamente focado em ghostscript , mas graças a Stephen, descobri que isso parece devido a um erro em qpdf . Vou enviar um relatório claro por meio do GitHub.

Podemos fazer todo o trabalho com ghostscript sozinho, já que a partir da versão 9.07 ele pode linearizar PDFs com um simples sinalizador adicional, conforme relatado também aqui .

Desejo concluir minha resposta não apenas fornecendo um método atualizado para converter um PDF no formato A-1b com ghostscript , mas também informando como validá-lo localmente com java e a ferramenta de comprovação do Apache PDFBox biblioteca.

Convertendo qualquer PDF para PDF / A-1b com o 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

Validando seu PDF / A-1b localmente com Java 8 e preflight do Apache PDFBox

Todas as informações nos comentários do código. Baixe o mais recente preflight-app do site do Apache PDFBox .

No momento da redação, a versão mais recente é 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());
        }
    }
}
    
por 09.08.2016 / 13:20