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 :
ç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() ).
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; }
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 :
ç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.
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);
quelqu'un a une piste ? une solution ? un exemple ?
Merci d'avance
Partager