Le code a des variables paramétrables en tête du script, pour déterminer l’amplitude des lignes, le nombre de pages, les marges du dessin, l’auteur du livre...

Chaque dessin est accompagné d’une numérotation de page, du décompte du nombre de lignes et du temps d’exécution du dessin.
//
// Livre aleatoire - octobre 2010
//
import processing.pdf.*;
PGraphicsPDF pdf;
PFont myFont;
// parametres du dessin, changer pour affiner
int nbpages=40; // nombre de pages
int marge=100; // marges à respecter
int deplacement=8; // déplacement maximum entre deux iterations
String auteur="Stéphane Noel";
// variable du script
float posx,posy,p_posx,p_posy;
int compteur=1;
int nbsquare=0;
int startmillis=0;
void setup() {
size(594, 594);
//String[] fontList = PFont.list();
//println(fontList);
myFont = createFont("Aller-Light", 24); // police gratuite : http://www.fontsquirrel.com/fonts/Aller
textFont(myFont,24);
pdf = (PGraphicsPDF)beginRecord(PDF, "randomlinesbook.pdf"); // titre du pdf
beginRecord(pdf);
background(255);
positionnebloc(); // nouvelle position de départ du dessin
commencelivre(); // appelle la fonction qui cree la couverture
fill(255);
stroke(10);
numerotation();
}
void draw() {
fill(255);
line(posx,posy,p_posx,p_posy);
p_posx=posx;
p_posy=posy;
nbsquare++;
posx+=random(-deplacement,deplacement);
posy+=random(-deplacement,deplacement);
if(posx > width-marge || posx < marge || posy > height-marge || posy < marge) { // si la ligne sort de la zone
fill(0);
affichenbsquare(); afficher le nombre de lignes et le temps d'execution
compteur++;
fill(255);
pdf.nextPage();
if(compteur < nbpages) {
background(255);
positionnebloc(); // nouvelle position de départ du dessin
nbsquare=0;
numerotation();
}
else { // si le nombre de page est atteint
finitlivre(); // genere la couverture arriere
endRecord();
exit(); // Quitte
}
}
}
void positionnebloc() {
p_posx=posx=random(width*0.45,width*0.55);
p_posy=posy=random(height*0.45,width*0.55);
}
void numerotation() {
float ty=height-(marge/2);
textFont(myFont,8);
fill(0);
textAlign(LEFT);
text("Page " + compteur,marge,ty);
}
void affichenbsquare() {
// calcule le temps de réalisation
int duree=millis()-startmillis;
float ty=height-(marge/2);
textFont(myFont,8);
fill(0);
textAlign(RIGHT);
text(duree/1000+ " secondes, " + nbsquare + " formes",width-marge,ty);
startmillis=millis();
}
void commencelivre() { // cree la couverture
fill(0);
textAlign(CENTER);
textFont(myFont,30);
text("The random line book",width/2,(height/2)-30);
textFont(myFont,18);
text(auteur,width/2,(height/2)+30);
pdf.nextPage();
pdf.nextPage();
background(255);
}
void finitlivre() {
pdf.nextPage(); // une page blanche
fill(0);
// cree une page avec la date de création
textAlign(LEFT);
String texte="\nCe livre a été entièrement généré par un script.\n\nChacun de ses dessins part de la zone centrale de la page, et est composé de traits d'une longueur de "
+ (deplacement*25.1)/72 +" millimètres maximum dans n'importe quelle direction, à partir du trait précédent."
+" Chaque dessin s'arrete lorsque le bord de la zone de dessin est touché.\n\n"
+"Ce livre est composé de "+ nbpages +" pages. Il a été généré le "+day() +"/"+month()+"/"+year()+" à "+hour()+":"+minute()+".";
textFont(myFont,12);
text(texte,marge,marge+12,width-(marge*2),height-(marge*2));
textFont(myFont,10);
text(auteur,marge,height-(marge+12));
}
void keyPressed() { // pour interrompre n'importe quand (garde-fou)
affichenbsquare();
pdf.nextPage();
pdf.nextPage();
finitlivre();
endRecord();
exit(); // Quit
}