Salux !

Ma question va certainement se terminer en RTFM, dans ce cas merci de me donner le lien, j'ai toujours pas trouvé ce fucking manual...

Je génère une série de graphiques que j'exporte aussitôt dans un fichier PDF. Petite précision, le PDF en question ne contient aucun texte, seulement ces graphiques.

Pourtant, lors de la génération, iText lève une exception de manière totalement aléatoire (la majorité du temps il n'y a pas de problème), avec les mêmes graphiques, et ce concernant n'importe quel graphique...

Bref, l'exception me retourne ce message :
Unbalanced save/restore state operators.
J'ai cherché sur Google, les fonctions saveState() et restoreState() de PdfContentByte doivent être exécutées le même nombre de fois, or je ne les appelle jamais...

Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
 * Génération du PDF
 */
// dimensions de la page
int width = 840, height = 594;
// marges
int vmargin = 20, hmargin = 20;
Rectangle pageSize = new Rectangle( width, height );
Document pdfout = new Document( pageSize );
PdfWriter writer = PdfWriter.getInstance( pdfout, new FileOutputStream( path ) );
pdfout.open();
pdfout.addTitle( "CA par catégorie" );
 
PdfContentByte cb = writer.getDirectContent();
 
// le cadre dans lequel on va dessiner prend toute la page...
Graphics2D g2 = cb.createGraphics( width, height );
 
// ... mais le graphique compense avec les marges
Rectangle2D rec = new Rectangle2D.Double( hmargin, vmargin, width - 2 * hmargin, height - 2 * vmargin );
chart.draw( g2, rec );
 
progress.setValue( 1 );
 
try
{
	if( graph )
	{
		for( i = 0; i < catNames.size(); i++ )
		{
			pdfout.newPage();
 
			cb.beginText();
			cb.setFontAndSize( BaseFont.createFont( BaseFont.TIMES_ROMAN, "UTF-8", false ), 12 );
			g2 = cb.createGraphics( width, height );
			rec = new Rectangle2D.Double( hmargin, vmargin, width - 2 * hmargin, height - 2 * vmargin );
			chronoChart[i].draw( g2, rec );
 
			progress.setValue( i + 1 );
		}
	}
 
	g2.dispose();
} catch( Exception e )
{
	System.out.println( e.getMessage() );
}
 
pdfout.close();
Note : progress est une barre de progression.
Note2 : j'ai du bricoler certaines lignes pour que ça marche, si le problème vient de là, signalez-le moi