svg 2 pdf

    由于公司项目需要,需要将svg转换成pdf,要求原样转换,即为矢量存储为pdf。

    svg2pdf采用的是rsvg + cairo,两大开源库进行转换的,其中依赖库比较多,如下包括:

    cairo,gdk-pixbuf,glib,jasper,jpeg,libcroco,libiconv,libintl,libpng,librsvg,libxml2,pango,pcre,pixman,tiff,zlib;

    上诉大部分需要自己编译成windows下的dll和lib库文件,这里就不讲述如何在windows下编译了,直接贴代码,如下:

 1 /***********************************************
 2 * Copyright (c) *** Corporation
 3 * Author: panliang(divels@qq.com)
 4 * Abstract: svg to pdf
 5 * Time: 2017.03.31
 6 ***********************************************/
 7 
 8 #include <stdio.h>
 9 #include <stdlib.h>
10 #include <rsvg.h>
11 #include <rsvg-cairo.h>
12 #include <cairo.h>
13 #include <cairo-pdf.h>
14 #include <cairo-win32.h>
15 //#include <pango/pangocairo.h> 
16 //#include <glib.h>
17 
18 #include "svg2pdf.h"
19 
20 #define FAIL(msg)                            \
21     do { fprintf (stderr, "FAIL: %s\n", msg); exit (-1); } while (0)
22 
23 bool svg2pdf(const char *infile, const char *outfile, char *errormsg)
24 {
25     GError *error = NULL;
26     RsvgHandle *handle;
27     RsvgDimensionData dim;
28     double width, height;
29     const char *filename = infile;
30     const char *output_filename = outfile;
31     cairo_surface_t *surface;
32     cairo_t *cr;
33     cairo_status_t status;
34     BOOL res = true;
35 
36     //g_type_init ();
37 
38     rsvg_set_default_dpi(72.0);
39     handle = rsvg_handle_new_from_file(filename, &error);
40     if (error != NULL)
41     {
42         res = false;
43         FAIL(error->message);
44         sprintf(errormsg, "Error : %s.", error->message);
45     }
46     rsvg_handle_get_dimensions(handle, &dim);
47     width = dim.width;
48     height = dim.height;
49 
50     surface = cairo_pdf_surface_create(output_filename, width, height);
51     cairo_pdf_surface_set_size(surface, 350, 320);
52     cr = cairo_create(surface);
53 
54     rsvg_handle_render_cairo(handle, cr);
55 
56     status = cairo_status(cr);
57     if (status)
58     {
59         FAIL(cairo_status_to_string(status));
60         res = false;
61         sprintf(errormsg, "Error : %s", cairo_status_to_string(status));
62     }
63     else
64     {
65         sprintf(errormsg, "svg transfer pdf is successed.");
66     }
67 
68     cairo_destroy(cr);
69     cairo_surface_destroy(surface);
70     return res;
71 }

    以上代码已通过本人的测试。

    附上 source codes url:https://github.com/panliang505/svg2pdf.git

posted @ 2017-03-31 14:26  潘三爷  阅读(1710)  评论(0编辑  收藏  举报