Manipulando (remapeando) fontes em falta / problemáticas (CID / CJK) em PDF com ghostscript?
Em resumo, estou lidando com um PDF problemático, que:
Não pode ser totalmente renderizado em um visualizador de documentos comoevince
, por causa da falta de informações da fonte;Contudo -ghostscript
pode renderizar totalmente o mesmo PDF.Assim - independentemente do queghostscript
usa para preencher os espaços em branco (talvez glifos de fallback, ou um método diferente para acessar fontesGostaria de poder usarghostscript
para produzir ("destilar") um PDF de saída, onde praticamentenada será alterado, exceto as informações da fonte adicionadas,evince
pode processar o mesmo documento da mesma maneira queghostscript
posso.
Minhasquestão é assim - isso é possível de forma alguma? e se sim, qual seria a linha de comando para conseguir algo assim?
Muito obrigado antecipadamente por qualquer resposta,
Felicidades!
Eu estou realmente em um Ubuntu 10.04 mais velho, e eu poderia estar experimentando - não um bug - mas um problema de instalação comevince
(falta depoppler-data
pacote), como observado emBug # 386008 “Algumas fontes não são exibidas devido a“ Unknown font tag ... ”: Bugs: pacote“ poppler ”: Ubuntu.
No entanto, é exatamente isso que eu gostaria de lidar, então vou usar ofontspec.pdf
anexado a esse post ("PDF provocando o bug.", / / v.) para demonstrar o problema.
evince
Primeiro, abro a página 3 deste pdf emevince
; eevince
reclama:
$ evince --page-label=3 fontspec.pdf
Error: Missing language pack for 'Adobe-Japan1' mapping
Error: Unknown font tag 'F5.1'
Error (7597): No font in show
Error: Unknown font tag 'F5.1'
Error (7630): No font in show
Error: Unknown font tag 'F5.1'
Error (7660): No font in show
Error: Unknown font tag 'F5.1'
...
A renderização é assim:
... e é óbvio que algumas formas de fonte estão faltando.
Adobeacroread
Apenas uma nota sobre como o Adobe Acrobat Reader for Linux se comporta; a seguinte linha de comando:
$ ./Adobe/Reader9/bin/acroread /a "page=3" fontspec.pdf
... não gera saída para qualquer terminal (para mais sobre/a
mudar, verAcroread da página do homem) - e o programa não tem absolutamente nenhum problema em exibir as fontes.
Além disso, enquanto eu gostaria de evitar a ida e volta ao postscript - no entanto, note queacroread
em si pode ser usado para converter um PDF para postscript:
$ ./Adobe/Reader9/bin/acroread -v
9.5.1
$ ./Adobe/Reader9/bin/acroread -toPostScript \
-rotateAndCenter -choosePaperByPDFPageSize \
-start 3 -end 3 \
-level3 -transQuality 5 \
-optimizeForSpeed -saveVM \
fontspec.pdf ./
Novamente, a linha de comando acima não gerará saída para o terminal;-optimizeForSpeed -saveVM
estão lá porque aparentemente eles lidam com fontes; o último argumento./
é o diretório de saída (o arquivo de saída é chamado automaticamentefontspec.ps
).
Agora,evince
posso exibir as fontes ausentes anteriormente nofontspec.ps
saída - mas novamente reclama:
$ evince fontspec.ps
GPL Ghostscript 9.02: Error: Font Renderer Plugin ( FreeType ) return code = -1
GPL Ghostscript 9.02: Error: Font Renderer Plugin ( FreeType ) return code = -1
...
... e além disso, tudotexto parece ser achatada para curvas no postscript - agora não é possível selecionar o texto no arquivo .ps emevince
mais (observe que o arquivo .ps não pode ser abertoacroread
). No entanto, pode-se converter este .ps novamente em .pdf:
$ pstopdf fontspec.ps # note, `pstopdf` has no output filename option;
# it will automatically choose 'fontspec.pdf',
# and overwrite previous 'fontspec.pdf' in
# the same directory
... e agora o texto na saída depstopdf
é selecionável emevince
, todas as fontes estão lá eevince
não reclama mais. No entanto, como observei, gostaria de evitar a ida e volta para os arquivos postscript.
display
(porimagemagick
)Podemos também observar a página no mesmo documento comimagemagick
s display
(Observe queimagem panorâmica a partir da linha de comando usando 'display' aparentemente ainda não está disponível, então eu usei-crop
abaixo para ajustar a janela de exibição):
$ display -density 150 -crop 740x450+280+200 fontspec.pdf[2]
**** Warning: considering '0000000000 00000 n' as a free entry.
...
**** This file had errors that were repaired or ignored.
**** The file was produced by:
**** >>>> Mac OS X 10.5.4 Quartz PDFContext <<<<
**** Please notify the author of the software that produced this
**** file that it does not conform to Adobe's published PDF
**** specification.
... o que gera algunsghostscrip
erros ish - e resultados com algo parecido com isto:
... onde é óbvio que as fontes ausentesevince
não foi possível renderizar, agora são mostrados aqui, comimagemagick
s display
, devidamente.
ghostscript
Finalmente, podemosusar ghostscript como visualizador x11 em si - para observar a mesma página, mesmo documento:
$ gs -sDevice=x11 -g740x450 -r150x150 -dFirstPage=3 \
-c '<</PageOffset [-120 520]>> setpagedevice' \
-f fontspec.pdf
GPL Ghostscript 9.02 (2011-03-30)
Copyright (C) 2010 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
Processing pages 3 through 74.
Page 3
>>showpage, press <return> to continue<<
^C
... e resultados com esta saída:
Em conclusão:ghostscript
(epelo visto por extensão,imagemagick
) aparentemente pode encontrar a fonte ausente (ou pelo menos alguma substituição para ela), e renderizar uma página com isso - mesmo seevince
falha no mesmo documento.
Eu gostaria, portanto, simplesmente de exportar uma versão em PDFghostscript
, que teria apenas as fontes ausentes incorporadas e nenhum outro processamento; então eu tento isso:
$ gs -dBATCH -dNOPAUSE -dSAFER \
-dEmbedAllFonts -dSubsetFonts=true -dMaxSubsetPct=99 \
-dAutoFilterMonoImages=false \
-dAutoFilterGrayImages=false \
-dAutoFilterColorImages=false \
-dDownsampleColorImages=false \
-dDownsampleGrayImages=false \
-dDownsampleMonoImages=false \
-sDEVICE=pdfwrite \
-dFirstPage=3 -dLastPage=3 \
-sOutputFile=mypg3out.pdf -f fontspec.pdf
GPL Ghostscript 9.02 (2011-03-30)
Copyright (C) 2010 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
**** Warning: considering '0000000000 00000 n' as a free entry.
Processing pages 3 through 3.
Page 3
**** This file had errors that were repaired or ignored.
**** The file was produced by:
**** >>>> Mac OS X 10.5.4 Quartz PDFContext <<<<
**** Please notify the author of the software that produced this
**** file that it does not conform to Adobe's published PDF
**** specification.
... mas não funciona - o arquivo de saídamypg3out.pdf
sofre exatamente os mesmos problemas emevince
como observado anteriormente.
Nota: Enquanto eu gostaria de evitar a viagem de ida e volta postscript, um bom exemplo degs
linha de comando com a partir de pdf para ps com incorporação de fontes está aqui:(# 277826) pdf - Como fazer com que o GhostScript PS2PDF pare de criar fontes; mas a mesma linha de comando muda para .pdf para .pdf para não parecer ter qualquer efeito sobre o problema descrito acima.