Browse Source

trunk/branches v3

svn/attic/article_pdf/trunk/112752
maieul@maieul.net 3 years ago
commit
fdeae89d87
  1. 38
      .gitattributes
  2. 155
      Code SPIP Demo/Code.txt
  3. BIN
      Code SPIP Demo/Ecureuil.gif
  4. BIN
      Code SPIP Demo/Papillon.jpg
  5. BIN
      Code SPIP Demo/SPIP.jpg
  6. 2053
      Demo.pdf
  7. BIN
      Lisez-moi.odt
  8. 147
      article_pdf.html
  9. 134
      article_pdf_fonctions.php
  10. 77
      article_pdf_options.php
  11. 88
      article_pdf_pipelines.php
  12. 35
      formulaires/configurer_article_pdf.html
  13. BIN
      img_pack/article_pdf.gif
  14. BIN
      img_pack/article_pdf.png
  15. 24
      lang/articlepdf.xml
  16. 14
      lang/articlepdf_de.php
  17. 29
      lang/articlepdf_en.php
  18. 29
      lang/articlepdf_es.php
  19. 29
      lang/articlepdf_fa.php
  20. 33
      lang/articlepdf_fr.php
  21. 35
      lang/articlepdf_nl.php
  22. 25
      lang/articlepdf_oc_ni_mis.php
  23. 35
      lang/articlepdf_pt_br.php
  24. 20
      lang/paquet-article_pdf_de.php
  25. 21
      lang/paquet-article_pdf_fr.php
  26. 3
      modeles/article_pdf.html
  27. 3
      modeles/rubrique_pdf.html
  28. 22
      paquet.xml
  29. 834
      pdf/lib_pdf_global.php
  30. 216
      pdf/lib_pdf_spip.php
  31. 30
      plugin.xml
  32. 6
      prive/squelettes/contenu/configurer_article_pdf.html
  33. BIN
      prive/themes/spip/images/article_pdf-16.png
  34. BIN
      prive/themes/spip/images/article_pdf-24.png
  35. BIN
      prive/themes/spip/images/article_pdf-32.png
  36. BIN
      prive/themes/spip/images/article_pdf-64.png
  37. BIN
      prive/themes/spip/images/article_pdf-icon.png
  38. 174
      rubrique_pdf.html

38
.gitattributes

@ -0,0 +1,38 @@
* text=auto !eol
Code[!!-~]SPIP[!!-~]Demo/Code.txt -text
Code[!!-~]SPIP[!!-~]Demo/Ecureuil.gif -text
Code[!!-~]SPIP[!!-~]Demo/Papillon.jpg -text
Code[!!-~]SPIP[!!-~]Demo/SPIP.jpg -text
/Demo.pdf -text
/Lisez-moi.odt -text
/article_pdf.html -text
/article_pdf_fonctions.php -text
/article_pdf_options.php -text
/article_pdf_pipelines.php -text
formulaires/configurer_article_pdf.html -text
img_pack/article_pdf.gif -text
img_pack/article_pdf.png -text
lang/articlepdf.xml -text
lang/articlepdf_de.php -text
lang/articlepdf_en.php -text
lang/articlepdf_es.php -text
lang/articlepdf_fa.php -text
lang/articlepdf_fr.php -text
lang/articlepdf_nl.php -text
lang/articlepdf_oc_ni_mis.php -text
lang/articlepdf_pt_br.php -text
lang/paquet-article_pdf_de.php -text
lang/paquet-article_pdf_fr.php -text
modeles/article_pdf.html -text
modeles/rubrique_pdf.html -text
/paquet.xml -text
pdf/lib_pdf_global.php -text
pdf/lib_pdf_spip.php -text
/plugin.xml -text
prive/squelettes/contenu/configurer_article_pdf.html -text
prive/themes/spip/images/article_pdf-16.png -text
prive/themes/spip/images/article_pdf-24.png -text
prive/themes/spip/images/article_pdf-32.png -text
prive/themes/spip/images/article_pdf-64.png -text
prive/themes/spip/images/article_pdf-icon.png -text
/rubrique_pdf.html -text

155
Code SPIP Demo/Code.txt

