[SPIP Zone] [Spip-zone-commit] r31115 - in /_galaxie_/programmer.spip.org/plugin_pdf: ./ documentation_pdf_pipelines.php genie/ genie/generer_documentation_pdf.php lib/ lib/prince/ lib/prince/prince.php lib/prince/readme.html plugin.xml tests/ tests/g

Le 26 août 09 à 17:28, marcimat@free.fr a écrit :

Author: marcimat@free.fr
Date: Wed Aug 26 17:28:17 2009
New Revision: 31115

Log:
Un générateur de doc PDF pour le squelette «documentation» qui fonctionne avec Prince (qui doit donc être installé - attention, la licence de Prince mis à disposition parle d'utilisation en «single computer», mais est payant si utilisé sur un serveur. Il faudra trouver un vrai logiciel libre, si un jour ça existe.).

Effectivement, $3800 par an, ça peut faire un peu mal...

Sinon, ce qui a été fait pour Drupal (utiliser le moteur de rendu de Webkit, pour simplifier) semble intéressant, même si cela nécessite du boulot au niveau de l'OS :
http://drupal.org/node/419296

Ce plugin stocke les fichiers par défaut dans IMG/documentation_pdf, crée un livre par langue et aussi un par chapitre. Les fichiers ont la date de dernière mise à jour de la rubrique, pratique pour voir ce qui a changé.
Des constantes permettent de modifier des choses dans le fichier génie.
L'actualisation se réalise toutes les semaines, ou est forcée par ?page=tests/generer_documentation_pdf pour les auteurs webmestres

Ce plugin est-il appelé à s'émanciper de programmer.spip.org ?

Added:
   _galaxie_/programmer.spip.org/plugin_pdf/
   _galaxie_/programmer.spip.org/plugin_pdf/documentation_pdf_pipelines.php
   _galaxie_/programmer.spip.org/plugin_pdf/genie/
   _galaxie_/programmer.spip.org/plugin_pdf/genie/generer_documentation_pdf.php
   _galaxie_/programmer.spip.org/plugin_pdf/lib/
   _galaxie_/programmer.spip.org/plugin_pdf/lib/prince/
   _galaxie_/programmer.spip.org/plugin_pdf/lib/prince/prince.php
   _galaxie_/programmer.spip.org/plugin_pdf/lib/prince/readme.html
   _galaxie_/programmer.spip.org/plugin_pdf/plugin.xml
   _galaxie_/programmer.spip.org/plugin_pdf/tests/
   _galaxie_/programmer.spip.org/plugin_pdf/tests/generer_documentation_pdf.html

Added: _galaxie_/programmer.spip.org/plugin_pdf/documentation_pdf_pipelines.php

--- _galaxie_/programmer.spip.org/plugin_pdf/documentation_pdf_pipelines.php (added)
+++ _galaxie_/programmer.spip.org/plugin_pdf/documentation_pdf_pipelines.php Wed Aug 26 17:28:17 2009
@@ -0,0 +1,8 @@
+<?php
+
+# taches periodiques (cron, genie)
+function documentation_pdf_taches_generales_cron($taches_generales) {
+ $taches_generales['generer_documentation_pdf'] = 7 * 24 * 60 * 60; // toutes les semaines
+ return $taches_generales;
+}
+?>

Added: _galaxie_/programmer.spip.org/plugin_pdf/genie/generer_documentation_pdf.php

--- _galaxie_/programmer.spip.org/plugin_pdf/genie/generer_documentation_pdf.php (added)
+++ _galaxie_/programmer.spip.org/plugin_pdf/genie/generer_documentation_pdf.php Wed Aug 26 17:28:17 2009
@@ -0,0 +1,104 @@
+<?php
+
+define('_NOM_FICHIER_PDF', 'documentation');
+define('_NOM_DOCUMENTATION_PDF', 'documentation_pdf');
+define('_DIR_DOCUMENTATION_PDF', _DIR_IMG . _NOM_DOCUMENTATION_PDF . '/');
+
+#define('_BIN_PRINCE', '/usr/local/bin/prince');
+define('_BIN_PRINCE', '/usr/bin/prince');
+
+define('_SKEL_DOCUMENTATION', 'integrale');
+define('_DOCUMENTATION_PDF_ECHO', false);
+
+function docpdf_log($texte) {
+ if (!_DOCUMENTATION_PDF_ECHO) {
+ spip_log($texte, 'pdf');
+ } else {
+ print_r($texte);
+ echo "\n<br />\n";
+ }
+}
+
+function genie_generer_documentation_pdf_dist($t, $echo=false) {
+ docpdf_log('Genie documentation pdf en marche !');
+
+ // creer le repertoire d'accueil
+ sous_repertoire(_DIR_DOCUMENTATION_PDF);
+
+ // supprimer les anciens fichiers
+ docpdf_log('Suppression des pdf !');
+ foreach (preg_files(_DIR_DOCUMENTATION_PDF, '.*\.pdf') as $fichier) {
+ supprimer_fichier($fichier);
+ }
+
+ // appeler le Grand Prince a la rescousse
+ include_spip('lib/prince/prince');
+
+ // lister les langues, si utile (1 secteur par langue) :
+ if (lire_config('documentation/secteur_langue') == 'on') {
+ docpdf_log('Creation des pdf par secteur de langue.');
+ // selection des secteurs de langue
+ $secteurs = sql_allfetsel(array('lang', 'id_rubrique','date'), 'spip_rubriques', 'id_parent='.sql_quote(0));
+ foreach ($secteurs as $secteur) {
+ generer_chapitres_et_livre_pdf($secteur['id_rubrique'], $secteur['lang'], $secteur['date']);
+ }
+ } else {
+ // juste les secteurs
+ docpdf_log('Creation des pdf (racine).');
+ generer_chapitres_et_livre_pdf();
+ }
+
+ return true;
+
+}
+
+function generer_chapitres_et_livre_pdf($id_rubrique=0, $lang='', $date = '') {
+ static $url_doc = null;
+ if (is_null($url_doc)) {
+ // preparation de l'url
+ include_spip('inc/filtres_mini');
+ $url_doc = url_absolue(generer_url_public(_SKEL_DOCUMENTATION));
+ }
+
+ // on boucle sur les chapitres
+ $chapitres = sql_allfetsel(array('id_rubrique','date'), 'spip_rubriques', 'id_parent='.sql_quote($id_rubrique));
+ foreach ($chapitres as $num=>$chapitre) {
+ $fichier = _DIR_DOCUMENTATION_PDF . _NOM_FICHIER_PDF;
+ $url = $url_doc;
+ if ($lang) {
+ $url = parametre_url($url, 'lang', $lang, '&');
+ $fichier .= '_' . $lang;
+ }
+ $url = parametre_url($url, 'id_rubrique', $chapitre['id_rubrique'], '&');
+ $fichier .= '_chapitre_' . ($num + 1) . '.pdf';
+
+ // on genere de pdf des chapitres
+ docpdf_log('Chapitre ' . ($num + 1) . " (rubrique $chapitre[id_rubrique])");
+ generer_documentation_pdf($url, $fichier, $chapitre['date']);
+ }
+
+ // on genere de pdf integral du secteur
+ $fichier = _DIR_DOCUMENTATION_PDF . _NOM_FICHIER_PDF;
+ $url = $url_doc;
+ if ($lang) {
+ $url = parametre_url($url, 'lang', $lang, '&');
+ $fichier .= '_' . $lang;
+ }
+ $fichier .= '.pdf';
+ docpdf_log('Livre ' . ($lang ? " ($lang)" : ''));
+ generer_documentation_pdf($url, $fichier, $date);
+}
+
+function generer_documentation_pdf($url, $fichier, $date_modif) {
+ if (!$date) $date = time();
+ docpdf_log("Creation de : $fichier, date : $date_modif");
+ $err = array();
+ $Prince = new Prince(_BIN_PRINCE);
+ $Prince->convert_file_to_file($url, $fichier, $err);
+ touch($fichier, strtotime($date_modif));
+ # if ($err) docpdf_log($err);
+}
+
+?>

Added: _galaxie_/programmer.spip.org/plugin_pdf/lib/prince/prince.php

--- _galaxie_/programmer.spip.org/plugin_pdf/lib/prince/prince.php (added)
+++ _galaxie_/programmer.spip.org/plugin_pdf/lib/prince/prince.php Wed Aug 26 17:28:17 2009
@@ -0,0 +1,417 @@
+<?php
+
+// Prince - PHP interface
+// Copyright 2005-2008 YesLogic Pty. Ltd.
+// http://www.princexml.com
+
+class Prince
+{
+ private $exePath;
+ private $styleSheets;
+ private $isHTML;
+ private $baseURL;
+ private $doXInclude;
+ private $httpUser;
+ private $httpPassword;
+ private $logFile;
+ private $embedFonts;
+ private $compress;
+ private $encrypt;
+ private $encryptInfo;
+
+ public function __construct($exePath)
+ {
+ $this->exePath = $exePath;
+ $this->styleSheets = '';
+ $this->isHTML = false;
+ $this->baseURL = '';
+ $this->doXInclude = true;
+ $this->httpUser = '';
+ $this->httpPassword = '';
+ $this->logFile = '';
+ $this->embedFonts = true;
+ $this->compress = true;
+ $this->encrypt = false;
+ $this->encryptInfo = '';
+ }
+
+ // Add a CSS style sheet that will be applied to each document.
+ // cssPath: The filename of the CSS style sheet.
+ public function addStyleSheet($cssPath)
+ {
+ $this->styleSheets .= '-s "' . $cssPath . '" ';
+ }
+
+ // Clear all of the CSS style sheets.
+ public function clearStyleSheets()
+ {
+ $this->styleSheets = '';
+ }
+
+ // Specify whether documents should be parsed as HTML or XML/XHTML.
+ // html: True if all documents should be treated as HTML.
+ public function setHTML($html)
+ {
+ $this->isHTML = $html;
+ }
+
+ // Specify a file that Prince should use to log error/warning messages.
+ // logFile: The filename that Prince should use to log error/warning
+ // messages, or '' to disable logging.
+ public function setLog($logFile)
+ {
+ $this->logFile = $logFile;
+ }
+
+ // Specify the base URL of the input document.
+ // baseURL: The base URL or path of the input document, or ''.
+ public function setBaseURL($baseURL)
+ {
+ $this->baseURL = $baseURL;
+ }
+
+ // Specify whether XML Inclusions (XInclude) processing should be applied
+ // to input documents. XInclude processing will be performed by default
+ // unless explicitly disabled.
+ // xinclude: False to disable XInclude processing.
+ public function setXInclude($xinclude)
+ {
+ $this->doXInclude = $xinclude;
+ }
+
+ // Specify a username to use when fetching remote resources over HTTP.
+ // user: The username to use for basic HTTP authentication.
+ public function setHttpUser($user)
+ {
+ $this->httpUser = $user;
+ }
+
+ // Specify a password to use when fetching remote resources over HTTP.
+ // password: The password to use for basic HTTP authentication.
+ public function setHttpPassword($password)
+ {
+ $this->httpPassword = $password;
+ }
+
+ // Specify whether fonts should be embedded in the output PDF file. Fonts
+ // will be embedded by default unless explicitly disabled.
+ // embedFonts: False to disable PDF font embedding.
+ public function setEmbedFonts($embedFonts)
+ {
+ $this->embedFonts = $embedFonts;
+ }
+
+ // Specify whether compression should be applied to the output PDF file.
+ // Compression will be applied by default unless explicitly disabled.
+ // compress: False to disable PDF compression.
+ public function setCompress($compress)
+ {
+ $this->compress = $compress;
+ }
+
+ // Specify whether encryption should be applied to the output PDF file.
+ // Encryption will not be applied by default unless explicitly enabled.
+ // encrypt: True to enable PDF encryption.
+ public function setEncrypt($encrypt)
+ {
+ $this->encrypt = $encrypt;
+ }
+
+ // Set the parameters used for PDF encryption. Calling this method will
+ // also enable PDF encryption, equivalent to calling setEncrypt(true).

[... 714 lines stripped ...]
_______________________________________________
Spip-zone-commit@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone-commit

-Nicolas

--
Nicolas HOIZEY
Blog : http://www.gasteroprod.com/
Photos : http://flic.kr/nicolas-hoizey/

Le 01/09/2009 15:35, Nicolas Hoizey a écrit :

Le 26 août 09 à 17:28, marcimat@free.fr a écrit :

New Revision: 31115
Un générateur de doc PDF pour le squelette «documentation» qui

Sinon, ce qui a été fait pour Drupal (utiliser le moteur de rendu de
Webkit, pour simplifier) semble intéressant, même si cela nécessite du
boulot au niveau de l'OS :
http://drupal.org/node/419296

Oui, mais ce n'est je crois pas satisfaisant, quoique je n'ai pas testé avec webkit, mais avec opéra et gecko pour générer des pdf, et ni l'un ni l'autre ne prennent en compte les sélecteurs/propriétés CSS3 permettant de définir la taille de la page, ses marges, et de calculer les titres d'entête ou de numéros de page, ou encore de générer les points de liaison sur les tables des matières. Je suppose que c'est de même pour les moteurs Webkit, car en plus, ce sont des documents CSS3 en «draft», pour un usage très spécifique. Il faut attendre encore un peu que les moteurs de rendu sachent tout gérer, mais c'est je crois effectivement une des meilleures solutions tu as raison.

Ce plugin stocke les fichiers par défaut dans IMG/documentation_pdf,
crée un livre par langue et aussi un par chapitre.

Ce plugin est-il appelé à s'émanciper de programmer.spip.org ?

Heu, c'est à dire ? En fait, il l'est déjà vu que tu peux définir dans les options (cfg de mémoire) quel squelette appeler pour générer le pdf. Le reste, c'est que du HTML et CSS3.

Et par défaut il appelle le squelette du plugin «documentation», qui par ailleurs est aussi déjà indépendant de «programmer.spip.org» et utilisé sur d'autres sites comme http://technique.arscenic.org/

Merci pour ton lien en tout cas.

--
MM.

Le 1 sept. 09 à 15:59, Matthieu Marcillaud a écrit :

Le 01/09/2009 15:35, Nicolas Hoizey a écrit :

Le 26 août 09 à 17:28, marcimat@free.fr a écrit :

New Revision: 31115
Un générateur de doc PDF pour le squelette «documentation» qui

Sinon, ce qui a été fait pour Drupal (utiliser le moteur de rendu de
Webkit, pour simplifier) semble intéressant, même si cela nécessite du
boulot au niveau de l'OS :
http://drupal.org/node/419296

Oui, mais ce n'est je crois pas satisfaisant, quoique je n'ai pas testé avec webkit, mais avec opéra et gecko pour générer des pdf, et ni l'un ni l'autre ne prennent en compte les sélecteurs/propriétés CSS3 permettant de définir la taille de la page, ses marges, et de calculer les titres d'entête ou de numéros de page, ou encore de générer les points de liaison sur les tables des matières. Je suppose que c'est de même pour les moteurs Webkit, car en plus, ce sont des documents CSS3 en «draft», pour un usage très spécifique.

Je crois que Webkit fait parti des plus à jour sur l'adoption de syntaxes CSS 3, non ? Avec par contre des préfixes -webkit- à mettre sur les propriétés, tant que c'est du draft.

Il faut attendre encore un peu que les moteurs de rendu sachent tout gérer, mais c'est je crois effectivement une des meilleures solutions tu as raison.

Sans doute un peu trop technique au niveau installation, mais je n'ai pas trouvé mieux, les différents plugins pour SPIP que j'ai pu voir jusqu'à présent sont vraiment trop légers...

Ce plugin stocke les fichiers par défaut dans IMG/documentation_pdf,
crée un livre par langue et aussi un par chapitre.

Ce plugin est-il appelé à s'émanciper de programmer.spip.org ?

Heu, c'est à dire ?

Bin son code source est dans "/_galaxie_/programmer.spip.org/plugin_pdf" et non dans "/_plugins_/plugin_pdf", c'est tout.

En fait, il l'est déjà vu que tu peux définir dans les options (cfg de mémoire) quel squelette appeler pour générer le pdf. Le reste, c'est que du HTML et CSS3.

Oui, oui, ça OK.

Et par défaut il appelle le squelette du plugin «documentation», qui par ailleurs est aussi déjà indépendant de «programmer.spip.org» et utilisé sur d'autres sites comme http://technique.arscenic.org/

OK.

-Nicolas

--
Nicolas HOIZEY
Blog : http://www.gasteroprod.com/
Photos : http://flic.kr/nicolas-hoizey/