Je rencontre un problème très étrange (et qui me rend dingue) quand j’essaye de générer un pdf à partir d’un squelette (plugin spipdf) que je veux stocker dans un zip (plugin zippeur).
Je parviens à générer un fichier pdf parfaitement fonctionnel via Spipdf avec le code ci-dessous.
Par contre, quand j’essaye de générer ce même pdf dans une archive zippée à l’aide du plugin zippeur, j’obtiens un pdf dégradé :
l’image d’entête apparaît corrompue (une bande verte ou jaune apparait en bas de l’image qui est partiellement coupée). J’ai essayé d’autres images, format (png, jpg), sans succès. Je re-précise l’image s’affiche parfaitement dans le pdf généré par la première méthode.
j’ai eu plusieurs message d’erreurs à l’ouverture du fichier PDF du type «Cannot extract the embedded font MPDFAA++DejaVuSansCondensed some characters may not display or print correctly » que j’ai pu résoudre en éditant puis sauvegardant le fichier ttf de la police en question avec le logiciel Type Light sur les conseils d’un utilisateur de ce forum https://forums.adobe.com/thread/2181902. Mais je ne comprends pas pourquoi puisque le fichier pdf généré par la première méthode s’ouvrait parfaitement sans erreur…
A chaque fois que je ferme le fichier pdf généré par cette méthode, adobe reader me propose de le sauvegarder alors que je n’ai effectué aucune modification
Le code qui me permet de générer un pdf dans une archive zip est le suivant :
Si je pré-génère le pdf avec la fonction zippeur_creer_fichier avec le code ci-dessous, le pdf généré a les mêmes défauts que celui généré par la méthode précédente.
Je rencontre un problème très étrange (et qui me rend dingue) quand
j’essaye de générer un pdf à partir d’un squelette (plugin spipdf) que
je veux stocker dans un zip (plugin zippeur).
Je parviens à générer un fichier pdf parfaitement fonctionnel via Spipdf
avec le code ci-dessous.
Il faudrait voir ce que donne un zippage avec un zippage de ton PDF en tant que document joint à un article (le modèle de zippage livré par défaut).
Si tu as aussi un problème, cela se situe au niveau de la fonction PHP qui zippe, en arrière fond de zippeur.
Si tu n'as pas de problème, cela veut dire qu'il y a un bug au niveau de zippeur, et dans ce cas il faudra qu'on creuse ensemble plus loin pour que je fasse des tests pour saisir le problème.
Je rencontre un problème très étrange (et qui me rend dingue) quand
j’essaye de générer un pdf à partir d’un squelette (plugin spipdf) que
je veux stocker dans un zip (plugin zippeur).
Je parviens à générer un fichier pdf parfaitement fonctionnel via Spipdf
avec le code ci-dessous.
Il faudrait voir ce que donne un zippage avec un zippage de ton PDF en
tant que document joint à un article (le modèle de zippage livré par
défaut).
Si tu as aussi un problème, cela se situe au niveau de la fonction PHP
qui zippe, en arrière fond de zippeur.
Si tu n'as pas de problème, cela veut dire qu'il y a un bug au niveau de
zippeur, et dans ce cas il faudra qu'on creuse ensemble plus loin pour
que je fasse des tests pour saisir le problème.
autre chose à voir: avant d'être zipper, les fichiers produits dynamiques sont stockés dans local/nomduzipsanslextension
Don tu peux y retrouver le PDF, et voir s'il était mauvais à ce moment là…
Il faudrait voir ce que donne un zippage avec un zippage de ton PDF en
tant que document joint à un article (le modèle de zippage livré par
défaut).
Je confirme que les fichiers PDF statiques ajoutés à l'archive zip via la
variable #GET{liste_fichiers_statiques} dans mon exemple ne sont pas
altérés.
autre chose à voir: avant d'être zipper, les fichiers produits dynamiques
sont stockés dans local/nomduzipsanslextension. Donc tu peux y retrouver
le PDF, et voir s'il était mauvais à ce moment-là…
Je confirme que le fichier PDF dynamique est mauvais dans ce répertoire de
pré-zippage. J'ai tenté de changer la méthode de zip (ZIP au lieu de "lib
php pclZip" par défaut), idem, si ce n'est que dans ce cas, il ne me génère
plus le ZIP alors que ZIP (version 3.0.8 intégrée à Ubuntu 14.04 LTS) est
bien installé sur le serveur, mais c'est un autre sujet.
A ta disposition si tu veux aller plus loin (logs, etc.)
-Frédéric
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Sunday, December 11, 2016 5:30 PM
À : spip-zone@rezo.net
Objet : Re: [SPIP Zone] Bug pdf corrompu avec Spipdf + zippeur
Le 10.12.16 à 09:51, Maïeul a écrit :
Le 10.12.16 à 00:40, Frederic Lohier a écrit :
Bonsoir,
Je rencontre un problème très étrange (et qui me rend dingue) quand
j’essaye de générer un pdf à partir d’un squelette (plugin spipdf)
que je veux stocker dans un zip (plugin zippeur).
Je parviens à générer un fichier pdf parfaitement fonctionnel via
Spipdf avec le code ci-dessous.
Il faudrait voir ce que donne un zippage avec un zippage de ton PDF en
tant que document joint à un article (le modèle de zippage livré par
défaut).
Si tu as aussi un problème, cela se situe au niveau de la fonction PHP
qui zippe, en arrière fond de zippeur.
Si tu n'as pas de problème, cela veut dire qu'il y a un bug au niveau
de zippeur, et dans ce cas il faudra qu'on creuse ensemble plus loin
pour que je fasse des tests pour saisir le problème.
autre chose à voir: avant d'être zipper, les fichiers produits dynamiques
sont stockés dans local/nomduzipsanslextension
Don tu peux y retrouver le PDF, et voir s'il était mauvais à ce moment là…
Il faudrait voir ce que donne un zippage avec un zippage de ton PDF en
tant que document joint à un article (le modèle de zippage livré par
défaut).
Je confirme que les fichiers PDF statiques ajoutés à l'archive zip via la
variable #GET{liste_fichiers_statiques} dans mon exemple ne sont pas
altérés.
autre chose à voir: avant d'être zipper, les fichiers produits dynamiques
sont stockés dans local/nomduzipsanslextension. Donc tu peux y retrouver
le PDF, et voir s'il était mauvais à ce moment-là…
Je confirme que le fichier PDF dynamique est mauvais dans ce répertoire de
pré-zippage. J'ai tenté de changer la méthode de zip (ZIP au lieu de "lib
php pclZip" par défaut), idem, si ce n'est que dans ce cas, il ne me génère
plus le ZIP alors que ZIP (version 3.0.8 intégrée à Ubuntu 14.04 LTS) est
bien installé sur le serveur, mais c'est un autre sujet.
A ta disposition si tu veux aller plus loin (logs, etc.)
-Frédéric
-----Message d'origine-----
Si le fichier est mauvais dans le répertoire de pré-zippage, changer de méthode de zippage ne permettra pas qu'il soit meilleur.
Le souci est visiblement au moyen du déplacement/de la copie de ce PDF.
Il faudrait à ce moment là que tu me produise un squelette minimum, avec une base minmum, simple, pour que je puis reproduire le souci en local et creuser plus loins. J'ignore si cela vient de zippeur ou spippdf.
Je n'aurais vraisemblablement pas le temps de m'en occuper avant longtemps, étant occupés par formidable.
Concernant la question du mode de zippage, j'avoue ne jamais avoir fait fonctionné les autres modes. Je pense qu'il y a un truc à faire pour que PHP puisse y faire appel, mais j'ignore comment.
Il faudrait demander à bigoudi, qui a implémenté cela
Si le fichier est mauvais dans le répertoire de pré-zippage, changer de
méthode de zippage ne permettra pas qu'il soit meilleur.
Le souci est visiblement au moyen du déplacement/de la copie de ce PDF.
Il faudrait à ce moment là que tu me produise un squelette minimum, avec une
base minmum, simple, pour que je puis reproduire le souci en local et
creuser plus loins. J'ignore si cela vient de zippeur ou spippdf.
Je n'aurais vraisemblablement pas le temps de m'en occuper avant longtemps,
étant occupés par formidable.
Concernant la question du mode de zippage, j'avoue ne jamais avoir fait
fonctionné les autres modes. Je pense qu'il y a un truc à faire pour que PHP
puisse y faire appel, mais j'ignore comment.
Il faudrait demander à bigoudi, qui a implémenté cela
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Monday, December 12, 2016 11:40 AM
À : Frederic Lohier <associate-it@ambascience-usa.org>; spip-zone@rezo.net
Objet : Re: Bug pdf corrompu avec Spipdf + zippeur
Si le fichier est mauvais dans le répertoire de pré-zippage, changer de
méthode de zippage ne permettra pas qu'il soit meilleur.
Le souci est visiblement au moyen du déplacement/de la copie de ce PDF.
Il faudrait à ce moment là que tu me produise un squelette minimum, avec une
base minmum, simple, pour que je puis reproduire le souci en local et
creuser plus loins. J'ignore si cela vient de zippeur ou spippdf.
Je n'aurais vraisemblablement pas le temps de m'en occuper avant longtemps,
étant occupés par formidable.
Concernant la question du mode de zippage, j'avoue ne jamais avoir fait
fonctionné les autres modes. Je pense qu'il y a un truc à faire pour que PHP
puisse y faire appel, mais j'ignore comment.
Il faudrait demander à bigoudi, qui a implémenté cela
Bon, j'ai fouillé, et pas vraiment trouvé la raison. Je pense que le problème vient de la manière dont les entetes https sont envoyés par spipdf au moment de la création du fichier, ce qui fait que recuperer_fond() ne marche pas vraiment sur spippdf.
Mais ce n'est pas grave. J'ai ajouté dans la version 5.0.0 de zippeur la possibilité, dans l'argument "fichierhorschemin", de récuperer un fichier via une url.
Me crée l'archive avec le fichier pdf test mais vide.
J'ai vidé le cache de SPIP, au cas où.
-Frédéric
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Tuesday, December 13, 2016 8:02 AM
À : Frederic Lohier <associate-it@ambascience-usa.org>; spip-zone@rezo.net
Objet : Re: Bug pdf corrompu avec Spipdf + zippeur
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net] Envoyé : Monday, December 12,
2016 11:40 AM À : Frederic Lohier <associate-it@ambascience-usa.org>;
spip-zone@rezo.net Objet : Re: Bug pdf corrompu avec Spipdf + zippeur
Si le fichier est mauvais dans le répertoire de pré-zippage, changer
de méthode de zippage ne permettra pas qu'il soit meilleur.
Le souci est visiblement au moyen du déplacement/de la copie de ce PDF.
Il faudrait à ce moment là que tu me produise un squelette minimum,
avec une base minmum, simple, pour que je puis reproduire le souci en
local et creuser plus loins. J'ignore si cela vient de zippeur ou spippdf.
Je n'aurais vraisemblablement pas le temps de m'en occuper avant
longtemps, étant occupés par formidable.
Concernant la question du mode de zippage, j'avoue ne jamais avoir
fait fonctionné les autres modes. Je pense qu'il y a un truc à faire
pour que PHP puisse y faire appel, mais j'ignore comment.
Il faudrait demander à bigoudi, qui a implémenté cela
Bon, j'ai fouillé, et pas vraiment trouvé la raison. Je pense que le
problème vient de la manière dont les entetes https sont envoyés par spipdf
au moment de la création du fichier, ce qui fait que
recuperer_fond() ne marche pas vraiment sur spippdf.
Mais ce n'est pas grave. J'ai ajouté dans la version 5.0.0 de zippeur la
possibilité, dans l'argument "fichierhorschemin", de récuperer un fichier
via une url.
J'ai effectué quelques tests supplémentaires pour comprendre les cas qui ne
fonctionnent pas.
J'ai l'impression que ce sont les paramètres de l'URL qui ne passent pas ou
ne sont pas pris en compte quand l'url du fichierhorschemin est générée
dynamiquement.
J'ai aussi identifié un second problème. Un de mes squelettes spipdf vérifie
si un utilisateur est connecté : [(#SESSION{login}|oui)
<INCLURE{fond=inclure/squelette-spipdf-prive, env}>].
Quand je génère l'archive avec le PDF via l'URL en dur, le PDF est généré,
mais en tant qu'utilisateur non connecté (soit un pdf qui contient un
message indiquant qu'il faut être connecté pour générer ce pdf).
-Frédéric
-----Message d'origine-----
De : Frederic Lohier [mailto:associate-it@ambascience-usa.org]
Envoyé : Tuesday, December 13, 2016 4:30 PM
À : spip-zone@rezo.net
Objet : RE: Bug pdf corrompu avec Spipdf + zippeur
Merci ! par contre, je viens de tester (zippeur mis à jour en 5.0.1), mais
j'obtiens un PDF vide.
J'ai vérifié que le lien <a href="#GET{urlpdf}">PDF_TEST</a> me génère bien
le PDF Test avec l'image.
Me crée l'archive avec le fichier pdf test mais vide.
J'ai vidé le cache de SPIP, au cas où.
-Frédéric
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Tuesday, December 13, 2016 8:02 AM À : Frederic Lohier
<associate-it@ambascience-usa.org>; spip-zone@rezo.net Objet : Re: Bug pdf
corrompu avec Spipdf + zippeur
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net] Envoyé : Monday, December 12,
2016 11:40 AM À : Frederic Lohier <associate-it@ambascience-usa.org>;
spip-zone@rezo.net Objet : Re: Bug pdf corrompu avec Spipdf + zippeur
Si le fichier est mauvais dans le répertoire de pré-zippage, changer
de méthode de zippage ne permettra pas qu'il soit meilleur.
Le souci est visiblement au moyen du déplacement/de la copie de ce PDF.
Il faudrait à ce moment là que tu me produise un squelette minimum,
avec une base minmum, simple, pour que je puis reproduire le souci en
local et creuser plus loins. J'ignore si cela vient de zippeur ou spippdf.
Je n'aurais vraisemblablement pas le temps de m'en occuper avant
longtemps, étant occupés par formidable.
Concernant la question du mode de zippage, j'avoue ne jamais avoir
fait fonctionné les autres modes. Je pense qu'il y a un truc à faire
pour que PHP puisse y faire appel, mais j'ignore comment.
Il faudrait demander à bigoudi, qui a implémenté cela
Bon, j'ai fouillé, et pas vraiment trouvé la raison. Je pense que le
problème vient de la manière dont les entetes https sont envoyés par spipdf
au moment de la création du fichier, ce qui fait que
recuperer_fond() ne marche pas vraiment sur spippdf.
Mais ce n'est pas grave. J'ai ajouté dans la version 5.0.0 de zippeur la
possibilité, dans l'argument "fichierhorschemin", de récuperer un fichier
via une url.
J'ai effectué quelques tests supplémentaires pour comprendre les cas qui ne
fonctionnent pas.
J'ai l'impression que ce sont les paramètres de l'URL qui ne passent pas ou
ne sont pas pris en compte quand l'url du fichierhorschemin est générée
dynamiquement.
J'ai aussi identifié un second problème. Un de mes squelettes spipdf vérifie
si un utilisateur est connecté : [(#SESSION{login}|oui)
<INCLURE{fond=inclure/squelette-spipdf-prive, env}>].
Quand je génère l'archive avec le PDF via l'URL en dur, le PDF est généré,
mais en tant qu'utilisateur non connecté (soit un pdf qui contient un
message indiquant qu'il faut être connecté pour générer ce pdf).
-Frédéric
-----Message d'origine-----
De : Frederic Lohier [mailto:associate-it@ambascience-usa.org]
Envoyé : Tuesday, December 13, 2016 4:30 PM
À : spip-zone@rezo.net
Objet : RE: Bug pdf corrompu avec Spipdf + zippeur
Merci ! par contre, je viens de tester (zippeur mis à jour en 5.0.1), mais
j'obtiens un PDF vide.
J'ai vérifié que le lien <a href="#GET{urlpdf}">PDF_TEST</a> me génère bien
le PDF Test avec l'image.
Me crée l'archive avec le fichier pdf test mais vide.
J'ai vidé le cache de SPIP, au cas où.
-Frédéric
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Tuesday, December 13, 2016 8:02 AM À : Frederic Lohier
<associate-it@ambascience-usa.org>; spip-zone@rezo.net Objet : Re: Bug pdf
corrompu avec Spipdf + zippeur
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net] Envoyé : Monday, December 12,
2016 11:40 AM À : Frederic Lohier <associate-it@ambascience-usa.org>;
spip-zone@rezo.net Objet : Re: Bug pdf corrompu avec Spipdf + zippeur
Si le fichier est mauvais dans le répertoire de pré-zippage, changer
de méthode de zippage ne permettra pas qu'il soit meilleur.
Le souci est visiblement au moyen du déplacement/de la copie de ce PDF.
Il faudrait à ce moment là que tu me produise un squelette minimum,
avec une base minmum, simple, pour que je puis reproduire le souci en
local et creuser plus loins. J'ignore si cela vient de zippeur ou spippdf.
Je n'aurais vraisemblablement pas le temps de m'en occuper avant
longtemps, étant occupés par formidable.
Concernant la question du mode de zippage, j'avoue ne jamais avoir
fait fonctionné les autres modes. Je pense qu'il y a un truc à faire
pour que PHP puisse y faire appel, mais j'ignore comment.
Il faudrait demander à bigoudi, qui a implémenté cela
Bon, j'ai fouillé, et pas vraiment trouvé la raison. Je pense que le
problème vient de la manière dont les entetes https sont envoyés par spipdf
au moment de la création du fichier, ce qui fait que
recuperer_fond() ne marche pas vraiment sur spippdf.
Mais ce n'est pas grave. J'ai ajouté dans la version 5.0.0 de zippeur la
possibilité, dans l'argument "fichierhorschemin", de récuperer un fichier
via une url.
Après de multiples essais, j’ai trouvé enfin une solution qui fonctionne, mais c’est un peu du bricolage !
J’ai dû écrire une fonction dans mes_fonctions.php qui enregistre un fichier pdf temporaire, qui est ensuite ajouté à la liste des fichiers à zipper via son URL
La fonction dans mes_fonctions.php récupère la session pour pouvoir générer le PDF en utilisant les informations de login et l’url spipdf qui permet de générer le pdf via la fonction php file_get_contents :
A noter que j’ai essayé de contruire l’url de manière SPIPienne [(#URL_PAGE{spipdf}|parametre_url{spipdf,squelette-pdf}|parametre_url{id_auteur,#ENV{id_auteur}})] mais quand j’essaye de générer le pdf, j’obtiens un PDF vide alors que le contenu de la variable est exactement le même quand je l’affiche dans le squelette ou dans la fonction php…
Je génère le fichier pdf temporaire à l’aide de la fonction php définie dans mes_fonctions.php
[(#VAL{#GET{urlpdf}}|save_pdf_file)]
J’affecte à la variable urlpdf, l’URL du fichier pdf temporaire
Après de multiples essais, j'ai trouvé enfin une solution qui
fonctionne, mais c'est un peu du bricolage !
J'ai dû écrire une fonction dans mes_fonctions.php qui enregistre un
fichier pdf temporaire, qui est ensuite ajouté à la liste des fichiers à
zipper via son URL
La fonction dans mes_fonctions.php récupère la session pour pouvoir
générer le PDF en utilisant les informations de login et l’url spipdf
qui permet de générer le pdf via la fonction php /file_get_contents/ :
A noter que j’ai essayé de contruire l’url de manière SPIPienne
/[(#URL_PAGE{spipdf}|parametre_url{spipdf,squelette-pdf}|parametre_url{id_auteur,#ENV{id_auteur}})]
/mais quand j’essaye de générer le pdf, j’obtiens un PDF vide alors que
le contenu de la variable est exactement le même quand je l’affiche dans
le squelette ou dans la fonction php...
Je génère le fichier pdf temporaire à l’aide de la fonction php définie
dans mes_fonctions.php
/[(#VAL{#GET{urlpdf}}|save_pdf_file)]/
J’affecte à la variable urlpdf, l’URL du fichier pdf temporaire