@ -0,0 +1,155 @@
Sur-titre :
Résumé
Titre :
Titre avec des caractères accentués - êèàç
Descriptif rapide :
Article de test pour la génération de PDF
Chapeau :
Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau, Test de chapeau,
Texte :
{{{titre1}}}
[Lien interne->1]
{{{titre2}}}
{italique}
{{gras}}
<HTML><u>souligné en forçant le code html</u></HTML>
<HTML><i>italique avec la balise i en forçant le code html</i></HTML>
<HTML><b>gras avec la balise b en forçant le code html</b></HTML>
<img7|left>
Image déportée à gauche
----
<HTML><br /><br /><br /></HTML>
Image centrée <img11|center>
----
<HTML><br /><br /><br /></HTML>
Image déportée à droite
<img10|right>
----
<HTML><br /><br /><br /></HTML>
{{{titre3}}}
Exemple de [lien interne->2]. Exemple de note [[note 1]]
Exemple d'ancre [Ancre<-]
Exemple de tableau
| {{Nom}} | {{Prénom}} | {{Age}} |
| Marso | Ben | 23 ans |
| [Lien interne vers Capitaine->5] | Toto | non connu |
| Philant | [Lien interne vers Philippe->2] | 46 ans |
| [Lien externe vers SPIP->https://www.spip.net/]| Bébé | <img10|right> |
Exemple de note [[note 2]]
Exemple de puces :
- Qu'est-ce que cela peut faire que je lutte pour la mauvaise cause
puisque je suis de bonne foi?
- Et qu'est-ce que ça peut faire que je sois de mauvaise foi
puisque c'est pour la bonne cause. (Jacques
Prévert)
Exemple de note [[note 3]]
[Exemple de lien vers Rubrique->rub1]
[Exemple de lien vers Brève->br1]
Auteurs, mots-clés, sites, images, documents :
lien vers [un auteur->aut13] ou [le même auteur->auteur13]
lien vers [un mot->mot32]
lien vers [un site syndiqué->site1]
lien vers [un document joint->doc17] ou [le même document->document17]
lien vers [une image->img13] ou [la même image->image13]
Exemple de lien vers une ancre [->art5#Ancre]
<quote>Exemple de citation</quote>
Exemple de note «forcée» [[<20> Note forçée]]
Exemple de lien externe vers le site de [SPIP->https://www.spip.net/].
Exemple de puces imbriquées :
-* Ton cheval est:
-** alezan;
-** bai;
-** noir;
-* mais mon lapin est:
-** blanc;
-*** angora;
-*** ou à poil ras.
Exemple de liste numérotée :
-# premier
-# deuxieme
-# troisieme
Exemple de retour à la ligne_
Exemple de retour à la ligne_
Exemple de code informatique :
<code>
<?php // ceci est du langage php
echo "bonjour";
?>
</code>
Exemple de lien vers un glossaire externe :
{À la recherche du temps perdu} est l'œuvre majeure de [?Marcel Proust]
{{{Titre paragraphe 1}}}
Pellentesque consequat tristique arcu. Nulla at lectus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Mauris hendrerit iaculis mauris. Vestibulum odio. Vestibulum tristique eleifend lorem. Integer quis justo. Nunc nunc. Etiam non felis.
{{{Titre paragraphe 2}}}
Aliquam iaculis feugiat quam. Nunc purus diam, ornare ut, porttitor eu, mollis nec, tellus. Nulla dapibus aliquet magna. Cras vestibulum ligula a velit. Integer quam. Proin et nibh vitae enim ultrices dapibus. Duis feugiat. Vivamus neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi cursus eleifend purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque nec velit. Nulla lacus ante, tempor in, aliquam et, semper ut, sapien. Etiam varius. Nunc vel magna. Morbi vel felis ut metus molestie lacinia. Phasellus ut quam. Curabitur arcu. Integer augue. Donec non mauris.
{{{Titre paragraphe 3}}}
- Aliquam erat volutpat. Sed venenatis mattis massa. Nulla facilisi. Donec vel sem. Praesent quis tortor. Vivamus ut diam nec leo facilisis venenatis. Suspendisse interdum facilisis pede. Etiam id nunc a metus sodales vulputate. In ultricies interdum velit. In sem. Mauris fringilla quam ut nibh. Mauris tellus augue, porta ac, condimentum eu, vulputate a, arcu. Curabitur a velit. Aenean imperdiet, nisl id dignissim euismod, elit tellus semper massa, ac accumsan ipsum nunc ornare dolor. Sed varius convallis tortor. In interdum consectetuer nisl.
- Phasellus quis nunc et pede elementum tincidunt. Nunc vitae nisl. Vestibulum tristique iaculis enim. Suspendisse sollicitudin, ligula quis commodo faucibus, enim quam semper lacus, vel fermentum tellus ipsum nec elit. Quisque neque orci, viverra sed, venenatis sed, malesuada at, enim. Cras tempor lorem in justo. Pellentesque varius accumsan purus. Aenean vel felis. Duis tincidunt elit in justo. Quisque lacus elit, congue vel, vehicula sed, commodo non, odio.

BIN
Code SPIP Demo/Ecureuil.gif

After

Width: 150  |  Height: 118  |  Size: 4.4 KiB

BIN
Code SPIP Demo/Papillon.jpg

After

Width: 150  |  Height: 81  |  Size: 2.9 KiB

BIN
Code SPIP Demo/SPIP.jpg

After

Width: 461  |  Height: 293  |  Size: 19 KiB

2053
Demo.pdf
File diff suppressed because it is too large
View File

BIN
Lisez-moi.odt

147
article_pdf.html

@ -0,0 +1,147 @@
#CACHE{0}
<?php
// Mode release => $debug=0
// Mode debug => $debug=1
<B_principale>
<BOUCLE_principale(ARTICLES){id_article}>
$conf_url_site = '[(#URL_ARTICLE|url_absolue|texte_script)]' ;
$conf_nom_site = '[(#NOM_SITE_SPIP|pdf_first_clean|supprimer_tags|texte_script)]' ;
// Recuperation et definition des differents elements
$site='[(#NOM_SITE_SPIP|pdf_first_clean|supprimer_tags|texte_script)]';
$rubrique='<B_rubrique_mere><BOUCLE_rubrique_mere(RUBRIQUES){id_rubrique}>[(#TITRE|supprimer_numero|pdf_first_clean|supprimer_tags|texte_script)]</BOUCLE_rubrique_mere></B_rubrique_mere>[(#NOM_SITE_SPIP|pdf_first_clean|supprimer_tags|texte_script)]<//B_rubrique_mere>';
$DateParution='[(#DATE_REDAC|affdate|pdf_first_clean|texte_script)]';
$DateMiseEnLigne='[(#DATE|nom_jour|texte_script)] [(#DATE|affdate|pdf_first_clean|texte_script)]';
/*$auteur='<BOUCLE_auteurs(AUTEURS){id_article}{", "}>[(#NOM|pdf_first_clean|texte_script)]</BOUCLE_auteurs>';*/
$motsclef='<BOUCLE_keywords(MOTS){id_article}{", "}>[(#TITRE|pdf_first_clean|supprimer_tags|texte_script)]</BOUCLE_keywords>';
$yahoo='-<BOUCLE_yahoo(HIERARCHIE){id_article}> [(#TITRE|supprimer_numero|pdf_first_clean|supprimer_tags|texte_script)] - </BOUCLE_yahoo>';
$logo_site='[(#LOGO_SITE_SPIP|extraire_attribut{src}|texte_script)]';
$logo_site = preg_replace(',[?][0-9]+$,','',$logo_site);
// attention à l'ordre des filtres SPIP
$logo_fichier='[(#LOGO_ARTICLE_RUBRIQUE|texte_script|extraire_attribut{src})]'; //fonctionne correctement
$logo_fichier = preg_replace(',[?][0-9]+$,','',$logo_fichier);
// [$logo_lien="(#URL_ARTICLE)";]
[$surtitre='(#SURTITRE|pdf_first_clean|supprimer_tags|texte_script)';]
[$titre='(#TITRE|supprimer_numero|pdf_first_clean|supprimer_tags|texte_script)';]
[$soustitre='(#SOUSTITRE|pdf_first_clean|supprimer_tags|texte_script)';]
[$chapo='(#CHAPO|pdf_first_clean|texte_script)';]
[$descriptif='(#DESCRIPTIF|pdf_first_clean|texte_script)';]
[$texte= '(#TEXTE|image_reduire{400,400}|abs_url|pdf_first_clean|texte_script)';]
[$ps='(#PS|pdf_first_clean|texte_script)';]
[$notes='(#NOTES|pdf_first_clean|texte_script)';]
$copyright = '[(#VAL{articlepdf:copyright}|_T|pdf_first_clean|texte_script)][(#NOM_SITE_SPIP|pdf_first_clean|supprimer_tags|texte_script)][(#VAL{articlepdf:tous_droits_reserves}|_T|pdf_first_clean|texte_script)]';
$id_article = "#ID_ARTICLE";
$files_pdf = '[(#TITRE|pdf_nommer_ancien{article, #ID_ARTICLE})]';
$file_out = _DIR_STOCK_PDF . $files_pdf ;
$files_pdf_new = '[(#TITRE|pdf_nommer{article, #ID_ARTICLE})]';
$file_out_new = _DIR_STOCK_PDF . $files_pdf_new ;
//creer un pdf avec un nouveau nom que si un ancien n'existe pas
if (!file_exists($file_out)) {
$file_out = $file_out_new ;
$files_pdf = $files_pdf_new;
}
if (file_exists($file_out))
{
clearstatcache;
$damo = date(YmdHi , strtotime("#DATE_MODIF")) ;
$dage = date(YmdHi , filemtime($file_out)) ;
if ($damo > $dage)
{
unlink($file_out);
}
}
</BOUCLE_principale>
</B_principale>
header("Location: index.php");
exit;
<//B_principale>
if ($debug == 1 && file_exists($file_out))
{
unlink($file_out);
}
if (!file_exists($file_out))
{
define('FPDF_FONTPATH',_DIR_FPDF_LIB.'font');
include_spip(_DIR_FPDF_LIB.'fpdf');
include_spip('pdf/lib_pdf_global');
include_spip('pdf/lib_pdf_spip');
//--------------------------------
// Debut génération du PDF
//--------------------------------
$pdf->debug=$debug;
$pdf=new PDF_SPIP();
$pdf->SetCompression(false);
$pdf->SetDisplayMode(fullpage, single );
// haut, gauche, bas, droite
$pdf->SetAllMargins(12,15,12,10);
$pdf->SetTitle($titre);
$pdf->SetCreator($site);
$pdf->SetCopyright($copyright);
$pdf->SetSubject($rubrique);
$pdf->SetKeywords($motsclef);
$pdf->Build($file_out);
$lier_pdf = pipeline('build_pdf',array(
'args'=>array(
'objet' => 'article',
'id_objet' => $id_article,
'file_name' => $files_pdf
),
'data'=> $file_out,
));
}
$id_document = $lier_pdf[data][$file_out];
if($id_document > 0){
$file_out = '#URL_DOCUMENT{$id_document}';
}
// Vous voulez afficher un pdf
header("Content-type: application/pdf");
//Si on est en mutualisé avec masquages des vraies urls d'images
if (stripos($GLOBALS['spip_pipeline']['affichage_final'],'mutualisation_url_img_courtes')){
$file_out = str_replace(_DIR_IMG,_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES,$file_out);
}
if ($debug==1)
{
// Affiche le PDF directement dans l'onglet de Firefox
// Ne fonctionne pas sous IE 6 SP2 : le pdf n'est pas reconnu (pris pour un fichier texte)
header("location: ". url_de_base() . $file_out);
}
else
{
// Il sera nommé $files_pdf
// ATTENTION : pour "filename", mettre un nom de fichier court (<nom>.<extension>)
// sinon IE 6 SP2 ne reconnaîtra pas le type de fichier
// Semble poser problème sous IE6 SP1
// Ah, Microsoft, je vous jure !
header('Content-Disposition: attachment; filename=' . $files_pdf);
// Le source du PDF original.pdf
readfile($file_out);
}
exit;

134
article_pdf_fonctions.php

@ -0,0 +1,134 @@
<?php
if (!defined('_ECRIRE_INC_VERSION'))
return;
$p = explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
if (!defined('_DIR_PLUGIN_ARTICLE_PDF')) define('_DIR_PLUGIN_ARTICLE_PDF',(_DIR_PLUGINS.end($p)));
function pdf_first_clean_prepropre($texte){
// Cette fonction est appelé avant propre.
$texte = preg_replace('#(<code class=(\'|")([\w]+)(\'|")>)#','<code>',$texte); // si on a coloration code, on décolorie d'abord
$texte = preg_replace('#(<cadre class=(\'|")([\w]+)(\'|")>)#','<cadre>',$texte);
return propre($texte);
}
function pdf_first_clean($texte){
// Cette focntion est appelé après la fonction propre
// $texte = ereg_replace("<p class[^>]*>", "<P>", $texte);
//Translation des codes iso
// PB avec l'utilisation de <code>
$trans = get_html_translation_table(HTML_ENTITIES);
$texte = preg_replace(',<!-- .* -->,msU', '', $texte); // supprimer les remarques HTML (du Couteau Suisse ?)
$trans = array_flip($trans);
$trans["<br />\n"] = "<BR>"; // Pour éviter que le \n ne se tranforme en espace dans les <DIV class=spip_code> (TT, tag SPIP : code)
$trans['&#176;'] = "°";
$trans["&#339;"] = "oe";
$trans["&#8206;"] = "";
$trans["&#8211;"] = "-";
$trans["&#8216;"] = "'";
$trans["&#8217;"] = "'";
$trans["&#8220;"] = "\"";
$trans["&#8221;"] = "\"";
$trans["&#8230;"] = "...";
$trans["&#8364;"] = "Euros";
$trans["&ucirc;"] = "û";
$trans['->'] = '-»';
$trans['<-'] = '«-';
$trans['&nbsp;'] = ' ';
// certains titles font paniquer l'analyse
$texte = preg_replace(',title=".*",msU', 'title=""', $texte);
$texte = unicode2charset(charset2unicode($texte), 'iso-8859-1'); // repasser tout dans un charset acceptable par export PDF
$texte = strtr($texte, $trans);
return $texte;
}
function filtre_supprimer_param_logo($texte){
return preg_replace('`\?[0-9]*$`','',$texte);
}
/**
* [(#TITRE|pdf_nommer{article, #ID_ARTICLE})]
*
* Fonction reprise de SPIP (plugin dist urls_etendues)
* pour le filtre url_nettoyer
*
**/
function pdf_nommer($titre_parent, $objet, $id_parent){
// utiliser la constante _DIR_STOCK_PDF
// au choix, selon le cas (voir les avantages et les inconvéniants de chaque selon le site):
// $path_pdf = sous_repertoire(_DIR_CACHE, "article_PDF"); // stockage dans le cache SPIP
// $path_pdf = sous_repertoire(_DIR_IMG, "article_PDF"); //stockage sous le dossier IMG
include_spip('action/editer_url');
$titre = url_nettoyer($titre_parent,60);
$lettre = substr($objet, 0, 1);
$nom_pdf = $titre."_".$lettre.$id_parent.".pdf";
return $nom_pdf;
}
/**
*
* [(#TITRE|pdf_nommer_ancien{article, #ID_ARTICLE})]
*
**/
function pdf_nommer_ancien($titre_parent, $objet='article', $id_article){
//$titre_article = translitteration(corriger_caracteres('[(#TITRE|supprimer_numero|pdf_first_clean|supprimer_tags|texte_script)]'));
$titre_article = translitteration(corriger_caracteres(texte_script(supprimer_tags(pdf_first_clean($titre_parent)))));
// Reprise du code de urls/propres.php (pourquoi c'est pas une fonction de l'API de SPIP ?)
// on va convertir tous les caracteres de ponctuation et espaces
// a l'exception de l'underscore (_), car on veut le conserver dans l'url
$titre_article = str_replace('_', chr(7), $titre_article);
$titre_article = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre_article);
$titre_article = str_replace(chr(7), '_', $titre_article);
// S'il reste trop de caracteres non latins, les gerer comme wikipedia
// avec rawurlencode :
if (preg_match_all(",[^a-zA-Z0-9 _]+,", $titre_article, $r, PREG_SET_ORDER)) {
foreach ($r as $regs) {
$titre_article = substr_replace($titre_article, rawurlencode($regs[0]),
strpos($titre_article, $regs[0]), strlen($regs[0]));
}
}
// S'il reste trop peu, on retombe sur article12
if (strlen($titre_article) == 0 ) {
$titre_article = "article";
}
// Sinon couper les mots et les relier par des tirets
else {
$mots = preg_split(",[^a-zA-Z0-9_%]+,", $titre_article);
$titre_article = '';
foreach ($mots as $mot) {
if (!strlen($mot)) continue;
$titre_article2 = $titre_article.'-'.$mot;
// Si on depasse _URLS_PROPRES_MAX caracteres, s'arreter
// ne pas compter 3 caracteres pour %E9 mais un seul
$long = preg_replace(',%.,', '', $titre_article2);
if (strlen($long) > _URLS_PROPRES_MAX) {
break;
}
$titre_article = $titre_article2;
}
$titre_article = substr($titre_article, 1);
// On enregistre en utf-8 dans la base
$titre_article = rawurldecode($titre_article);
if (strlen($titre_article) == 0)
$titre_article = "article";
}
$files_pdf = $titre_article."_a".$id_article.".pdf";
return $files_pdf;
}

77
article_pdf_options.php

@ -0,0 +1,77 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
// au choix, selon le cas (voir les avantages et les inconvénients de chaque selon le site):
// si besoin on fera un define de la constante en amont dans le fichier config/mes_options.php
//define('_DIR_STOCK_PDF', sous_repertoire(_DIR_CACHE, "article_PDF"));
if (!defined('_DIR_STOCK_PDF')) {
define('_DIR_STOCK_PDF', sous_repertoire(_DIR_IMG, "article_PDF"));
}
if (!defined('_DIR_LIB')) define('_DIR_LIB', _DIR_RACINE . 'lib/');
if (!defined('_DIR_FPDF_LIB')) define('_DIR_FPDF_LIB', _DIR_LIB . 'h5c1accba-fpdf17/');
function balise_ARTICLE_PDF_dist($p) {
if (!is_array($p->param))
$p->param=array();
// Produire le premier argument {article_pdf}
$texte = new Texte;
$texte->type='texte';
$texte->texte='article_pdf';
$param = array(0=>NULL, 1=>array(0=>$texte));
array_unshift($p->param, $param);
// Transformer les filtres en arguments
for ($i=1; $i<count($p->param); $i++) {
if ($p->param[$i][0]) {
if (!strstr($p->param[$i][0], '='))
break;# on a rencontre un vrai filtre, c'est fini
$texte = new Texte;
$texte->type='texte';
$texte->texte=$p->param[$i][0];
$param = array(0=>$texte);
$p->param[$i][1] = $param;
$p->param[$i][0] = NULL;
}
}
// Appeler la balise #MODELE{article_pdf}{arguments}
if (!function_exists($f = 'balise_modele'))
$f = 'balise_modele_dist';
return $f($p);
}
function balise_RUBRIQUE_PDF_dist($p) {
if (!is_array($p->param))
$p->param=array();
// Produire le premier argument {article_pdf}
$texte = new Texte;
$texte->type='texte';
$texte->texte='rubrique_pdf';
$param = array(0=>NULL, 1=>array(0=>$texte));
array_unshift($p->param, $param);
// Transformer les filtres en arguments
for ($i=1; $i<count($p->param); $i++) {
if ($p->param[$i][0]) {
if (!strstr($p->param[$i][0], '='))
break;# on a rencontre un vrai filtre, c'est fini
$texte = new Texte;
$texte->type='texte';
$texte->texte=$p->param[$i][0];
$param = array(0=>$texte);
$p->param[$i][1] = $param;
$p->param[$i][0] = NULL;
}
}
// Appeler la balise #MODELE{article_pdf}{arguments}
if (!function_exists($f = 'balise_modele'))
$f = 'balise_modele_dist';
return $f($p);
}

88
article_pdf_pipelines.php

@ -0,0 +1,88 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
/*
* Pipeline créé dans article_pdf.html
*
$data = pipeline('build_pdf',array(
'args'=>array(
'objet' => 'article',
'id_objet' => $id_article,
'file_name' => $files_pdf
),
'data'=> $file_out,
));
*
*
*/
function article_pdf_build_pdf($flux){
// le pdf vient d'être créée
// il existe et la demande de lier le pdf est configurée
$file_out = $flux['data'];
$pdf_to_document = false;
if (file_exists($file_out)) {
include_spip('inc/config');
$pdf_to_document = lire_config('article_pdf/pdf_to_document');
}
if($pdf_to_document == 'oui'){
include_spip('inc/autoriser');
include_spip('inc/modifier');
include_spip('action/editer_document');
include_spip('action/ajouter_documents');
$objet = $flux['args']['objet'];
$id_objet = $flux['args']['id_objet'];
$titre_pdf = $flux['args']['file_name'];
$file['name'] = strtolower(translitteration($titre_pdf));
//chercher le document correspondant, pour le modifier sinon le créer
$id_document = sql_getfetsel('id_document','spip_documents','fichier LIKE '.sql_quote('%pdf/'.$file['name']));
spip_log("DEJJJJJJAAAAA * out est $file_out * fichier $titre_pdf devient ".'pdf/'.$file['name'] ." id_document =".$id_document, 'article_pdf_build_pdf');
$file['extension'] = 'pdf';
$file['tmp_name'] = $file_out;
$file['mode'] = 'document';
if(! $id_document){
$id_document = "new";
}
// donner une autorisation exceptionnelle temporaire
autoriser_exception('associerdocuments', $objet, $id_objet);
$ajouter_un_document = charger_fonction('ajouter_un_document', 'action');
$id_document_ajout = $ajouter_un_document($id_document, $file, $objet, $id_objet, 'document');
spip_log("fichier= $fichier Traitement = ".$pdf_to_document." ? avec récupération de ".$objet.$id_objet." chemin du pdf = ".$file_out,'article_pdf_build_pdf');
autoriser_exception('associerdocuments', $objet, $id_objet, false);
}
if($id_document_ajout > 0){
$id_document = $id_document_ajout;
$champs['credits'] = 'Extraction PDF [->'.$objet.$id_objet.']';
// donner une autorisation exceptionnelle temporaire
autoriser_exception('modifier', 'document', $id_document);
// réaliser l'action désirée
document_modifier($id_document, $champs);
// retirer l'autorisation exceptionnelle
autoriser_exception('modifier', 'document', $id_document, false);
$flux['data'] = $id_document;
} else {
$erreur = _T('medias:erreur_insertion_document_base', array('fichier' => "<em>" . $file_out . "</em>"));
spip_log("article_pdf $erreur", "article_pdf_build_pdf");
}
return $flux;
}

35
formulaires/configurer_article_pdf.html

@ -0,0 +1,35 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
<h3 class="titrem"><:articlepdf:cfg_titre_parametrages:></h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form method="post" action="#ENV{action}">
<div>
#ACTION_FORMULAIRE{#ENV{action}}
#SET{fl,articlepdf}
<ul class="editer-groupe">
#SET{name,pdf_to_document}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<li class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]
#SET{val,oui}
<div class="choix">
<input type="checkbox" name="#GET{name}" class="checkbox" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
<label for="#GET{name}_#GET{val}"><:articlepdf:label_pdf_to_document_oui:></label>
</div>
</li>
</ul>
<input type="hidden" name="_meta_casier" value="article_pdf" />
<p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
</div>
</form>
</div>
[(#REM)
SPIP #SPIP_VERSION pour article_pdf: #CONFIG{article_pdf/pdf_to_document}
]

BIN
img_pack/article_pdf.gif

After

Width: 24  |  Height: 24  |  Size: 741 B

BIN
img_pack/article_pdf.png

After

Width: 24  |  Height: 24  |  Size: 942 B

24
lang/articlepdf.xml

@ -0,0 +1,24 @@
<traduction module="articlepdf" gestionnaire="salvatore" url="https://trad.spip.net" source="svn://zone.spip.org/spip-zone/_plugins_/article_pdf/lang/" reference="fr">
<langue code="de" url="https://trad.spip.net/tradlang_module/articlepdf?lang_cible=de" total="12" traduits="1" relire="0" modifs="0" nouveaux="11" pourcent="8.33">
</langue>
<langue code="en" url="https://trad.spip.net/tradlang_module/articlepdf?lang_cible=en" total="12" traduits="8" relire="0" modifs="0" nouveaux="4" pourcent="66.67">
<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
</langue>
<langue code="es" url="https://trad.spip.net/tradlang_module/articlepdf?lang_cible=es" total="12" traduits="8" relire="0" modifs="0" nouveaux="4" pourcent="66.67">
<traducteur nom="severo" lien="https://trad.spip.net/auteur/severo" />
</langue>
<langue code="fa" url="https://trad.spip.net/tradlang_module/articlepdf?lang_cible=fa" total="12" traduits="8" relire="0" modifs="0" nouveaux="4" pourcent="66.67">
<traducteur nom="Davood Hossein" lien="https://trad.spip.net/auteur/davood-hossein" />
</langue>
<langue code="fr" url="https://trad.spip.net/tradlang_module/articlepdf?lang_cible=fr" total="12" traduits="12" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
</langue>
<langue code="nl" url="https://trad.spip.net/tradlang_module/articlepdf?lang_cible=nl" total="12" traduits="12" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
</langue>
<langue code="oc_ni_mis" url="https://trad.spip.net/tradlang_module/articlepdf?lang_cible=oc_ni_mis" total="12" traduits="6" relire="0" modifs="0" nouveaux="6" pourcent="50.00">
<traducteur nom="sylvain" lien="https://trad.spip.net/auteur/sylvain" />
</langue>
<langue code="pt_br" url="https://trad.spip.net/tradlang_module/articlepdf?lang_cible=pt_br" total="12" traduits="12" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
<traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" />
</langue>
</traduction>

14
lang/articlepdf_de.php

@ -0,0 +1,14 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// extrait automatiquement de https://trad.spip.net/tradlang_module/articlepdf?lang_cible=de
// ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// E
'enregistrer_pdf' => 'Als PDF speichern'
);

29
lang/articlepdf_en.php

@ -0,0 +1,29 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// extrait automatiquement de https://trad.spip.net/tradlang_module/articlepdf?lang_cible=en
// ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'copyright' => 'Copyright © ',
// D
'date_de_mise_en_ligne' => 'Publication date: ',
'date_de_parution' => 'Creation date: ',
'description' => 'Description: ',
// E
'enregistrer_pdf' => 'Save this article in PDF',
'extrait_de' => 'Extract of ',
// P
'post_scriptum' => 'PS: ',
// T
'tous_droits_reserves' => ' - All rights reserved'
);

