Résolution rapide d'un problème fréquent:

Je viens vers vous car j'aurais besoin d'aide. J'aimerais récupérer le contenu du site suivant http://bordbuch-online.audi.de/AudiBordbuch/docs/XXXXXXX-XXXX-XXXXXX-XXXXXX/index.html;jsessionid=XXXXXXXXX?setlanguage=fr#undefined au format PDF. Pourriez-vous m'indiquer si c'est possible, et si oui la marche à suivre ? À part faire des captures d’écran et de les "photoshoper" je ne vois pas comment capturer ça !

On s'est tous retrouvés devant une ressource en ligne non téléchargeable ou dont les droits d'utilisation sont restreints. En l'occurrence voici le problème:

manuel_capture

Le lecteur est bien beau (il y a même une petite musique quand on tourne les pages...) mais c'est quand même un peu de la merde si on veut lire le contenu hors ligne.

Cette maladie du "tout dématérialisé" touche maintenant tous les domaines. Voici une piste de résolution du problème parmi d'autres...

Sommaire

Wireshark - Analyse réseau

Cet outil d'analyse réseau est incontournable !

On s'aperçoit vite qu'un fichier swf est téléchargé à chaque page visionnée:

url wireshark

Il va donc falloir récupérer tous ces fichiers. Ça tombe bien le répertoire en question est indexable:

index_swf

Lien:

http://bordbuch-online.audi.de/AudiBordbuch/docs/XXXXXXX-XXXX-XXXXXX-XXXXXX/files/assets/flash/pages/index.html

où XXXXXXX-XXXX-XXXXXX-XXXXXX est un token de session généré à chaque connexion sur la documentation en ligne.

Dump

Utilisons wget en copie récursive:

wget -A *.swf --recursive --no-clobber "http://bordbuch-online.audi.de/AudiBordbuch/docs/XXXXXXX-XXXX-XXXXXX-XXXXXX/files/assets/flash/pages/index.html"

Avec:

  • -A: Filtre pour les fichiers voulus
  • --recursive: Parcours récursif du répertoire
  • --no-clobber: Ne pas retélécharger la ressource

On trouve donc tous les fichiers swf dans notre dossier. La conversion de ces fichiers au format pdf reste à faire mais n'est pas si aisée...

Conversion

Je fais appel à une version modifiée d'un utilitaire fourni dans le paquet swftools sous Linux. Ce paquet regroupe pas mal d'outils, mais surtout des outils destinés à générer du swf.

On trouve par exemple swfrender destiné à générer des images à partir d'un fichier swf. Ce n'est pas ce que l'on veut. Il nous faut un format vectorisé qui nous permette de zoomer à volonté sur le texte, voire d'effectuer des recherches.

swfrender - bitmap rendering from swf files created with pdf2swf, jpeg2swf or png2swf

On y trouve également l'outil gfx2gfx. Le problème est qu'il n'est pas compilé par défaut donc pas utilisable directement. De plus, une fois qu'on a réussi à le compiler via les sources, l'outil limite la résolution max des images à 72dpi.

Ce dépôt explique comment réaliser une petite modification sur les sources qui nous permettra de spécifier la limite max de résolution:

https://gist.github.com/mems/5301297

L'application du patch va générer des erreurs. À vous d'appliquer les correctifs rejetés dont la liste se trouve dans le fichier gfx2gfx.c.rej exposé ci-dessous.

--- src/gfx2gfx.c 2016-03-13 01:08:14.000000000 +0100
+++ src/gfx2gfx.c 2016-03-13 00:58:31.000000000 +0100
@@ -50,6 +50,7 @@

static char * outputname = 0;
static int loglevel = 3;
+static char * maxdpi = "72";
static char * pagerange = 0;
static char * filename = 0;
static const char * format = 0;
@@ -115,7 +121,7 @@
    }
    else if (!strcmp(name, "V"))
    {
-   printf("pdf2swf - part of %s %s\n", PACKAGE, VERSION);
+   printf("gfx2gfx - part of %s %s\n", PACKAGE, VERSION);
    exit(0);
    }
    else
@@ -131,6 +137,7 @@
{"q","quiet"},
{"V","version"},
{"s","set"},
+ {"r","resolution"},
{"p","pages"},
{0,0}
};
@@ -269,6 +276,7 @@
        msg("<error> Invalid output format: %s", format);
        exit(1);
    }
+   out->setparameter(out, "maxdpi", maxdpi);

        int pagenr;
        for(pagenr = 1; pagenr <= doc->num_pages; pagenr++)

Veillez à bien suivre les étapes du tuto. Ne pas oublier de télécharger, compiler, installer pdflib.

Au moindre problème de compilation, effacez config.h et relancer ./configure

Voici la liste des dépendances système:

sudo apt-get install libfontconfig1-dev libfftw3-dev libzzip-dev libgif-dev libpng12-dev libjpeg62-turbo-dev

On n'a plus qu'à se placer dans le dossier de nos swf puis:

find . -iname "*.swf" -exec echo {} \; -exec gfx2gfx {} -r 500 -o {}.pdf \;

Avec:

  • -r 500: La limite max de résolution (assez haute pour ne pas générer d'erreur).

La conversion se fait toute seule. Il ne reste plus qu'à assembler nos pages.

Assemblage

L'assemblage se fait avec pdfunite:

pdfunite *.pdf "Audi A3 Sportback - Notice d'Utilisation - 112.561.8PA.40 - 11.2010.pdf"

Discussion

gfx2gfx ne nous permet pas de générer du texte indexable. En effet le texte est converti en chemins vectoriels. Cela engendre deux problèmes: impossibilité de faire une recherche textuelle, et augmentation colossale du poids du pdf final (x2 à x10).