A conversão do Ghostscript PDF / A falha

5

Estou desenvolvendo um fluxo de trabalho "sem papel" e planejo salvar todos os arquivos no formato PDF / A-1b.

Estou tentando desenvolver um arquivo de lote simples para converter arquivos PDF criados ou recebidos em PDF / A-1b. A partir de esta resposta , tenho o seguinte arquivo em lotes:

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

Em PDFA_def.ps, eu tentei alguns perfis ICC diferentes, incluindo um que encontrei no meu sistema

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

e sRGB_IEC61966-2-1_no_black_scaling.icc de color.org .

Meu arquivo de entrada de teste é um e-mail de 1 página impresso a partir do Microsoft Outlook 2010 usando o CutePDF 2.8 (que usa o Ghostscript 8.15).

Após a conversão com meu arquivo de lote e o Ghostscript 9.07, o Adobe Reader acha que a saída é PDF / A, mas a validação PDF / A-1b é feita por pdf-tools.com falha com a mensagem" O valor da chave N é 4, mas deve ser 3. "

Eu rastreei isso de volta para a seguinte construção no arquivo de saída PDF:

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

Se eu alterar /N 4 para /N 3 , a mensagem "valor da chave N" desaparece. /N aparentemente representa o número de objetos no fluxo que segue este cabeçalho. Eu não sei ler o fluxo codificado, então eu não entendo o que ele contém nem porque o pdf-tools acha que ele deve conter apenas 3 objetos.

Um PDF / A impresso usando o Bullzip, que também usa o Ghostscript, também falha na validação com a mensagem "a chave N é 4, mas deve ser 3".

Isso tem algo a ver com o espaço de cores? Eu estou fora da minha profundidade lá. Eu acho que ficaria feliz com um espaço sRGB "simples". Documentos do Ghostscipt dizem que a codificação em PDF / A deve ser CMYK . A Adobe indica que RGB ou CMYK funciona para PDF / A. Então, não tenho certeza de como encontrar um perfil .icc apropriado.

Ou talvez o validador esteja errado e esteja tudo bem?

    
por Mark Berry 26.03.2013 / 00:53

2 respostas

7

Com a ajuda de um desenvolvedor do GhostScript neste relatório de erros , consegui resolver o /N problem. Lições aprendidas:

  • O documento do GhostScript mencionado em minha pergunta está desatualizado. O documento atual, aqui , diz que ProcessColorModel = DeviceRGB está correto.
  • Perfis ICC descrevem um espaço de cores. Alguns espaços de cores válidos são CINZENTO, RGB e CMYK. Você pode verificar o espaço de cores de um perfil ICC usando o Inspetor de Perfis ICC gratuito .
  • Na seção do arquivo PDF que causa erros de validação, /N representa o número de corantes.
  • O arquivo PDFA_def.ps emite o valor /N . A amostra incluída no Ghostscript 9.07 emite apenas /N 1 (para ProcessColorModel = DeviceGray) ou /N 4 (para qualquer outro ProcessColorModel).
  • Meu teste original especificado ProcessColorModel = DeviceCMYK que causou /N 4 , mas usou um perfil ICC descrevendo um espaço de cores RGB. Os validadores captaram corretamente essa discrepância: eu prometi 4 cores, mas apenas descrevi 3.

A maioria dos perfis ICC encontrados para monitores e impressoras de escritório descrevem um espaço de cores RGB. (O CMYK parece mais específico para impressoras de alta qualidade e certos tipos de papel.) Para os meus propósitos, o RGB é preferível. O arquivo de lote a seguir converte um arquivo PDF em PDF / A-1b com um espaço de cor 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

Em PDFA_def.ps, especifique um perfil ICC que descreva um espaço de cores RGB e altere a seção para definir um perfil ICC da seguinte forma:

% 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

A linha longa inclui uma instrução ifelse aninhada que detectará ProcessColorModel = DeviceRGB e emitirá o /N 3 apropriado. O arquivo resultante deve passar pela validação em pdf-tools.com .

Atualização: criei um programa em lote um pouco mais eficiente e o publiquei em um post no blog: Lote Converter PDF para PDF / A .

    
por 05.04.2013 / 20:15
3

Sugiro que primeiro refaça o teste do seu problema na última versão 9.07 do ghostscript, para o caso de este problema já corrigido.

Se isso não ajudar, será necessário um especialista em PDF para responder a esse problema. Eu suspeito que o problema tenha algo a ver com um conflito entre o conteúdo do arquivo .ps e os parâmetros do comando gswin32c.

No entanto, como o arquivo problemático é gerado pelo ghostscript, você tem o direito de postar sua pergunta na página do Bugzilla do ghostscript (é necessário o registro), onde os desenvolvedores responderão sua pergunta. Se for um bug no ghostscript, provavelmente será corrigido na próxima versão.

Além da descrição do problema como em sua postagem, você deve anexar um arquivo .ps de entrada de exemplo e o arquivo .pdf resultante. Tente minimizar seus tamanhos.

No passado eu relatei vários bugs suspeitos de ghostscript naquele fórum e sempre fui bem respondido, e os bugs reais que encontrei foram todos corrigidos.

    
por 30.03.2013 / 09:19