8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,


J'ai passé beaucoup de temps à trouver une solution pour transformer un pdf en jpg. Malgré mes recherches sous google, aucune n'a pu convenir.
Généralement, les réponses tournent autour de gostscript et de imagemagik mais sous OVH, ils n'ont pas gostscript.
Çà fait 2 semaines que je tourne en rond sans trouver de solutions viables...
J'espère que vous pourrez me donner des conseils & des pistes pour résoudre ce soucis.
Je ne me limite pas uniquement au PHP, si vous avez des idées avec d'autres langages intégrables pour le web, je suis preneur Smiley lol

merci d'avance Smiley cligne


Michaël
Il s'agit d'un pdf soumis.

Pour préciser le sujet, il y a une partie admin et une cliente.
Dans la partie admin, on peut ajouter des pdf qui serviront à créer un catalogue de pdf.
Dans la partie cliente, on affiche une miniature de chaque pdf existant.
C'est cette miniature que je n'arrive pas à créer. Elle doit être générée automatiquement à partir de la première page du pdf.

A noté que sous ovh, le serveur utilisé est mutualisé.
As-tu bien regardé s'il n'y avait pas imagemagick sur le mutualisé d'ovh. J'ai entendu dire que si. Et qu'avec imagemagick tu dois pouvoir faire ce dont tu nous parle.

Sur ce je vais manger. Je vais chercher un peu juste parès si j'ai le temps.
oui effectivement, imagemagik est bien installé sur les serveur d'OVH même en mutualisé. Donc les scripts de conversion d'image a l'aide de la commande exec et convert fonctionnent mais pour ce qui est du passage d'un pdf en image, il est nécessaire d'utiliser ghostscript. Malheureusement, il n'est pas installé Smiley confus

exec("/usr/bin/convert convert monimage.jpg monimage.png"); //fonctionne très bien
exec("/usr/bin/convert convert monpdf.pdf monimage.jpg"); // ne fonctionne pas

Ensuite, peut etre que seul imagemagik est nécessaire ou que d'autres soft que ghostscript sont utilisables mais j'ai rien trouvé Smiley decu
Regarde par là. C'est la doc officiel d'imagemagick.

http://www.imagemagick.org/Usage/text/#postscript

Il y a un exemple qui montre comment faire. Ils le font sur un fichier .ps (postscript) mais ils précisent que cela fonctionne pour tous les formats vectoriels (dont pdf).

En gros, de ce que je pense avoir compris (j'ai pas testé), le ligne magique c'est :

convert -density 196   ton_fichier.pdf'[0]' -resample 72 -trim +repage ton_fichier.jpg


Explication des paramètre :
-density : Cela va définir la résolution de l'image, c'est en dpi (dot per inch). Par défaut elle est à 72, on l'augmente éventuellement pour ensuite diminué l'échantillon, et ainsi évité un effet "pixelisé". Cela va donc avec le parametre -resample qui va redimentionner l'image finale (c'est également en dpi)

le zero entre crochet : c'est pour ne convertir que la première page du pdf. Sinon, s'il y a plusieur page, si j'ai bien compris, mais je ne suis pas sur, là il aura besoin de ghostscript. Autrement non.

-trim : Pour enlever les marges, parfait pour fair des miniature qui cadre uniquement le contenu à proprement parler.

+repage : Suprime les meta-données du pdf qu'il imprime sur l'image par défaut.

Voila, j'espère que ça va fonctionner cette fois-ci. A vrai dire cela me sera probablement utile plus tard Smiley langue
Modifié par Javanight (26 May 2009 - 23:57)
Merci pour toutes ces infos!!!

Malheureusement, je n'arrive toujours pas à faire fonctionner le script. Le code me semble bon pourtant!


exec("/usr/bin/mesgs LN-ManKzinWars | \
enscript -q -G -f CourierBold12 -t \"Postscript via 'enscript'\" -o - |\
perl -pe 'print \"%%LanguageLevel: 3\n\" if 2..2' > ps_versions.ps"); //fonctionne

exec("/usr/bin/convert ps_versions.ps'[0]' \
-trim +repage -bordercolor white -border 3 ps_version_raw.gif"); // ne fonctionne pas


J'ai bien sur essayé ta ligne de code pour mes pdfs mais la non plus, la conversion de s'effectue pas.
Les droits du dossier ne peuvent pas poser de problèmes car pour une conversion d'image de jpg en png, l'image est bien crée.