29
lang/articlepdf_es.php

@ -0,0 +1,29 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// extrait automatiquement de https://trad.spip.net/tradlang_module/articlepdf?lang_cible=es
// ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'copyright' => 'Copyright © ',
// D
'date_de_mise_en_ligne' => 'Fecha de publicación en línea: ',
'date_de_parution' => 'Fecha de redacción: ',
'description' => 'Descripción: ',
// E
'enregistrer_pdf' => 'Grabar en formato PDF',
'extrait_de' => 'Extraído de ',
// P
'post_scriptum' => 'Posdata: ',
// T
'tous_droits_reserves' => ' - Todos derechos reservados'
);

29
lang/articlepdf_fa.php

@ -0,0 +1,29 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// extrait automatiquement de https://trad.spip.net/tradlang_module/articlepdf?lang_cible=fa
// ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'copyright' => 'كپي رايت © ',
// D
'date_de_mise_en_ligne' => 'تاريخ نشر : ',
'date_de_parution' => 'تاريخ خلق : ',
'description' => 'توصيف : ',
// E
'enregistrer_pdf' => 'ثبت در قالب پي.دي.اف ',
'extrait_de' => 'استخراج از ',
// P
'post_scriptum' => 'پي.اس (پست اسكريپت) : ',
// T
'tous_droits_reserves' => '- تمام حقوق محفوظ'
);

