Como posso determinar a contagem de páginas de um arquivo postscript (gerado pelo Opera)?

2

Eu não conheço o idioma do postscript.

Eu tenho um sistema de emulação de impressão duplex escrito em bash. Imprime as páginas ímpares primeiro e depois as páginas pares. Ele precisa saber se há uma contagem de páginas ímpares para que possa ejetar a última página ímpar que não tenha um lado par correspondente. Ele também usa contagens de páginas para fins de relatório.

Eu não sabia como fazer isso corretamente, então eu escrevi o código que olha para o final e, se necessário, o início do arquivo postscript procurando por "%% Pages:" que é seguido por uma contagem de páginas. Isso funciona em quase tudo, exceto arquivos impressos pelo navegador Opera.

Alguém pode sugerir outra maneira de obter essa informação?

Os arquivos Postscript tendem a ser bastante grandes, com muito conteúdo não legível para humanos, então eu ainda não passei muito tempo derramando sobre os que saem do Opera.

TIA

O código atual está em:

http://sourceforge.net/projects/duplexpr/

function ps_page_ct
Joe
fonte

Respostas:

5

O seguinte comando do Ghostscript contará confiavelmente as páginas em seu arquivo PostScript - mas pode ser bastante lento, porque requer que o arquivo seja completamente interpretado (executado), como @afrazier já declarado em um comentário:

gs \
 -o /dev/null \
 -sDEVICE=bbox \
  input.ps 2>&1 \
| grep HiResBoundingBox \
| wc -l
Kurt Pfeifle
fonte
Finalmente! Eu vou dar uma olhada e voltar aqui. Obrigado.
Joe
Isso parece funcionar, mas "um pouco lento" é um eufemismo. No meu notebook I3, um documento de três páginas é executado em apenas dois minutos. Na melhor das hipóteses, posso adicionar um switch (opção) ao meu sistema para usar esse método como último recurso. Nesse meio tempo, alterei meu código para contar "HiResBoundingBox" em vez de "showpage".
Joe
@Joe: Se o seu código depender de simplesmente grep -para HiResBoundingBox: isso não vai funcionar. Essa palavra não precisa ser usada em arquivos de entrada - sua aparência no fluxo de saída é causada pelo Ghostscript interpretando todas as entradas e destilando esse fragmento de informações para você.
Kurt Pfeifle
@Joe: O motivo pelo qual eu disse que o comando é 'bastante lento' é o seguinte: o Ghostscript precisa interpretar e renderizar completamente o arquivo PostScript (sem exibi-lo) para extrair com segurança as informações do número da página. É tanto trabalho quanto exibir completamente o arquivo na tela. A razão para isso é que PostScript é uma linguagem de programação completa e, para ver o que está acontecendo em um ponto, o interpretador precisa executar sequencialmente todo o código que está localizado antes daquele ponto .
Kurt Pfeifle
@Joe: Dois minutos para um documento de 3 páginas é extremo. Isso significa que este documento é um animal bastante complexo, e que o Ghostscript levaria o mesmo tempo para simplesmente mostrar esse documento na tela ...
Kurt Pfeifle
5

Infelizmente, não há uma maneira simples de encontrar páginas em um arquivo Postscript bruto. É por isso que %%Pages A convenção foi criada (Convenções de estruturação de documentos da Adobe).

O comando para a emissão de uma página é showpage. Em casos simples, você só precisa contá-los.

Mas este comando pode ser embutido no corpo de uma função e então você precisa de um analisador Postscript.

mouviciel
fonte
+1 para o que é, em última análise, a resposta correta. Postscript é uma linguagem completa. Se você quiser uma resposta precisa, interpretar o arquivo é o "One True Way". Eu começaria a olhar seriamente para alavancar Ghostscript se você realmente precisa disso.
afrazier
@afrazier: Você já comparou essa "uma resposta verdadeira" com a minha? Como o meu então taxa na sua escala de exatidão?
Kurt Pfeifle
@KurtPfeifle: Eu não vi sua resposta, mas depois de analisá-la, definitivamente vale +1. Depois de mais algumas pesquisas no Google, você também postou isto em SO. Há também isto comentário do mantenedor do GhostScript. Eu não tenho certeza que eles serão mais rápidos do que o que você usou acima.
afrazier
2

Eu encontrei este pequeno trecho em algum lugar, ele irá processar o documento muito rápido e imprimir a contagem de páginas. Isso pode ajudar se o exiftool não imprimir essas informações de metadados porque o documento não foi gerado corretamente:

gs -dNODISPLAY -dBATCH -dNOPAUSE -o /dev/null source|grep -P '^Page'|wc -l
j.berrisch
fonte
Tentei em dois arquivos de teste. Um deu 0 para um documento de 3 páginas e o outro gerou uma mensagem de erro do ghostscript.
Joe
Você tentou sem o |grep ....? Qual é a saída? Eu o uso como fallback quando os dados exif não contêm 'Page Count'. Existe um link para os documentos que você está usando? Qual versão do ghostscript você está usando? Em qual sistema operacional?
j.berrisch
Aqui está um documento: dl.dropboxusercontent.com/u/54584985/Opera01.ps . Faz 'bigbird @ ramdass: ~ / pgm / duplex_proj / devel / teste_data $ gs -dNODISPLAY -dBATCH -dNOPAUSE -o / dev / null Opera01.ps | grep -P' ^ Página '| wc -l 0' Aqui está sem o grep 'bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ gs -dNODISPLAY -dBATCH -dNOPAUSE -o / dev / null Opera01.ps GPL Ghostscript 9.05 (2012-02-08) Copyright (C) 2010 Artifex Software, Inc. Todos os direitos reservados. Este software vem com NENHUMA GARANTIA: veja o arquivo PUBLIC para detalhes. bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ 'Desculpe pelo formato.
Joe
Desculpe, mas você está certo, eu só testei para o meu PDF formatado ruim para o qual ele funciona bem tranquilo. Talvez o Opera deva consertar alguma coisa porque o resultado exiftool mostra uma propriedade 'Páginas', mas com um valor conectado 'atend'.
j.berrisch