Cette conversion n'est vraiment pas évidente Smiley confus !!! En tout cas, merci de m'aider ^^, c'est vraiment sympa! Smiley biggrin
Modifié par t5uk545 (27 May 2009 - 06:47)
C'est étrange je viens de tester sur mon pc, en local donc. Lorsque j'execute la commande directement dans le terminale, ça fonctionne. Mais si je l'execute à partir d'un fichier php, il ne se passe rien. J'aimerai trouver comment répupérer les message d'erreur du programme, mais quand je rajoute un echo juste devant la commande exec, il ne sorte aucun message...

Affaire à suivre... je continue mes testes.
En fait, non ça fonctionne. J'avais juste un probleme de droit d'accés. Mais je ne pense pas que tu ais le meme souci. Mais au cas où, je partage :

Le répertoire dans lequel tu veux que le nouveau fichier (ici ton image .jpg) soit créé doit permettre à l'utilisateur www-data d'écrire dedans.

Donc en gros, j'ai juste fait
chmod o+w le_repertoire


Voila, mais pour le symptome du probleme que j'avais, je ne pouvait rien convertir du tout vu qu'il ne pouvait bien ecrir dans le repertoire. Alors que toi, tu me dis que tu arrive quand meme à convertir un image vers une image... bizare

Ah et j'ai aussi enlevé quelque parametre à la commande de convertion pour y voir plus clair. Et j'ai mis les guillemets autour de 'ton_image[0]' au lieu de ton_image'[0]' (mais il semble qu'ils ne servent à rien, j'ai aussi essayé sans)

convert fichier.pdf[0] -density 196 -resample 72 fichier.jpg


Arf, mais j'avais pas regardé, mais j'ai ghostscript déja d'installé sur mon système. Donc ça veux rien dire Smiley ohwell
Modifié par Javanight (27 May 2009 - 14:16)
Je viens d'essayer sur un hébergement ovh vite fait en ligne de commande par ssh, et voici ce qu'il me retourne :

