AS3 - loading de swf générés avec pdf2swf

1 view
Skip to first unread message

Sylvain

unread,
Dec 4, 2008, 11:21:10 AM12/4/08
to FCNG
Bonjour à tous !

Je travaille sur une application Flex. Dans cette application j'ai un
module qui charge
des fichiers swf puis les convertis en bitmap pour être affichés sous
forme de vignettes.
Les fichiers swf sont générés depuis des PDF grâce à l'outil pdf2swf.
Un pdf correspond à une vignette et donc chaque pdf sera converti en
un swf.

Le problème est que quelques rares fichiers swf sont difficilement
lisibles.
C'est à dire que le processeur rame pour pouvoir les ouvrir.
J'aimerai donc pouvoir détecter ces fichiers complexes pour stopper
leur chargement,
ou mieux encore, les détecter avant de commencer le chargement.


J'ai testé plusieurs choses :

- Un timer lancé juste avant d'éxecuter le load(). Mais comme je le
craignais,
l'event du timer n'est pas déclenché. Le loading fait mouliner le pc
et je ne peux rien faire tant qu'il n'est pas terminé.

- Pour le chargement des swf, j'ai fait un loader qui load les
fichiers un par un,
en attendant que le chargement d'un swf soit terminé avant de passer
au suivant.
J'écoute donc les différents event.
OPEN est bien effectué, mais le INIT et le COMPLETE sont lancés
seulement lorsqu'il
a fini de mouliner. Sur le PROGRESS, j'affiche les bytesLoaded, mais
là aussi les
traces n'apparaissent que lorsque le pc a fini de ramer.


Par contre, je me suis aperçu dans la console flex que pour les
fichiers qui me posent
problème, le nombre de "bytes after decompression" est plus important.
Le problème pourrait donc venir de la compression du fichier swf !

Y'a t'il un moyen de corriger cela dès la source, à savoir lors de la
génération avec pdf2swf ?
(si quelqu'un a déjà utilisé cet outil...)

Ou sinon comment peut-on récupérer la valeur de bytes after
decompression, avant de loader le swf ?
(Flex l'affiche dans sa console, avant de charger un swf, donc il doit
bien y avoir un moyen)

Autre possibilité, y'a t'il un moyen de stopper le chargement du
loader ?
J'ai essayé d'appeler la méthode close(), mais sur quel event puisque
je ne peux pas avec un timer,
ni avec l'event PROGRESS ?

Tout autre idée ou avis est bien sur le bienvenue !

ekameleon

unread,
Dec 4, 2008, 11:58:01 AM12/4/08
to FC...@googlegroups.com
hello :)

Rapido car j'ai pas beaucoup de temps (désolé ;))

1 - Il faut qu'on voit du code ce serait plus simple pour voir ce que tu fais et voir si le problème vient vraiment du PDF ou de l'application (voir le message en haut sur le FCNG
2 - Il faut que l'on voit des exemples de PDF que tu utilises
3 - Il serait pas mal que tu fasses des tests en pure AS3 ? Enfin tant tu fais du pure AS3 mais comme tu nous dis pas grand chose sur ton code difficile de se faire une idée ;)

4 - Pourquoi cherches tu à convertir tes swf en thumbs dans Flash ? Pourquoi ne fais tu pas cela directement côté serveur, cela peut alléger le process non ??
5 -  Tu utilises quelle version du FlashPlayer 9 ou 10 ?
6 - Quand tu charges tes swfs .. tu les décharges ensuites ? Ou tu laisses tout en mémoire ?

En principe le process devrait être :

1 - faire un batch côté serveur pour transformer tous tes swf en thumbs (FFMpeg en ligne de commande ou PHP peut faire ce genre de chose je crois)
2 - charger un modèle qui te permet d'afficher tes thumbs léger déjà sur le serveur
3 - tu cliques sur un thumb et tu charges le swf et l'affiche
4 - Si tu cliques sur un autre thumb, tu décharges le premier (sur FP10 c'est mieux) et tu charges le nouveau pour le remplacer.

Pour stopper le chargement d'un loader il faut ABSOLUMENT le FP10 avec les  nouvelles méthodes de la classe Loader ;) unLoadAndStop() si je ne me trompe pas :)

EKA+ :)

Sylvain

unread,
Dec 4, 2008, 2:23:45 PM12/4/08
to FCNG
Merci pour ta réponse !

Alors :

1 - Je veux bien poster le code de mon loader, mais ca risque de ne
pas être super lisible sur le newsgroup.
Et je pense réellement que le problème ne vient pas du loader puisque
la grande majorité des swf
sont chargés correctement. De plus, comme je l'explique plus loin dans
le point 3, les swfs problèmatiques
s'ouvrent également difficilement dans le player flash.

2 - Je vais trouvé un endroit pour mettre 2-3 pdfs qui posent problème
et qu'ils soient accessibles.

3 - En fait, je suis dans Flex mais pour le loader j'ai fait des
classes en AS3.
De plus, le projet contient également une partie en Flash pour
laquelle le même problème se pose.
C'est un collègue qui développe cette partie, son loader est un peu
différent je pense,
mais le principe est le même.
On a donc des codes différents, mais le même problème.
C'est aussi pour cela que je pense que le problème vient des swf
convertis.

Quelques précisions utiles que j'ai oubliées (my mistake) :

