[SPIP Zone] Bug pdf corrompu avec Spipdf + zippeur

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.

PDF

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 :

<a href="[(#VAL{Le_nom_de_mon_archive}|zippeur_dynamique{’’,’’,#ARRAY{

0,#ARRAY{

0,spipdf,

1,mon_fichier_pdf_#ENV{id_auteur}.pdf,

2,#ARRAY{

spipdf,squelette-pdf,

id_auteur,#ENV{id_auteur}

}

}

},#GET{liste_fichiers_statiques},’’,‹ 24*3600 ›

})]">ZIP

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.

[(#VAL{spipdf}|zippeur_creer_fichier{mon_fichier_pdf.pdf, #ARRAY{spipdf,squelette-pdf,id_auteur,#ENV{id_auteur}}})]

Toute suggestion est la bienvenue !!

-Frédéric

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.

--
Maïeul

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à…

--
Maïeul

Bonjour Maïeul,

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à…

--
Maïeul

----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Le 12.12.16 à 17:21, Frederic Lohier a écrit :

Bonjour Maïeul,

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

https://contrib.spip.net/bigoudi

--
Maïeul

Voilà de quoi reproduire le bug :

Versions: PHP 5.5.9, SPIP 3.1.3, SpiPDF 1.0.3, Zippeur 4.1.5

Le code pour générer le fichier pdf dynamiquement seulement avec Spipdf :

<a
href="[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier_pdf_test})]">PDF</a>

Le code test pour générer le fichier pdf dynamiquement puis le zipper dans
une archive "archive_test.zip" (Spipdf + zippeur) :

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','',#ARRAY{
  0,#ARRAY{
    0,spipdf,
    1,fichier-pdf-test.pdf,
    2,#ARRAY{
        spipdf,pdf-test,
        nom_fichier,fichier-pdf-test
        }
      }
    },'','24*3600'
  })]">ZIP</a>

Le squelette pdf-test appelé par Spipdf qui ne contient que la structure du
fichier PDF et une simple image dans le corps :

<page lib_pdf="mpdf" orientation="P" format="A4" backtop="12mm"
backbottom="12mm" backleft="12mm" backright="12mm">
<img src="/squelettes/img/Pasteur-Paris-University.png">
</page>

Quand on génère le même fichier PDF directement via Spipdf sans le zipper,
l'image s'affiche correctement:
https://www.chateaubriand-fellowship.org/spip.php?page=spipdf&spipdf=pdf-test&nom_fichier=pdf-test&var_mode=recalcul

Le même fichier généré dynamiquement par zippeur+spipdf ne s'ouvre par
correctement par Adobe Reader (image corrompue + me demande de sauvegarder
le pdf à la fermeture) :
https://www.chateaubriand-fellowship.org/local/archive_test/fichier-pdf-test.pdf
ou https://www.chateaubriand-fellowship.org/local/cache-zip/archive_test.zip

-Frédéric

-----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

https://contrib.spip.net/bigoudi

--
Maïeul
http://blog.maieul.net
http://geekographie.maieul.net

Le 13.12.16 à 00:42, Frederic Lohier a écrit :

Voilà de quoi reproduire le bug :

Versions: PHP 5.5.9, SPIP 3.1.3, SpiPDF 1.0.3, Zippeur 4.1.5

Le code pour générer le fichier pdf dynamiquement seulement avec Spipdf :

<a
href="[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier_pdf_test})]">PDF</a>

Le code test pour générer le fichier pdf dynamiquement puis le zipper dans
une archive "archive_test.zip" (Spipdf + zippeur) :

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','',#ARRAY{
  0,#ARRAY{
    0,spipdf,
    1,fichier-pdf-test.pdf,
    2,#ARRAY{
        spipdf,pdf-test,
        nom_fichier,fichier-pdf-test
        }
      }
    },'','24*3600'
  })]">ZIP</a>

Le squelette pdf-test appelé par Spipdf qui ne contient que la structure du
fichier PDF et une simple image dans le corps :

<page lib_pdf="mpdf" orientation="P" format="A4" backtop="12mm"
backbottom="12mm" backleft="12mm" backright="12mm">
<img src="/squelettes/img/Pasteur-Paris-University.png">
</page>

juste une remarque: il ne faut pas utiliser /squelettes/img/Pasteur-Paris-University.png
mais #CHEMIN{img/Pasteur-Paris-University.png}