33
lang/articlepdf_fr.php

@ -0,0 +1,33 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/article_pdf/lang/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'cfg_titre_parametrages' => 'Paramétrer les pdfs créés',
'configurer_titre' => 'Configurer le plugin article_pdf',
'copyright' => 'Copyright © ',
// D
'date_de_mise_en_ligne' => 'Date de mise en ligne : ',
'date_de_parution' => 'Date de parution : ',
'description' => 'Description : ',
// E
'enregistrer_pdf' => 'Enregistrer au format PDF',
'extrait_de' => 'Extrait du ',
// L
'label_pdf_to_document' => 'Seulement si je suis en SPIP3',
'label_pdf_to_document_oui' => 'Enregistrer et lier le pdf en tant que document',
// P
'post_scriptum' => 'Post-scriptum : ',
// T
'tous_droits_reserves' => ' - Tous droits réservés'
);

35
lang/articlepdf_nl.php

@ -0,0 +1,35 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// extrait automatiquement de https://trad.spip.net/tradlang_module/articlepdf?lang_cible=nl
// ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'cfg_titre_parametrages' => 'De gemaakte PDF’s van parameters voorzien',
'configurer_titre' => 'De plugin article_pdf configureren',
'copyright' => 'Copyright © ',
// D
'date_de_mise_en_ligne' => 'Online geplaatst op: ',
'date_de_parution' => 'Verschijningsdatum: ',
'description' => 'Omschrijving: ',
// E
'enregistrer_pdf' => 'In PDF-formaat opslaan',
'extrait_de' => 'Uittreksel van ',
// L
'label_pdf_to_document' => 'Alleen in SPIP3',
'label_pdf_to_document_oui' => 'De PDF registreren en koppelen als document',
// P
'post_scriptum' => 'PS: ',
// T
'tous_droits_reserves' => ' - Alle rechten voorbehouden'
);

