[gull] Lecture de PDF google books sous linux

Félix Hauri felix at f-hauri.ch
Tue Mar 24 08:46:15 CET 2009


Bonjour,

Tout d'abord, désolé pour la réponse sur le tard, mais
pour manipuler et tester un fichier de 560 pages, j'ai utilisé
des nuits. (lancer la commande... voir au petit matin, la durée
et le résultat)...

On Fri, Mar 20, 2009 at 04:05:42AM -0700, Samuel Chenal wrote:
> 
> Hello,
> 
> 
> Sur le pdf, la page correspondante est la 15. La gravure en bas de la 
> page n'apparaît pas.
Ok, vu! (Sans Windows! et sous Debian;)

> Le test a été effectué sur :
> 
> - Ubuntu 8.10 avec evince et xpdf.
> - Kubuntu 8.04 avec kpdf et KGhostView.
Etrange!

> Mêmes résultats avec evince, kpdf et xpdf. Le fichier n'est pas lisible 
> sous KGhostView.
Là, par contre, c'est normal:

evince, kpdf et xpdf utilisent tous le même ``moteur'' postscript.
(Je suis plus étonné en ce qui concerne KGhostView, mais comme
 je n'utilise pas KDE, je ne sais pas trop de quoi il s'agit)
En gros, on trouve essentiellement 2 moteurs postscript distincts
sur une distrib linux standard: xpdf et ghostscript.
Xpdf est rapide et spécialisé dans le traitement pdf.
Ghostscript et le moteur d'impression qu'utilise entre autres cups.

Mes premiers tests sous xpdf m'ont permis de constater que la page
15 contient une zone blanche importante en bas de page.

J'ai donc lancé ghostscript via GV (voire ggv) mais le programme
semblait planté.

J'ai alors lancé ghostscript en ligne de commande dans un terminal:
$ gs La_figure_de_la_terre.pdf
AFPL Ghostscript 8.53 (2005-10-20)
...
>>showpage, press <return> to continue<<

14x ``return'', pour observer la page 15. Ai pu alors constater
qu'une gravure figure effectivement sur cette page.

J'ai tenté de lancer simplement
$ pdf2ps La_figure_de_la_terre.pdf
mais là, après une bonne dizaine de minutes:
Segmentation fault
Il a pondu un fichier de 1.3Go pour 89 pages (sur 560), mais
les gravures y sont présentes.

J'ai alors lancé la commande suivante:
$ file=La_figure_de_la_terre
$ gs -sDEVICE=pswrite -dNOPAUSE -dBATCH -dSAFER -sOutputFile=${file}_p%04d.ps ${file}.pdf -c quit

Vingt minutes plus tard (et 1.3Go), à nouveau
Segmentation fault
J'insiste:
$ gs -sDEVICE=pswrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=88 -sOutputFile=${file}_q%04d.ps ${file}.pdf -c quit

Les pages 88 et 89 sont très rapides, je compare:
$ diff ${file}_p0088.ps ${file}_q0001.ps
7c7
< %%CreationDate: 2009/03/21 21:34:48
---
> %%CreationDate: 2009/03/21 21:41:56
60c60
< %%Page: 88 1
---
> %%Page: 1 1

Il sont ``identiques''!

...
Il s'est re-planté à la page 175...
Je peux relancer la commande précédente en changeant le 88 pour 174 et
le ``q'' par un ``r'', afin de
 - pouvoir comparer 2 pages pour supprimer les doublons
 - pouvoir les repasser dans un filtres, si nécessaire,
   l'ordre alphabetique respectera l'ordre des pages
   (q_0002 vient apres p_0088 ainsi que r_0002 suit q_0086)

Bref, à partir de là, je peux dire:
Ces fichier sont difficiles à digérer si tu ne dispose pas d'un moteur
récent, de préférence adobe (quoique, sur ma version 5, il n'y a pas 
de gravures non plus;).

Une petite pause supplémentaire sera nécessaire pour recréer un pdf:
$ gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -sOutputFile=${file}b.pdf ${file}*.ps -c quit
(compter une bonne heure...)
mais au final, on obtiens un fichier pdf lisible avec un peu n'importe
quel viewer... 
(... capable de manipuler un fichier de 560 pages et 1.2Go:~2Mo/page)

La vitesse d'execution (et le nombre de pages avant plantage) dépend
des ressources disponibles
Je l'ai fait sans ``fault'' sur une version identique de GS,
sur une machine pourvue de 5Go de RAM, la mienne n'en à ``que'' 1.
en presqu'une heure pour un resultat pesant ~5.5Go )

Maintenant, voici une solution sous bash qui marche,
(pas vite, mais qui marche;)
$ for ((i=1;i<561;i++));do gs -r1000 -sDEVICE=pnmraw -q \
    -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dNOPAUSE -dBATCH -dSAFER \
    -dFirstPage=$i -dLastPage=$i -sOutputFile=- ${file}.pdf -c quit |
    pnmscale .2 |
    if [ $i -lt 7 ] || [ $i -gt 557 ];then
	 cat;
      else
         ppmtopgm ;
      fi | 
    pnmtops -eq -dpi 200 >$(printf "${file}-%04d.ps" $i) 2>/dev/null;
    done
$ cat ${file}-*.ps | ps2pdf - ${file}2.pdf

Cela à pris environ 3 heures à ma machine, mais au final, j'obtiens
un fichiers de 165Mo, avec mes 560 pages dont les pages 1-6 et 558-560
en couleurs.

Le final pèse environ 6x plus que l'original, mais il est nettement
plus digeste! S'affiche sur *tous* mes viewers et rapidement!

> Merci d'avance pour vos éclairages ! Et dites-moi si vous observez le 
> même problème chez vous avec votre configuration.
Si tu as bcp de bouquins à manipuler, échanger, imprimer (partiellement)
etc, alors cela vaudrait peut-être la peine de systématiser la méthode
(en faire un script)

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch



More information about the gull mailing list