voir #CHEMIN - Programmer avec SPIP 4
Sept bonnes pratiques de développement avec SPIP - Geekographie Maïeulesque

--
Maïeul

Le 13.12.16 à 00:42, Frederic Lohier a écrit :

Voilà de quoi reproduire le bug :

Versions: PHP 5.5.9, SPIP 3.1.3, SpiPDF 1.0.3, Zippeur 4.1.5

Le code pour générer le fichier pdf dynamiquement seulement avec Spipdf :

<a
href="[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier_pdf_test})]">PDF</a>

Le code test pour générer le fichier pdf dynamiquement puis le zipper dans
une archive "archive_test.zip" (Spipdf + zippeur) :

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','',#ARRAY{
  0,#ARRAY{
    0,spipdf,
    1,fichier-pdf-test.pdf,
    2,#ARRAY{
        spipdf,pdf-test,
        nom_fichier,fichier-pdf-test
        }
      }
    },'','24*3600'
  })]">ZIP</a>

Le squelette pdf-test appelé par Spipdf qui ne contient que la structure du
fichier PDF et une simple image dans le corps :

<page lib_pdf="mpdf" orientation="P" format="A4" backtop="12mm"
backbottom="12mm" backleft="12mm" backright="12mm">
<img src="/squelettes/img/Pasteur-Paris-University.png">
</page>

Quand on génère le même fichier PDF directement via Spipdf sans le zipper,
l'image s'affiche correctement:
https://www.chateaubriand-fellowship.org/spip.php?page=spipdf&spipdf=pdf-test&nom_fichier=pdf-test&var_mode=recalcul

Le même fichier généré dynamiquement par zippeur+spipdf ne s'ouvre par
correctement par Adobe Reader (image corrompue + me demande de sauvegarder
le pdf à la fermeture) :
https://www.chateaubriand-fellowship.org/local/archive_test/fichier-pdf-test.pdf
ou https://www.chateaubriand-fellowship.org/local/cache-zip/archive_test.zip

-Frédéric

-----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

bigoudi - SPIP-Contrib

--
Maïeul
http://blog.maieul.net
http://geekographie.maieul.net
----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

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.

Ce qui te donnerait

[(#SET{urlpdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier_pdf_test})]}
)]
<a
href="#GET{urlpdf}">PDF</a>

#SET{urlpdf,#GET{urlpdf}|url_absolue}
<a href="[(#VAL{archive_test}|zippeur_dynamique{'',
   '',
   #LISTE{
       #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
   },
   '24*3600'})]">ZIP</a>

En local cela fonctionne parfaitement

--
Maïeul

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.

Le lien

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',
  #LISTE{
      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
  },'24*3600'})]">ZIP_TEST</a>

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

Le 13.12.16 à 00:42, Frederic Lohier a écrit :

Voilà de quoi reproduire le bug :

Versions: PHP 5.5.9, SPIP 3.1.3, SpiPDF 1.0.3, Zippeur 4.1.5

Le code pour générer le fichier pdf dynamiquement seulement avec Spipdf :

<a
href="[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url
{nom_fichier,fichier_pdf_test})]">PDF</a>

Le code test pour générer le fichier pdf dynamiquement puis le zipper
dans une archive "archive_test.zip" (Spipdf + zippeur) :

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','',#ARRAY{
  0,#ARRAY{
    0,spipdf,
    1,fichier-pdf-test.pdf,
    2,#ARRAY{
        spipdf,pdf-test,
        nom_fichier,fichier-pdf-test
        }
      }
    },'','24*3600'
  })]">ZIP</a>

Le squelette pdf-test appelé par Spipdf qui ne contient que la
structure du fichier PDF et une simple image dans le corps :

<page lib_pdf="mpdf" orientation="P" format="A4" backtop="12mm"
backbottom="12mm" backleft="12mm" backright="12mm"> <img
src="/squelettes/img/Pasteur-Paris-University.png">
</page>

Quand on génère le même fichier PDF directement via Spipdf sans le
zipper, l'image s'affiche correctement:
https://www.chateaubriand-fellowship.org/spip.php?page=spipdf&spipdf=p
df-test&nom_fichier=pdf-test&var_mode=recalcul

Le même fichier généré dynamiquement par zippeur+spipdf ne s'ouvre par
correctement par Adobe Reader (image corrompue + me demande de
sauvegarder le pdf à la fermeture) :
https://www.chateaubriand-fellowship.org/local/archive_test/fichier-pd
f-test.pdf ou
https://www.chateaubriand-fellowship.org/local/cache-zip/archive_test.
zip

