Bonjour

Je souhaiterai ouvrir un fichier .svg, et l'exporter dans un fchier pdf. Pour celà j'utilise cairo et librsvg.
J'ai suivi un exemple (svg2pdf) pour ecrire mon svg dans un pdf :

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
int main(int argc, char **argv)
{
  cairo_surface_t *surface;  
  cairo_t *cr;
 
  RsvgHandle *rsvg;
 
  int width = 600;
  int height = 800;
 
  /* Clreate PDF */
  surface = cairo_pdf_surface_create ("test.pdf", width, height);
  cr = cairo_create (surface);
 
  /* Clear background */
  cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
  cairo_paint (cr);
 
  rsvg_init ();
 
  rsvg = rsvg_handle_new_from_file ("../ressources/img_symbole/etoile.svg", NULL);
 
  rsvg_handle_render_cairo (rsvg, cr);
 
  cairo_destroy (cr);
  cairo_surface_destroy (surface); 
 
  return 0;
}
ça marche, mais le souci c'est que je ne peu pas préciser les coordonnées pour placer mon images. (même en mettant un cairo_move_to() juste avant le rsvg_handle_render_cairo() ).

J'ai donc essayé de passé par une surface intermédiaire, dans laquelle sera dessiné le svg (en coordonnée 0,0) puis je rajoute cette surface à ma surface pdf aux bonnes coordonnées :

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
  cairo_surface_t *surface;  
  cairo_surface_t *g_surface;
  cairo_t *cr;
  cairo_t *g_cr;
 
  RsvgDimensionData dim;
  RsvgHandle *rsvg;
 
  int width = 600;
  int height = 800;
 
  /* Clreate PDF */
  surface = cairo_pdf_surface_create ("test.pdf", width, height);
  cr = cairo_create (surface);
 
  /* Clear background */
  cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
  cairo_paint (cr);
 
  rsvg_init ();
 
  rsvg = rsvg_handle_new_from_file ("../ressources/img_symbole/etoile.svg", NULL);
  rsvg_handle_get_dimensions (rsvg, &dim); 
 
  /* Je creer une nouvelle surface intermediaire */
  g_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, dim.width, dim.height);
  g_cr = cairo_create (g_surface);
 
  /* Je dessine dans cette nouvelle surface */
  rsvg_handle_render_cairo (rsvg, g_cr);
 
  /* Je rajoute ma nouvelle surface au prmeier contexte */
  cairo_set_source_surface (cr, g_surface, 100, 100);
  cairo_paint (cr);
 
  cairo_destroy (g_cr);
  cairo_surface_destroy (g_surface);
 
  cairo_destroy (cr);
  cairo_surface_destroy (surface);
ça marche, SAUF que le dessin devient pixélisé et moi j'ai besoin du dessin vectoriel ou sinon ça sert à rien d'utiliser du svg.

quelqu'un a une piste ? une solution ? un exemple ?

Merci d'avance