Processing 2 : un livre illustré

Le but de cet exercice est de produire un livre de 24 pages, couverture comprise, d’un format A4 ou A5 fermé. Il devra comporter du texte et de l’image générée à partir de ce texte.

Précédent | 3/3

PDF et nextpage()

Il s’agira donc de mélanger du texte et de le combiner avec du dessin. Sous quelle forme, et quel texte ? C’est à vous de trouver.
A partir du moment où des choix sont faits, on mettra en action la librairie de génération de PDF de Processing, pour créer une couverture, un dos de couverture, et 20 pages intérieures.

Poèmes, littérature, texte scientifique

Grâce à la fonction loadStrings(), on a vu qu’on pouvait lire ligne par ligne un texte. Une vingtaines de portions de texte sont donc à trouver. Les poèmes peuvent être une source, mais d’autres sources sont aussi possibles, comme un extrait de texte, un pamphlet, une liste de courses, ou de dictons, ou des statistiques, etc.

Lignes et formes

De leur côté, les dessins doivent avoir un lien avec le texte. Le texte est un ensemble de lettres, des lignes, de mots, et chacun a des valeurs numériques. A vous de voir ce que vous pouvez en faire.

Timing

Ce travail devra être remis sous la forme d’un livre agrafé le jour de l’examen théorique.

Un script de base

Un exemple de script écrivant un pdf de 24 pages, commenté.

// base de script
import processing.pdf.*;

PGraphicsPDF pdf;
PFont mapolice;
int compteur=0;

void setup() {
 size(595, 842); // A4 vertical en 72 dpi

 // démarrer l'enregistrement du pdf
 pdf = (PGraphicsPDF)beginRecord(PDF, "un_livre.pdf");
 fill(0);
 mapolice=createFont("impact", 14);
 textFont(mapolice);
 // dessiner la couverture avant
 couverture_avant();
 // démarrer le comptage à 3
 compteur+=3;
}

void draw() {
 background(255);
 dessine_page(compteur+""); // compteur est un chiffre, on le transforme en string en lui ajoutant du texte

 pdf.nextPage();
 compteur++;

 // si le nombre de pages intérieures est atteint
 // ajouter la couverture arrière et cloturer le pdf
 if (compteur > 22) {
   couverture_arriere();
   endRecord();
   exit();
 }
}

// dessiner le contenu d'un page
void dessine_page(String texte) {
 textAlign(CENTER, CENTER);
 fill(0);
 text(texte, width/2, height/2);
}

// dessin de la couverture avant
void couverture_avant() {
 fill(0);
 textSize(40);
 textAlign(CENTER, CENTER);

 // couverture avant
 text("Titre du livre", width/2, height*0.4);
 pdf.nextPage();

 // deuxième de couverture
 textSize(14);
 text("deuxième de couverture", width/2, height/2);

 pdf.nextPage();
}

void couverture_arriere() {
 textAlign(CENTER, CENTER);
 fill(0);
 textSize(14);

 // Troisième de couverture
 text("Troisième de couverture", width/2, height/2);
 pdf.nextPage();

 // dernière page
 textSize(40);
 text("Page arrière", width/2, height*0.4);
}

Une variante avec du texte et while

Cette variante utilise charge un texte ( à fournir dans le script) et la fonction while qui crée autant de page que nécessaire.

// base de script
import processing.pdf.*;

PGraphicsPDF pdf;
PFont mapolice;
String[] texte;
boolean texte_fini=false;
int compteur=0;
int marges=50;
String titre="L'albatros";
String auteur="Charles Baudelaire";
String texte_arriere="Charles Baudelaire, 1861";

void setup() {
 size(595, 842); // A4 vertical en 72 dpi

 texte=loadStrings("albatros.txt");
 println("Le texte comporte "+texte.length);

 // démarrer l'enregistrement du pdf
 pdf = (PGraphicsPDF)beginRecord(PDF, "un_livre.pdf");
 fill(0);
 mapolice=createFont("Montserrat-Light", 14);
 textFont(mapolice);
 // dessiner la couverture avant
 couverture_avant();
 background(255);
}

void draw() {
 textAlign(TOP, LEFT);
 textSize(20);
 fill(0);
 boolean fini=false;
 while (fini==false) {
   background(255);
   String ligne=texte[compteur];
   if (ligne.length() > 0) {
     text(ligne, random(marges, width-marges-(width/3)), random(marges, height-marges-(height/4)), width/3, height/4);
     // et autre chose éventuellement

     pdf.nextPage();
   } else {
     // ligne vide: ajouter une page
     pdf.nextPage();
   }
   compteur++;
   if (compteur >= texte.length) {
     fini=true;
   }
 }
 couverture_arriere();
  endRecord();
  exit();
}

// dessin de la couverture avant
void couverture_avant() {
 fill(0);
 textSize(40);
 textAlign(CENTER, CENTER);

 // couverture avant
 text(titre, width/2, height*0.4);
 textSize(20);
 text(auteur, width/2, height*0.9);
 pdf.nextPage();

 // deuxième de couverture
 pdf.nextPage();
}

void couverture_arriere() {
 textAlign(CENTER, CENTER);
 fill(0);
 textSize(14);

 // Troisième de couverture
 pdf.nextPage();

 // dernière page
 textSize(20);
 text(texte_arriere, width/2, height*0.4);
}