-Frédéric

-----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

bigoudi - SPIP-Contrib

--
Maïeul
http://blog.maieul.net
http://geekographie.maieul.net
----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

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.

Ce qui te donnerait

[(#SET{urlpdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier_pdf_test})]}
)]
<a
href="#GET{urlpdf}">PDF</a>

#SET{urlpdf,#GET{urlpdf}|url_absolue}
<a href="[(#VAL{archive_test}|zippeur_dynamique{'',
   '',
   '',
   '',
   #LISTE{
       #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
   },
   '24*3600'})]">ZIP</a>

En local cela fonctionne parfaitement

--
Maïeul

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.

Par exemple:

[(#SET{urlpdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier-pdf-test.pdf})]})]
[(#SET{urlpdf,[(#GET{urlpdf}|url_absolue)]})]

Avec le lien

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',
  #LISTE{
      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
  },'24*3600'})]">ZIP_TEST</a>

Me génère un PDF vide (1kb) comme s'il avait été généré avec l'URL
https://www.domaine.tld/spip.php?page=spipdf au lieu de https://www.
domaine.tld/spip.php?page=spipdf&spipdf=pdf-test&nom_fichier=fichier-pdf-test.pdf

#GET{urlpdf} renvoi pourtant bien l'URL complète.

Si par contre, je mets en dur l'url absolue dans la variable urlpdf, ça
fonctionne :

#SET{urlpdf,"https://www.domaine.tld/spip.php?page=spipdf&spipdf=pdf-test&nom_fichier=fichier-pdf-test.pdf&quot;\}

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',
  #LISTE{
      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
  },'24*3600'})]">ZIP_TEST</a>

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.

Le lien

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',
  #LISTE{
      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
  },'24*3600'})]">ZIP_TEST</a>

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

Le 13.12.16 à 00:42, Frederic Lohier a écrit :

Voilà de quoi reproduire le bug :

Versions: PHP 5.5.9, SPIP 3.1.3, SpiPDF 1.0.3, Zippeur 4.1.5

Le code pour générer le fichier pdf dynamiquement seulement avec Spipdf :

<a
href="[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url
{nom_fichier,fichier_pdf_test})]">PDF</a>

Le code test pour générer le fichier pdf dynamiquement puis le zipper
dans une archive "archive_test.zip" (Spipdf + zippeur) :

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','',#ARRAY{
  0,#ARRAY{
    0,spipdf,
    1,fichier-pdf-test.pdf,
    2,#ARRAY{
        spipdf,pdf-test,
        nom_fichier,fichier-pdf-test
        }
      }
    },'','24*3600'
  })]">ZIP</a>

Le squelette pdf-test appelé par Spipdf qui ne contient que la
structure du fichier PDF et une simple image dans le corps :

<page lib_pdf="mpdf" orientation="P" format="A4" backtop="12mm"
backbottom="12mm" backleft="12mm" backright="12mm"> <img
src="/squelettes/img/Pasteur-Paris-University.png">
</page>

Quand on génère le même fichier PDF directement via Spipdf sans le
zipper, l'image s'affiche correctement:
https://www.chateaubriand-fellowship.org/spip.php?page=spipdf&spipdf=p
df-test&nom_fichier=pdf-test&var_mode=recalcul

Le même fichier généré dynamiquement par zippeur+spipdf ne s'ouvre par
correctement par Adobe Reader (image corrompue + me demande de
sauvegarder le pdf à la fermeture) :
https://www.chateaubriand-fellowship.org/local/archive_test/fichier-pd
f-test.pdf ou
https://www.chateaubriand-fellowship.org/local/cache-zip/archive_test.
zip

-Frédéric

-----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

bigoudi - SPIP-Contrib

--
Maïeul
http://blog.maieul.net
http://geekographie.maieul.net
----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

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.

Ce qui te donnerait

[(#SET{urlpdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier_pdf_test})]}
)]
<a
href="#GET{urlpdf}">PDF</a>

#SET{urlpdf,#GET{urlpdf}|url_absolue}
<a href="[(#VAL{archive_test}|zippeur_dynamique{'',
   '',
   '',
   '',
   #LISTE{
       #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
   },
   '24*3600'})]">ZIP</a>

En local cela fonctionne parfaitement

--
Maïeul