les swf qui posent problème sont également difficiles à ouvrir
directement avec le player flash, donc sans passer dans notre code.
Lors de la génération avec pdf2swf, par défaut tout est généré en
vectoriel.
Mais je peux ajouté une option qui convertie les textes en vectoriel
mais les images sont compressées en jpeg.
Avec cette option activée, les swf générés ne posent plus problème !
Malheureusement je ne peux pas activer cette option par défaut pour
une raison de qualité.
(le full vectoriel est nécessaire autant que possible).
C'est pour ça que je souhaite détecter les swf qui déconnent, pour les
reconvertir en activant l'option.

Pour le fonctionnement de mon module, j'affiche toutes les pages d'une
publication
(catalogue ou magazine par exemple), les vignettes représentent donc
les pages.
On peut drag & droper ces pages, les remplacer, en ajouter, etc...


4 - Je dois tout faire côté client car l'application peut-être
utilisée en local, sans serveur donc.
Enfin, seule la partie Flash est utilisée en local. Je n'avais pas
pensé à faire ça côté serveur,
mais ça ne résoudra pas mon problème.

5 - J'utilise le player 9, et pas de possibilité de passer au 10
malheureusement.

6 - Chaque swf est déchargé une fois chargé et converti, avant de
loader le suivant.

ekameleon

unread,
Dec 4, 2008, 2:54:43 PM12/4/08
to FC...@googlegroups.com
Hello :)

Si ton swf marche en local .. tu utilises quoi exactement ? 

Dans Air 1.5 tu as le FP10, dans Zinc tu as le FP10 :) Pas de raison de pas l'utiliser ;)

Dans tous les autres cas .. impossible de faire mieux :)

EKA+ :)

zwetan

unread,
Dec 4, 2008, 5:35:34 PM12/4/08
to FCNG
avoir un lien vers l'outil pdf2swf peut aider aussi

pour poster des sources ou autres fichiers
- envoyer un email a FC...@googlegroups.com
il y a une limite de taille mais ca devrait passer si dans les 2/3Mo
- poster le fichier dans la partie "Fichiers" à droite
http://groups.google.co.uk/group/FCNG/files
- sinon un zip posté sur un HTTP ou FTP c'est bien aussi

dans les 2 cs un zip qui contient tout est preferable

mais amha le probleme peut se trouver a 2 endroits
- la taille des SWF générés
- le pdf2swf qui encode un SWF basique mais pas forcément optimisé

mais comme Eka perso je ferais tout coté serveur et y a plein d'outils
pour ca

un thumb de PDF en format image ca devrait pas prendre des masses en
poids
mais un SWF qui représente en vector tout le contenu du PDF euh ca va
forcément etre tres tres lourds
(toutes les font transformées en shape vecto par ex)

bref transformé un PDF en SWF je dis que c'est deja un mauvais debut
de solution,
pour du petit PDF ca doit le faire, mais du plus gros ca doit pas etre
top

la solution extreme et avec FP10 seulement + Alchemy
ce serait de porter une lib C/C++
qui lis du PDF directement dans flash
(note: j'ai bien dit extreme)

zwetan

Sylvain

unread,
Dec 5, 2008, 6:12:34 AM12/5/08
to FCNG
Pour répondre à Eka :
Quand je dis en local, c'est dans un player Flash ou dans le
navigateur, mais même déconnecté ça fonctionne aussi,
il n'y a pas d'appel au serveur.
Cette partie Flash de l'application permet en fait de lire un
magazine, en tournant les pages, en cliquant sur
des zones avec des liens, des vidéos, etc...
Et chaque page du magazine est un swf généré depuis un PDF. (le PDF
est découpé page par page, et les pages sont
donc converties en swf une par une)
En fait les swf sont bien générés sur un serveur, mais ils sont
ensuite placés dans un répertoire avec l'application
Flash, ce répertoire peut être téléchargé et ainsi on peut lancer
l'application en local ou la déployer sur un serveur, c'est au choix.


J'ai envoyé un mail avec un zip qui contient les 2 classes de mon
Loader et la fonction d'appel, ainsi que 2 PDF
qui me posent problème.

Les swf générés ont effectivement une taille qui est un peu supérieure
à la moyenne, mais ce n'est pas assez
significatif, car certains sont plus gros et s'ouvrent très
facilement. Ca dépend de la taille du pdf à la base
et surtout de ce que contient le PDF.
En revanche, le poids après décompression affiché dans la console Flex
est lui toujours assez élevé par rapport
aux autres swf.

Pour pdf2swf, il se trouve ici : http://www.swftools.org/
Par défaut je le lance sans option : pdf2swf fichier.pdf -o
fichier.swf
Et si je le lance avec une option qui dégrade un peu la qualité :
pdf2swf -O1 fichier.pdf -o fichier.swf
(c'est un o majuscule et non un zéro devant le 1)


Comme expliqué, les PDF sont découpés page par page, donc la
conversion en swf porte sur des petits PDF,
ils font quelques centaines de Ko la plupart du temps, parfois un peu
plus d'1Mo, et rarement plus de 2Mo.
Et comme vous pourrez le voir avec les 2 PDF dans le zip, ceux qui
posent problème ne sont pas forcément lourds.
Pour tous les swf générés, ils sont même plus légers que les PDF
d'origine.
L'application fonctionne très bien, et il n'y a que de rares pages qui
posent problème
(j'ai pas fait de stats précises, mais moins de 1%),
donc j'aimerai les détecter pour les reconvertir avec l'option. (on
peut se permettre de dégrader un peu la
qualité pour ces rares pages, il vaut mieux ça plutôt qu'un magazine
qui ne fonctionne pas)

L'application est pour ainsi dire terminée, j'aimerai si possible
éviter d'avoir à changer complètement
le fonctionnement de la génération.
Reply all
Reply to author
Forward
0 new messages