25
lang/articlepdf_oc_ni_mis.php

@ -0,0 +1,25 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// extrait automatiquement de https://trad.spip.net/tradlang_module/articlepdf?lang_cible=oc_ni_mis
// ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'copyright' => 'Copyright © ',
// D
'date_de_mise_en_ligne' => 'Data de messa en ligna : ',
'description' => 'Descricioun : ',
// E
'enregistrer_pdf' => 'Registrà au fourmat PDF',
'extrait_de' => 'Estrach dóu',
// P
'post_scriptum' => 'Post-Escrich : '
);

35
lang/articlepdf_pt_br.php

@ -0,0 +1,35 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// extrait automatiquement de https://trad.spip.net/tradlang_module/articlepdf?lang_cible=pt_br
// ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// C
'cfg_titre_parametrages' => 'Configurar os PDFs criados',
'configurer_titre' => 'Configurar o plugin article_pdf',
'copyright' => 'Copyright © ',
// D
'date_de_mise_en_ligne' => 'Data de publicação online: ',
'date_de_parution' => 'Data de publicação original: ',
'description' => 'Descrição: ',
// E
'enregistrer_pdf' => 'Gravar em formato PDF',
'extrait_de' => 'Extraído de ',
// L
'label_pdf_to_document' => 'Apenas se eu estiver em SPIP3',
'label_pdf_to_document_oui' => 'Gravar e vincular o PDF como documento',
// P
'post_scriptum' => 'Pós-escrito:',
// T
'tous_droits_reserves' => ' - Todos os direitos reservados'
);

20
lang/paquet-article_pdf_de.php

@ -0,0 +1,20 @@
<?php
// Ceci est un fichier langue de SPIP -- This is a SPIP language file
// Fichier produit par PlugOnet
// Module: paquet-article_pdf
// Langue: de
// Date: 28-04-2016 12:21:52
// Items: 2
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'article_pdf_description' => 'Konvertierung eines Artikels in das PDF Format zum herunterladen. Benötigt GD2 auf Ihrem Server
Fügen Sie den Tag <code>#ARTICLE_PDF</code> in Ihr Skelett ein um über einen Link zum Herunterladen des Artikels im PDF Format zu verfügen',
'article_pdf_nom' => 'PDF Artikel',
);