Le 17.12.16 à 00:29, Frederic Lohier a écrit :

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.

Par exemple:

[(#SET{urlpdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier-pdf-test.pdf})]})]
[(#SET{urlpdf,[(#GET{urlpdf}|url_absolue)]})]

Avec le lien

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',
  #LISTE{
      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
  },'24*3600'})]">ZIP_TEST</a>

Me génère un PDF vide (1kb) comme s'il avait été généré avec l'URL
https://www.domaine.tld/spip.php?page=spipdf au lieu de https://www.
domaine.tld/spip.php?page=spipdf&spipdf=pdf-test&nom_fichier=fichier-pdf-test.pdf

#GET{urlpdf} renvoi pourtant bien l'URL complète.

Si par contre, je mets en dur l'url absolue dans la variable urlpdf, ça
fonctionne :

#SET{urlpdf,"https://www.domaine.tld/spip.php?page=spipdf&spipdf=pdf-test&nom_fichier=fichier-pdf-test.pdf&quot;\}

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',
  #LISTE{
      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
  },'24*3600'})]">ZIP_TEST</a>

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.

Le lien

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',
  #LISTE{
      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
  },'24*3600'})]">ZIP_TEST</a>

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

Le 13.12.16 à 00:42, Frederic Lohier a écrit :

Voilà de quoi reproduire le bug :

Versions: PHP 5.5.9, SPIP 3.1.3, SpiPDF 1.0.3, Zippeur 4.1.5

Le code pour générer le fichier pdf dynamiquement seulement avec Spipdf :

<a
href="[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url
{nom_fichier,fichier_pdf_test})]">PDF</a>

Le code test pour générer le fichier pdf dynamiquement puis le zipper
dans une archive "archive_test.zip" (Spipdf + zippeur) :

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','',#ARRAY{
  0,#ARRAY{
    0,spipdf,
    1,fichier-pdf-test.pdf,
    2,#ARRAY{
        spipdf,pdf-test,
        nom_fichier,fichier-pdf-test
        }
      }
    },'','24*3600'
  })]">ZIP</a>

Le squelette pdf-test appelé par Spipdf qui ne contient que la
structure du fichier PDF et une simple image dans le corps :

<page lib_pdf="mpdf" orientation="P" format="A4" backtop="12mm"
backbottom="12mm" backleft="12mm" backright="12mm"> <img
src="/squelettes/img/Pasteur-Paris-University.png">
</page>

Quand on génère le même fichier PDF directement via Spipdf sans le
zipper, l'image s'affiche correctement:
https://www.chateaubriand-fellowship.org/spip.php?page=spipdf&spipdf=p
df-test&nom_fichier=pdf-test&var_mode=recalcul

Le même fichier généré dynamiquement par zippeur+spipdf ne s'ouvre par
correctement par Adobe Reader (image corrompue + me demande de
sauvegarder le pdf à la fermeture) :
https://www.chateaubriand-fellowship.org/local/archive_test/fichier-pd
f-test.pdf ou
https://www.chateaubriand-fellowship.org/local/cache-zip/archive_test.
zip

-Frédéric

-----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

bigoudi - SPIP-Contrib

--
Maïeul
http://blog.maieul.net
http://geekographie.maieul.net
----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

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.

Ce qui te donnerait

[(#SET{urlpdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|parametre_url{nom_fichier,fichier_pdf_test})]}
)]
<a
href="#GET{urlpdf}">PDF</a>

#SET{urlpdf,#GET{urlpdf}|url_absolue}
<a href="[(#VAL{archive_test}|zippeur_dynamique{'',
   '',
   #LISTE{
       #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}
   },
   '24*3600'})]">ZIP</a>

En local cela fonctionne parfaitement

--
Maïeul
http://blog.maieul.net
http://geekographie.maieul.net
----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

je suis étonné par ton premier problème, puisque mon exemple a moi fonctionnait nickel.
Pour le second, je vois pas trop de solution…

--
Maïeul

Après de multiples essais, j’ai trouvé enfin une solution qui fonctionne, mais c’est un peu du bricolage :slight_smile: !

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 :