~/www/pdf2img$ convert fichier.pdf fichier.jpg
sh: gs: command not found
convert: Postscript delegate failed `fichier.pdf'.


Il cherche donc effectivement ghostscript...
Alors je viens de téléchager les sources de ghostscript depuis le site officiel que j'ai compilé à-même l'hébergement ovh depuis ssh, et j'ai copié le binaire "gs" sortie de la compilation dans un répertoire ~/bin que j'ai créé, mais déja dans le PATH.

Du coup, je peux faire la conversion PDF vers image directement en ligne de commande depuis l'hébergeur. Ourah !

Mais lorsque je tente de l'executer depuis le script PHP, j'ai ce message d'erreur :


Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, postmaster@folietheatre.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.


Je n'abandonne pas tout de suite, je continue de chercher encore un peu... sinon tanpis.
Merci beaucoup pour ce que tu fais.

J'ai pas eu le temps hier soir de continuer les batteries de tests. Je reprendrais cet après midi. Actuellement, je suis en cours et au Québec donc avec un petit décalage horaire de 6 heures!

Si l'admin -qui bosse sous mac- installe ghostscript en local, il pourra faire fonctionner le script meme si il est exécuté à partir du serveur?

Autre question, si je copie les fichiers installé par Ghostscript sur le serveur, est ce qu'il est possible que cela fonctionne? Spongestats fonctionne de cette manière mais il est prévu pour!

C'est quelques interrogations qui traversent ma tête en ce moment même si elles me paraissent peu réalisables Smiley confus


Pour les guillemets, j'avais effectivement essayé sans. La syntaxe me semblait étrange aussi Smiley lol
En fait, copier un binaire d'un linux à l'autre peu fonctionner, mais si c'est la meme architecture.

Donc, ce qu'il faut faire, c'est envoyer les sources à compiler sur l'espace hébergé, puis tu te connecte à ton hébergeur par ssh :

ssh ton_login_ovh@ton_adresse_ftp_ovh


Tu répond "yes" à la question.

Ensuite c'est comme si tu étais dans ton terminal en local, sauf que tu es sur le serveur de l'hébergeur. Tu peux donc utiliser des commandes comme mkdir, cd, ls, pwd, etc.

Tu vas donc dans le répertoire où ce trouve les sources de ghostscript. Tu fais un petit

tar xvf fichier_compréssé_des_sources


Tu va dans le repertoire que tu viens de décomprésser, et tu fais

./configure
make


Ca prend un peu de temps, c'est normal, ça compile.

En suite, reviens dans ton home

cd
mkdir bin
cp repertoire_ghostscript/bin/gs bin/


Voila, et avec ça tu peux utiliser convert sur des pdf. Mais seulement en ligne de commande par ssh. Et certe, ce n'est pas utile dans notre cas. Mais j'ose espérer être sur la bonne piste.
Bon, le probleme viens du fait que le PATH est different selon si c'est apache qui lance le scripte ou bien si c'est l'utilisateur.

Donc en gros, cela ne change rien de mettre "gs" dans ~/bin.

Je vais essayer un "export PATH=$PATH:...." depuis le script PHP pour voir.
Modifié par Javanight (27 May 2009 - 17:42)
Euréka !!! Smiley biggrin

J'ai trouvé !!!

En fait, il faut redéfinir le PATH au début de chaque commande system, exec, ou autre de php.

Bref voici le graal :

system('PATH=$PATH:~/bin/&&convert -density 196 fichier.pdf[0] -resample 72 fichier.jpg');


En fait le code qui nous intéresse ici c'est PATH=$PATH:~/bin&&.
Le && permet de lancer 2 commande en une seule fois. On ne peut pas faire autrement, sinon à chaque appelle de "system" le PATH revient à zéro. Et donc la j'ai rajouté le répertoire ~/bin dans le PATH, mais tu peux mettre se que tu veux, du moment que le programme "gs" se trouve dans le répertoire que tu donnes.

Voila, mais il te faudra quand meme passer par la phase de compilation du binaire si tu veux être sur qu'il soit compatible avec l'architecture et la distrib de ton hébergeur.

J'espère que tu y arriverra sans trop peiner. Si tu à besoin de précision, n'hésite pas à me demander.

Derniere chose, si tu est sur windows, pour te connecter en ssh, utilise le programme "putty", que tu trouvera facilement sur le net. Smiley cligne
Oki!!
Je vais essayer ça tout de suite Smiley lol
Je suis très impatient!! C'est génial de rentrer chez soi et de voir qu'on touche au but!!!
Merci beaucoup!!!

Je te tiens au courant bien sur!! Smiley biggrin
MMMEEERRRRCCCCIIIIII!!!!!!!!!!!!!!!!!!

Enorme merci!!!
Ça marche très bien!!
Tes explications pour l'installation de ghostscript étaient parfaites et que dire de ta commande magique!!!

J'ai un peu lutté pour la commande system parce que je m'étais trompé dans le chemin!! Au bout d'un moment, on lit le code que le souhaite et non plus celui qui est écrit! Enfin bref, cette erreur résolue, j'ai eu la joie de voir apparaitre mon image au lancement du script! Quel bonheur!!

Je te dois une fière chandelle!!


Et si un jour je peux te rendre service, ça sera avec plaisir!!



Michaël Smiley ravi
Modifié par Mikachu (31 Oct 2009 - 09:33)
C'est un plaisir Smiley cligne

Juste une précision. Tu peux utiliser la commande exec au lieux de system. La seule différence est que la commande systeme affiche le résultat de la commande s'il elle en retourne un. Il s'avère que non. Donc je te conseille plutot exec dans un souci d'optimisation, et ... de logique.

Sur ce, bon développement à toi Smiley cligne
Salut à tous !

Tout d'abord, merci pour ces explications, c'est le seul post valable dans la cathégorie "pdf vers jpg chez ovh".
Jusqu'à ya quelques heures j'étais avec un 60GP mutualisé, mais j'avais même pas le SSH. Donc j'ai changé pour un nouveau hébergement pro, avec ssh cette fois ci.

J'ai suivi à la lettre les instructions mais j'arrive pas à en tirer quelque chose Smiley decu
Image Magick est bien là, j'arrive à faire des convert basic, et même en tapant directement en ligne de commande et en renseignant en path l'endroit ou j'ai le programme gs, il me dit :

thomaspu@ssh1:~/www$ PATH=$PATH:~/bin&&convert -density 196 cv.pdf -resample 72 cv.jpg
sh: gs: command not found
convert: Postscript delegate failed `cv.pdf'.


Donc je suis plutôt frustré Smiley decu
Est-ce que quelqu'un sait il si les choses ont changées avec les nouveaux hébergements?
D'avance merci... Smiley smile
Salut,

Il serait mieux d'ouvrir ton propre sujet, ce qui te donnerai des options de suivi et surtout éviterai de mélanger deux sujets similaires. Certains ne prendront pas la peine de lire ton sujet tout en bas, et ne liront que le problème du premier post du sujet. Smiley cligne
Pages :