21
lang/paquet-article_pdf_fr.php

@ -0,0 +1,21 @@
<?php
// Ceci est un fichier langue de SPIP -- This is a SPIP language file
// Fichier produit par PlugOnet
// Module: paquet-article_pdf
// Langue: fr
// Date: 28-04-2016 12:21:52
// Items: 3
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'article_pdf_description' => 'Conversion d\'un article au format pdf pour téléchargement. Nécessite GD2 sur votre serveur et le téléchargement et installation de la librairie FPDF dans le répertoire lib
Insérez la balise <code>#ARTICLE_PDF</code> dans votre squelette pour avoir un lien de téléchargement de l\'article au format PDF',
'article_pdf_nom' => 'Article PDF',
'article_pdf_slogan' => 'Convertir l\'article affiché au format pdf',
);

3
modeles/article_pdf.html

@ -0,0 +1,3 @@
[(#ENV{id_article}|?{' ',''})<a href='#URL_PAGE{article_pdf,id_article=#ENV{id_article}}' title='<:articlepdf:enregistrer_pdf:>'>
<img src='#CHEMIN{img_pack/article_pdf.gif}' width='24' height='24' alt='<:articlepdf:enregistrer_pdf:>' />
</a>]

3
modeles/rubrique_pdf.html

@ -0,0 +1,3 @@
[(#ENV{id_rubrique}|?{' ',''})<a href='#URL_PAGE{rubrique_pdf,id_rubrique=#ENV{id_rubrique}}' title='<:articlepdf:enregistrer_pdf:>' class="lien_PDF">
<img src='#CHEMIN{img_pack/article_pdf.gif}' width='17' height='17' alt='<:articlepdf:enregistrer_pdf:>' />
</a>]

22
paquet.xml

@ -0,0 +1,22 @@
<paquet
prefix="article_pdf"
categorie="edition"
version="0.4.17"
etat="stable"
compatibilite="[2.0.0;3.2.*]"
logo="prive/themes/spip/images/article_pdf-64.png"
documentation="https://contrib.spip.net/Article-PDF,2226"
>
<nom>Article PDF</nom>
<!-- Convertir l'article affiché au format pdf -->
<auteur lien="https://contrib.spip.net/_chag_">chag</auteur>
<auteur lien="https://contrib.spip.net/_Paul-Sanches_">Paul Sanches</auteur>
<auteur lien="https://contrib.spip.net/_Aquinatus_">Aquinatus</auteur>
<auteur lien="http://www.notre-ville.net">Cédric Morin</auteur>
<pipeline nom="build_pdf" inclure="article_pdf_pipelines.php" />
<lib nom="h5c1accba-fpdf17" lien="http://www.fpdf.org/fr/download/fpdf17.zip" />
</paquet>

834
pdf/lib_pdf_global.php

</
@ -0,0 +1,834 @@
<?php
/**
* class PDF extends FPDF : FPDF/tutoriel/tuto6.htm
*
* Février-Août 2003 : Jérôme Fenal (jerome.fenal@logicacmg.com)
* Ajout de la prise en compte des tableaux, tag <code>, et diverses autres choses de SPIP
*/
// Fichier de dump pour debug
define (DUMP_FILE_FULL_PATH_NAME,"Dump.txt");
class PDF extends FPDF
{
var $HREF;
var $texteAddSpace;
var $SRC;
var $columnProp=array(); # propriétés de la ligne
var $lineProp=array(); # propriétés de la ligne
var $inFirstRow; # flag si première ligne en cours
var $TableX; # abscisse du tableau
var $HeaderColor;
var $RowColors;
var $tableProp=array();
var $ProcessingBloc=0;
var $BlocContent=array();
var $BlocTags=array();
var $ProcessingTable=false; # =1 : en cours lecture table
var $ProcessingCadre=false; # =1 : en cours lecture contenu d'un cadre SPIP (TEXTAREA HTML)
var $tableCurrentCol; # numéro de cellule courante
var $tableCurrentRow; # Numero de ligne courante pendant la lecture d'un tableau
var $tableContent=array(); # Contenu de la table courante pendant son absorption. Non réentrant car SPIP ne permet pas de faire
# de table dans une autre table.
var $listDepth=0; # profondeur courante de liste à puce
var $listParm = array(); # paramètres des listes à puces en fonction du niveau
var $TopLinkIDArray = array(); #Sauve les IDs des liens internes (notes dans le texte)
var $TopLinkIDArrayIt = 0; #Itérateur dans le tableau des IDs des liens internes
var $BottomLinkIDArray = array(); #Sauve les IDs des liens internes (notes en fin de document)
var $BottomLinkIDArrayIt = 0; #Itérateur dans le tableau des IDs des liens internes
var $FirstIteration = TRUE; # booleen pour la génération des liens
var $CurrentTag=array();
function Build($OutputFileFullPathName)
{
$this->Open();
$this->BuildDocument() ;
$this->Output($OutputFileFullPathName);
$this->Close();
}
function AddCol($field=-1,$width=-1,$align='L')
{
//Ajoute une colonne au tableau
if($field==-1)
{
$field=count($this->columnProp);
}
$this->columnProp[$field]=array('f'=>$field,'w'=>$width,'a'=>$align);
#$this->Write(5, "Ajout de colonne : ".$field."/".$width."/".$align); $this->Ln();
}
function PDF($orientation='P', $unit='mm', $format='A4')
{
//Appel au constructeur parent
$this->FPDF($orientation, $unit, $format);
$this->SetCompression(1);
//$this->InitDumpFile();
$this->HREF='';
}
function unhtmlentities($string)
{
$trans_tbl = get_html_translation_table (HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
$ret = strtr ($string, $trans_tbl);
return preg_replace('/&#(\d+);/me', "chr('\\1')",$ret);
}
function WriteHTML($html,$LineFeedHeight)
{
$this->texteAddSpace=false;
//Parseur HTML, enlevé pour une meilleure récupération des tag.
//Il faut détecter les vraies balises "<" HTML et pas les < de texte "&lt;" HTML
//Parseur remis + loin pour l'édition du texte
//$html=$this->unhtmlentities($html);
$a=preg_split(',(<[/a-zA-Z].*>),Ums', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
// $a = le tableau de tags
// $i = index de l'élément courant
// $e = valeur de l'élément courant
foreach($a as $i=>$e)
{
//Balise
$Balise= preg_match(',<(?=[/a-zA-Z0-9])(/)?([/a-zA-Z0-9]+)((\s.*|/)?)>,',$e,$match);
if ($Balise){
$tag=strtoupper($match[2]);
$closing = $match[1]=="/";
if (($this->ProcessingBloc) AND (!in_array($tag,$this->BlocTags[$this->ProcessingBloc-1])))
$this->BlocContent[$this->ProcessingBloc-1] .= $e;
else {
if ($closing)
// C'est une balise fermante
$this->CloseTag($tag,$LineFeedHeight);
else
$this->OpenTag($tag,$e,$LineFeedHeight);
}
}
// Contenu
else {
if (!in_array('TEXTAREA',$this->CurrentTag))
$e=str_replace("\n",' ',$e);
if (strlen($e)){
$te = trim($e);
if (!$this->texteAddSpace)
$this->texteAddSpace = (strlen($te)==0) | ($e{0}!=$te{0});
$next_add_space = (strlen($te)==0) | (substr($e,-1)!=substr($te,-1));
$e = $te;
}
if(strlen($e)){
$e = $this->texteAddSpace?" $e":$e;
$this->texteAddSpace = $next_add_space;
# Attention, ce mécanisme ne permet pas de traiter les liens dans les tableaux...
# ni les tableaux dans les tableaux, d'ailleurs...
if (($this->ProcessingBloc))
$this->BlocContent[$this->ProcessingBloc-1] .= $e;
else
{
// C'est un lien. Il faut faire la distinction entre lien externe, lien interne et note de bas de page (couples ancre + lien interne)
if($this->HREF)
{
$Link=$this->HREF;
$Text=$e;
if ( strstr($Link,"http:") || strstr($Link,"mailto:") || strstr($Link,"ftp:") )
{
// C'est un lien externe
$this->PutLink($Link, $Text);
}
else
{
// C'est une note (référence dans le texte)
if ( strstr($Link,"#nb") )
{
if ($this->FirstIteration)
{
$LinkID=$this->AddLink();
$this->SetLink($LinkID,-1,-1);
$this->TopLinkIDArray[]=$LinkID;
$this->PutLink($Link,$Text); // Lien bidon (première itération)
}
else
{
$LinkID=$this->BottomLinkIDArray[$this->BottomLinkIDArrayIt++];
$this->PutLink($LinkID,$Text); // Bon lien (deuxième itération)
}
}
// C'est une note (détail de bas de texte)
else if ( strstr($Link,"#nh") )
{
// C'est le lien "#nh1" (le premier) : on met un trait séparateur
if ( strlen($Link)==4 && $Link[3]=="1" )
{
$this->SetLineWidth(0.3);
$this->Line($this->lMargin, $this->GetY()-5, $this->w - $this->rMargin, $this->GetY()-5);
}
if ($this->FirstIteration)
{
$LinkID=$this->AddLink();
$this->SetLink($LinkID,-1,-1);
$this->BottomLinkIDArray[]=$LinkID;
$this->PutLink($Link,$Text); // Lien bidon (première itération)
}
else
{
$LinkID=$this->TopLinkIDArray[$this->TopLinkIDArrayIt++];
$this->PutLink($LinkID,$Text); // Bon lien (deuxième itération)
}
}
// C'est un lien interne
else
{
$WebSiteURL=entites_html(lire_meta("adresse_site"));
// Bug d'interprétation du point d'interrogation remplacé par 3 points. Correctif ici
$Link=str_replace("...","?",$Link);
$this->PutLink($WebSiteURL . "/" . $Link, $Text);
}
}
} else
{
//Parseur remis ici
$e=$this->unhtmlentities($e);
$this->Write(5,$e);
}
}
}
}
}
}
function OpenTag($tag,$e,$LineFeedHeight)
{
$needclosing = true;
//Balise ouvrante
if ($tag=='B' || $tag=='U' || $tag=='I')
{
$this->SetStyle($tag,true);
}
if ($tag=='STRONG')
{
$this->SetStyle('B',true);
}
if ($tag=='EM')
{
$this->SetStyle('I',true);
}
if($tag=='A')
{
$this->HREF=extraire_attribut($e,'href');
$this->texteHREF="";
if ($this->texteAddSpace) {
$this->Write(5," ");
$this->texteAddSpace = false;
}
}
if($tag=='BR') {
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln($LineFeedHeight);
$needclosing = false;
$this->texteAddSpace = false;
}
if($tag=='P') {
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln(1.5*$LineFeedHeight);
$this->texteAddSpace = false;
}
if($tag=='DIV') {
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln(1*$LineFeedHeight);
$this->texteAddSpace = false;
}
if($tag=='CODE') {
// $this->Write(5,"<code>\n");
$this->SetFont('courier','', 8);
$this->SetTextColor(0, 0, 255);
#$this->ProcessingCadre=true;
#$this->ProcessingBloc++;
#$this->BlocTags[$this->ProcessingBloc-1]=array("CODE");
#$this->BlocContent[$this->ProcessingBloc-1]="";
}
if($tag=='H2')
{
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln($LineFeedHeight*3);
$this->SetStyle($tag='B',true,24);
$this->texteAddSpace = false;
}
if($tag=='H3')
{
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln($LineFeedHeight*3);
$this->SetStyle($tag='B',true,20);
$this->texteAddSpace = false;
}
if($tag=='H4')
{
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln($LineFeedHeight*3);
$this->SetStyle($tag='B',true,18);
$this->texteAddSpace = false;
}
if($tag=='H5')
{
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln($LineFeedHeight*3);
$this->SetStyle($tag='B',true,14);
$this->texteAddSpace = false;
}
if($tag=='H6')
{
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln($LineFeedHeight*3);
$this->SetStyle($tag='B',true,12);
$this->texteAddSpace = false;
}
if($tag=='UL' or $tag=='OL') {
$this->SetLeftMargin($this->lMargin+7);
$this->listDepth++;
$this->listParm[$this->listDepth]['type']=$tag;
$this->listParm[$this->listDepth]['curr']=0; # numéro si OL
}
if($tag=='LI'){
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln();
$this->listParm[$this->listDepth]['curr']++;
$this->SetX($this->GetX()-7);
if ($this->listParm[$this->listDepth]['type']=='OL')
$this->Cell(7,5,$this->listParm[$this->listDepth]['curr'].'.',0,0,'C');
else
$this->Cell(7,5,chr(149),0,0,'C');
}
if ($tag=='IMG') {
$this->SRC=extraire_attribut($e,'src');
//élimine les ?34423/ABC345 qui suive le nom de fichier
$this->SRC = preg_replace(',[?].*+$,','',$this->SRC);
// si l'image est manquante mettre un lien avec le texte alt
if (!@getimagesize($this->SRC)){
$alt = extraire_attribut($e,'alt');
if ($alt==NULL) {
$alt = $this->SRC;
}
if ($this->HREF=="" && $alt!=''){
$this->Write(5,"[$alt]");
} else {
$this->PutLink($this->HREF,"$alt");
}
spip_log('NO ? '.$e.' !@getimagesize pour'. $this->SRC.' alt ='.$alt,'article_pdf');
} else {
$size=getimagesize($this->SRC); # Attention, utilisation de GD !!! FPDF ne sait pas lire les images à moitié... et je n'ai pas envie de surcharger la méthode Image...
//Largeur && Hauteur
if ($size[0] < 30 && $size[1] < 30) {
# pixel / 3 pour avoir des cm. Petite cuisine...
$imgX=$size[0]/3;
$imgY=$size[1]/3;
$yoffset=$imgY/4;
if ($this->GetY() + $imgY > $this->h - $this->bMargin)
$this->AddPage();
$this->Image($this->SRC, $this->GetX(), $this->GetY()-$yoffset, $imgX, $imgY,'',$this->HREF);
$this->SetX($this->GetX()+$size[0]/2);
} else if ($size[0] < 600 && $size[1] < 600) {
$pwidth=$this->w-$this->lMargin-$this->rMargin;
$ratio = 0.24; # ce qui fait environ 600 pixels sur 16cm d'espace utile (160/600) - 2 pouillièmes
$imgX=$size[0]*$ratio;
$imgY=$size[1]*$ratio;
if ($this->GetY() + $imgY > $this->h - $this->bMargin) {
if ($this->GetY() + $imgY*0.8 > $this->h - $this->bMargin) {
$this->AddPage();
} else {
$imgX=$imgX*0.8;
$imgY=$imgY*0.8;
}
}
$this->Image($this->SRC, $this->GetX()+($pwidth-$imgX)/2, $this->GetY(), $imgX, $imgY,'',$this->HREF);
$this->SetY($this->GetY()+$imgY);
} else {
// les deux dimensions sont supérieurs à 600 pixels
$pwidth=$this->w-$this->lMargin-$this->rMargin;
$ratioX = $pwidth / $size[0];
$plen=$this->h-$this->GetY()-$this->bMargin-20; // on retire 20mm pour placer le cartouche de l'image
$ratioY = $plen / $size[1];
$ratio = 0.24; # ce qui fait environ 600 pixels sur 16cm d'espace utile (160/600) - 2 pouillièmes
$imgX=$size[0]*$ratio;
$imgY=$size[1]*$ratio;
if ($size[1] > 900 || ($plen - ($size[1]*$ratio) < 0)) {
if ($plen - ($size[1]*$ratio*0.8) < 0) {
$this->AddPage();
$plen=$this->h-$this->GetY()-$this->bMargin-20; // toujours la marge du cartouche
$ratioY = $plen / $size[1];
} else {
$ratioX *= 0.8;
$ratioY *= 0.8;
}
}
$ratio=min(0.24, $ratioX, $ratioY);
$imgX=$size[0]*$ratio;
$imgY=$size[1]*$ratio;
$this->Image($this->SRC, $this->GetX()+($pwidth-$imgX)/2, $this->GetY(), $imgX, $imgY,'',$this->HREF);
$this->SetY($this->GetY()+$imgY);
}
}
}
if($tag=='TT' or $tag=='TEXTAREA') {
$this->SetFont('courier','', 8);
$this->SetTextColor(255, 0, 0);
if ($tag=='TEXTAREA'){
$this->ProcessingCadre=true;
}
}
if($tag=='TABLE') {
$this->ProcessingTable=true;
$this->inFirstRow=1;
# on commence une table
if(!isset($this->tableProp['width']))
$this->tableProp['width']=0;
if($this->tableProp['width']==0)
$this->tableProp['width']=$this->w-$this->lMargin-$this->rMargin;
if(!isset($this->tableProp['align']))
$this->tableProp['align']='C';
if(!isset($this->tableProp['padding']))
$this->tableProp['padding']=$this->cMargin;
$cMargin=$this->cMargin;
$this->cMargin=$this->tableProp['padding'];
if(!isset($this->tableProp['HeaderColor']))
$this->tableProp['HeaderColor']=array(200, 200, 200);
$this->HeaderColor=$this->tableProp['HeaderColor'];
if(!isset($this->tableProp['color1']))
$this->tableProp['color1']=array();
if(!isset($this->tableProp['color2']))
$this->tableProp['color2']=array(230, 230, 230);
$this->RowColors=array($this->tableProp['color1'], $this->tableProp['color2']);
$this->tableCurrentRow=0;
}
if($tag=='TR') {
# on commence une ligne
$this->tableCurrentCol=0;
$this->tableCurrentRow++;
if (extraire_attribut($e,'class') == 'row_first') {
$this->ProcessingTH=true;
}
}
if($tag=='TH' or $tag=='TD') {
# Cellule (pas titre)
$this->tableCurrentCol += 1;
$colspan = extraire_attribut($e,'colspan');
if ($this->inFirstRow) {
if ($colspan)
for($i=0;$i<$colspan;$i++){
$this->nCols=$this->tableCurrentCol;
$this->AddCol();
}
else {
$this->nCols=$this->tableCurrentCol;
$this->AddCol();
}
}
$this->ProcessingBloc++;
$this->BlocTags[$this->ProcessingBloc-1]=array("TH","TD");
$this->BlocContent[$this->ProcessingBloc-1]="";
}
if($tag=='BLOCKQUOTE') {
$this->ProcessingBloc++;
$this->BlocTags[$this->ProcessingBloc-1]=array("BLOCKQUOTE");
$this->BlocContent[$this->ProcessingBloc-1]='';
}
if($tag=='TEXTAREA') {
$this->ProcessingBloc++;
$this->BlocTags[$this->ProcessingBloc-1]=array("TEXTAREA");
$this->BlocContent[$this->ProcessingBloc-1]="";
}
if($tag=='HR')
{
# Ligne horizontale
$this->SetLineWidth(0.3);
$this->Line($this->lMargin, $this->GetY(), $this->w - $this->rMargin, $this->GetY());
$needclosing = false;
$this->texteAddSpace = false;
}
if ((substr($e,-2)!="/>") && $needclosing)
$this->CurrentTag[]=$tag;
}
function CloseTag($tag,$LineFeedHeight)
{
if($tag=='B' || $tag=='U' || $tag=='I')
$this->SetStyle($tag,false);
if($tag=='STRONG')
$this->SetStyle('B',false);
if($tag=='EM')
$this->SetStyle('I',false);
if($tag=='A'){
$this->HREF='';
}
if($tag=='P'){
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln($LineFeedHeight);
}
if($tag=='CODE') {
$this->ProcessingCadre=false;
if (strlen($content=$this->BlocContent[$this->ProcessingBloc-1])){
$this->ProcessingBloc--;
$this->BlocShow(0,$content,1,$LineFeedHeight);
}
$this->SetTextColor(0);
$this->SetFont('helvetica','',10);
// $this->Write(5,"\n<\code>");
}
if(($tag=='H2') OR ($tag=='H3') OR ($tag=='H4') OR ($tag=='H5') OR ($tag=='H6')){
$this->SetStyle($tag='B',false,10);
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln($LineFeedHeight);
}
if($tag=='UL' or $tag=='OL') {
$this->SetLeftMargin($this->lMargin-7);
$this->maxLineWidth = max($this->maxLineWidth,$this->x);
$this->Ln();
$this->listParm[$this->listDepth]=array();
$this->listDepth--;
}
if($tag=='TT') {
$this->SetFont('helvetica','',10);
$this->SetTextColor(0);
}
if($tag=='TD' or $tag=='TH') {
if (!strlen($this->BlocContent[$this->ProcessingBloc-1]))
$this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['content']=" ";
else
$this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['content']=$this->BlocContent[$this->ProcessingBloc-1];
if ($tag=='TH')
$this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['TH']=1;
else
$this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['TH']=0;
$this->ProcessingBloc--;
}
if($tag=='TR') {
$this->inFirstRow=0; # on a fini une ligne donc la première aussi
}
if($tag=='TABLE') {
$this->TableShow('C',$LineFeedHeight);
$this->inFirstRow=0;
$this->ProcessingTable=false;
$this->cMargin=$cMargin;
$this->columnProp=array();
$this->tableContent=array();
}
if($tag=='BLOCKQUOTE') {
if (strlen($content=$this->BlocContent[$this->ProcessingBloc-1])){
$this->ProcessingBloc--;
$this->BlocShow(10,$content,1,$LineFeedHeight);