function save_pdf_file ($fichier) {

$pdf = ‹ local/pdftemp.pdf ›;

$opts = array(‹ http › => array(‹ header ›=> 'Cookie: ’ . $_SERVER[‹ HTTP_COOKIE ›]."\r\n"));

$context = stream_context_create($opts);

file_put_contents($pdf, file_get_contents($fichier, false, $context));

}

Dans le fichier squelette, je construis mon URL Spipdf que je stocke dans une variable :

[(#SET{urlpdf,« https://www.domain.tld/spip.php?page=spipdf&spipdf=squelette-pdf&id_auteur= »#ENV{id_auteur}})]

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

#SET{urlpdf,« https://www.domain.tld/local/pdftemp.pdf »}

Puis je génère le fichier zip qui contient une liste de fichiers statiques et le fichier pdf dynamique temporaire

<a href="[(#VAL{fichier_pdf}|zippeur_dynamique{’’,

‹  ›,

‹  ›,

#GET{liste_fichiers_statiques},

#LISTE{

#LISTE{#GET{urlpdf},‹ mon_fichier_pdf_dynamique.pdf ›}

},

‹ 24*3600 ›})]" title=« Save in ZIP format (application pdf + attachments) »>

-Frédéric

-----Message d’origine-----

Le 20.12.16 à 23:48, Frederic Lohier a écrit :

Après de multiples essais, j'ai trouvé enfin une solution qui
fonctionne, mais c'est un peu du bricolage :slight_smile: !

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/ :

/function save_pdf_file ($fichier) {/

/ /

/$pdf = 'local/pdftemp.pdf';/

/$opts = array('http' => array('header'=> 'Cookie: ' .
$_SERVER['HTTP_COOKIE']."\r\n"));/

/$context = stream_context_create($opts);/

/file_put_contents($pdf, file_get_contents($fichier, false, $context));/

/ /

/}/

Dans le fichier squelette, je construis mon URL Spipdf que je stocke
dans une variable :

/[(#SET{urlpdf,"https://www.domain.tld/spip.php?page=spipdf&spipdf=squelette-pdf&id_auteur=&quot;\#ENV\{id\_auteur\}\})]/

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

#SET{urlpdf,"https://www.domain.tld/local/pdftemp.pdf&quot;\}

Puis je génère le fichier zip qui contient une liste de fichiers
statiques et le fichier pdf dynamique temporaire

<a href="[(#VAL{fichier_pdf}|zippeur_dynamique{'',

  '',

  '',

  #GET{liste_fichiers_statiques},

  #LISTE{

      #LISTE{#GET{urlpdf},'mon_fichier_pdf_dynamique.pdf'}

  },

  '24*3600'})]" title="Save in ZIP format (application pdf + attachments)">

-Frédéric

-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Saturday, December 17, 2016 6:41 AM
À : Frederic Lohier <associate-it@ambascience-usa.org
<mailto:associate-it@ambascience-usa.org>>; spip-zone@rezo.net
<mailto:spip-zone@rezo.net>
Objet : Re: Bug pdf corrompu avec Spipdf + zippeur

Le 17.12.16 à 00:29, Frederic Lohier a écrit :

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.

Par exemple:

[(#SET{urlpdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,pdf-test}|param

etre_url{nom_fichier,fichier-pdf-test.pdf})]})]

[(#SET{urlpdf,[(#GET{urlpdf}|url_absolue)]})]

Avec le lien

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',

  #LISTE{

      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}

  },'24*3600'})]">ZIP_TEST</a>

Me génère un PDF vide (1kb) comme s'il avait été généré avec l'URL

https://www.domaine.tld/spip.php?page=spipdfau lieu de https://www.

domaine.tld/spip.php?page=spipdf&spipdf=pdf-test&nom_fichier=fichier-p

df-test.pdf

#GET{urlpdf} renvoi pourtant bien l'URL complète.

Si par contre, je mets en dur l'url absolue dans la variable urlpdf,

ça fonctionne :

#SET{urlpdf,"https://www.domaine.tld/spip.php?page=spipdf&spipdf=pdf-t

est&nom_fichier=fichier-pdf-test.pdf"}

<a href="[(#VAL{archive_test}|zippeur_dynamique{'','','','',

  #LISTE{

      #LISTE{#GET{urlpdf},'fichier-pdf-test.pdf'}

  },'24*3600'})]">ZIP_TEST</a>

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

je suis étonné par ton premier problème, puisque mon exemple a moi
fonctionnait nickel.

Pour le second, je vois pas trop de solution…

--

Maïeul

http://blog.maieul.net

http://geekographie.maieul.net

----
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

je ne sais pas, il me manque la moitié des infos… l'exemple que tu m'avais fournit marchait chez moi…

--
Maïeul