因爲公司項目須要,須要將svg轉換成pdf,要求原樣轉換,即爲矢量存儲爲pdf。git
svg2pdf採用的是rsvg + cairo,兩大開源庫進行轉換的,其中依賴庫比較多,以下包括:github
cairo,gdk-pixbuf,glib,jasper,jpeg,libcroco,libiconv,libintl,libpng,librsvg,libxml2,pango,pcre,pixman,tiff,zlib;windows
上訴大部分須要本身編譯成windows下的dll和lib庫文件,這裏就不講述如何在windows下編譯了,直接貼代碼,以下:svg
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.giturl