|
33 | 33 | // Begin theft from ePDFview (Copyright (C) 2006 Emma's Software) under the GPL
|
34 | 34 | gchar *getAbsoluteFileName(const gchar *fileName)
|
35 | 35 | {
|
36 |
| - gchar *absoluteFileName = NULL; |
37 |
| - if (g_path_is_absolute(fileName)) { |
38 |
| - absoluteFileName = g_strdup(fileName); |
39 |
| - } |
40 |
| - else { |
41 |
| - gchar *currentDir = g_get_current_dir(); |
42 |
| - absoluteFileName = g_build_filename(currentDir, fileName, NULL); |
43 |
| - g_free(currentDir); |
44 |
| - } |
45 |
| - return absoluteFileName; |
| 36 | + gchar *absoluteFileName = NULL; |
| 37 | + if (g_path_is_absolute(fileName)) |
| 38 | + { |
| 39 | + absoluteFileName = g_strdup(fileName); |
| 40 | + } |
| 41 | + else |
| 42 | + { |
| 43 | + gchar *currentDir = g_get_current_dir(); |
| 44 | + absoluteFileName = g_build_filename(currentDir, fileName, NULL); |
| 45 | + g_free(currentDir); |
| 46 | + } |
| 47 | + return absoluteFileName; |
46 | 48 | }
|
47 | 49 | // End theft from ePDFview
|
48 | 50 |
|
49 | 51 |
|
50 |
| -int convertPage(PopplerPage *page, const char* svgFilename) |
| 52 | +int convertPage(PopplerPage *page, const char* svgFilename, double dpi) |
51 | 53 | {
|
52 |
| - // Poppler stuff |
53 |
| - double width, height; |
54 |
| - |
55 |
| - // Cairo stuff |
56 |
| - cairo_surface_t *surface; |
57 |
| - cairo_t *drawcontext; |
58 |
| - |
59 |
| - if (page == NULL) { |
60 |
| - fprintf(stderr, "Page does not exist\n"); |
61 |
| - return -1; |
62 |
| - } |
63 |
| - poppler_page_get_size (page, &width, &height); |
64 |
| - |
65 |
| - // Open the SVG file |
66 |
| - surface = cairo_svg_surface_create(svgFilename, width, height); |
67 |
| - drawcontext = cairo_create(surface); |
68 |
| - |
69 |
| - // Render the PDF file into the SVG file |
70 |
| - poppler_page_render_for_printing(page, drawcontext); |
71 |
| - cairo_show_page(drawcontext); |
72 |
| - |
73 |
| - // Close the SVG file |
74 |
| - cairo_destroy(drawcontext); |
75 |
| - cairo_surface_destroy(surface); |
76 |
| - |
77 |
| - // Close the PDF file |
78 |
| - g_object_unref(page); |
79 |
| - |
80 |
| - return 0; |
| 54 | + // Poppler stuff |
| 55 | + double width, height; |
| 56 | + |
| 57 | + // Cairo stuff |
| 58 | + cairo_surface_t *surface; |
| 59 | + cairo_t *drawcontext; |
| 60 | + |
| 61 | + if (page == NULL) |
| 62 | + { |
| 63 | + fprintf(stderr, "Page does not exist\n"); |
| 64 | + return -1; |
| 65 | + } |
| 66 | + poppler_page_get_size (page, &width, &height); |
| 67 | + |
| 68 | + // Use DPI |
| 69 | + double dpi_ratio = dpi / 72.0; |
| 70 | + |
| 71 | + // Open the SVG file |
| 72 | + surface = cairo_svg_surface_create(svgFilename, width * dpi_ratio, height * dpi_ratio); |
| 73 | + drawcontext = cairo_create(surface); |
| 74 | + |
| 75 | + // Use DPI |
| 76 | + cairo_scale(drawcontext, dpi_ratio, dpi_ratio); |
| 77 | + |
| 78 | + // Render the PDF file into the SVG file |
| 79 | + poppler_page_render_for_printing(page, drawcontext); |
| 80 | + cairo_show_page(drawcontext); |
| 81 | + |
| 82 | + // Close the SVG file |
| 83 | + cairo_destroy(drawcontext); |
| 84 | + cairo_surface_destroy(surface); |
| 85 | + |
| 86 | + // Close the PDF file |
| 87 | + g_object_unref(page); |
| 88 | + |
| 89 | + return 0; |
81 | 90 | }
|
82 | 91 |
|
83 | 92 | int main(int argn, char *args[])
|
84 | 93 | {
|
85 |
| - // Poppler stuff |
86 |
| - PopplerDocument *pdffile; |
87 |
| - PopplerPage *page; |
88 |
| - |
89 |
| - // Initialise the GType library |
90 |
| - g_type_init (); |
91 |
| - |
92 |
| - // Get command line arguments |
93 |
| - if ((argn < 3)||(argn > 4)) { |
94 |
| - printf("Usage: pdf2svg <in file.pdf> <out file.svg> [<page no>]\n"); |
95 |
| - return -2; |
96 |
| - } |
97 |
| - gchar *absoluteFileName = getAbsoluteFileName(args[1]); |
98 |
| - gchar *filename_uri = g_filename_to_uri(absoluteFileName, NULL, NULL); |
99 |
| - gchar *pageLabel = NULL; |
100 |
| - |
101 |
| - char* svgFilename = args[2]; |
102 |
| - |
103 |
| - g_free(absoluteFileName); |
104 |
| - if (argn == 4) { |
105 |
| - // Get page number |
106 |
| - pageLabel = g_strdup(args[3]); |
107 |
| - } |
108 |
| - |
109 |
| - // Open the PDF file |
110 |
| - pdffile = poppler_document_new_from_file(filename_uri, NULL, NULL); |
111 |
| - g_free(filename_uri); |
112 |
| - if (pdffile == NULL) { |
113 |
| - fprintf(stderr, "Unable to open file\n"); |
114 |
| - return -3; |
115 |
| - } |
116 |
| - |
117 |
| - int conversionErrors = 0; |
118 |
| - // Get the page |
119 |
| - |
120 |
| - if(pageLabel == NULL) { |
121 |
| - page = poppler_document_get_page(pdffile, 0); |
122 |
| - conversionErrors = convertPage(page, svgFilename); |
123 |
| - } |
124 |
| - else { |
125 |
| - if(strcmp(pageLabel, "all") == 0) { |
126 |
| - int curError; |
127 |
| - int pageCount = poppler_document_get_n_pages(pdffile); |
128 |
| - |
129 |
| - if(pageCount > 9999999) { |
130 |
| - fprintf(stderr, "Too many pages (>9,999,999)\n"); |
131 |
| - return -5; |
132 |
| - } |
133 |
| - |
134 |
| - size_t svgFilenameBufLen = strlen(svgFilename) + 1; |
135 |
| - char *svgFilenameBuffer = (char*)malloc(svgFilenameBufLen); |
136 |
| - assert(svgFilenameBuffer != NULL); |
137 |
| - |
138 |
| - int pageInd; |
139 |
| - for(pageInd = 0; pageInd < pageCount; pageInd++) { |
140 |
| - while (1) { |
141 |
| - size_t _wr_len = snprintf(svgFilenameBuffer, svgFilenameBufLen, svgFilename, pageInd + 1); |
142 |
| - if (_wr_len >= svgFilenameBufLen) { |
143 |
| - svgFilenameBufLen = _wr_len + 1; |
144 |
| - svgFilenameBuffer = (char*)realloc(svgFilenameBuffer, svgFilenameBufLen); |
145 |
| - assert(svgFilenameBuffer != NULL); |
146 |
| - continue; |
147 |
| - } |
148 |
| - break; |
149 |
| - } |
150 |
| - |
151 |
| - page = poppler_document_get_page(pdffile, pageInd); |
152 |
| - curError = convertPage(page, svgFilenameBuffer); |
153 |
| - if(curError != 0) |
154 |
| - conversionErrors = -1; |
155 |
| - } |
156 |
| - free(svgFilenameBuffer); |
157 |
| - } |
158 |
| - else { |
159 |
| - page = poppler_document_get_page_by_label(pdffile, pageLabel); |
160 |
| - conversionErrors = convertPage(page, svgFilename); |
161 |
| - g_free(pageLabel); |
162 |
| - } |
163 |
| - } |
164 |
| - |
165 |
| - g_object_unref(pdffile); |
166 |
| - |
167 |
| - if(conversionErrors != 0) { |
168 |
| - return -4; |
169 |
| - } |
170 |
| - else { |
171 |
| - return 0; |
172 |
| - } |
| 94 | + // Poppler stuff |
| 95 | + PopplerDocument *pdffile; |
| 96 | + PopplerPage *page; |
| 97 | + double dpi = 72.0; |
| 98 | + |
| 99 | + // Initialise the GType library |
| 100 | + g_type_init (); |
| 101 | + |
| 102 | + // Get command line arguments |
| 103 | + if ((argn < 3)||(argn > 5)) |
| 104 | + { |
| 105 | + printf("Usage: pdf2svg <in file.pdf> <out file.svg> [<dpi=72>] [<page no>]\n"); |
| 106 | + return -2; |
| 107 | + } |
| 108 | + gchar *absoluteFileName = getAbsoluteFileName(args[1]); |
| 109 | + gchar *filename_uri = g_filename_to_uri(absoluteFileName, NULL, NULL); |
| 110 | + gchar *pageLabel = NULL; |
| 111 | + |
| 112 | + char* svgFilename = args[2]; |
| 113 | + |
| 114 | + g_free(absoluteFileName); |
| 115 | + if (argn > 3) |
| 116 | + { |
| 117 | + // Get DPI |
| 118 | + dpi = atof(args[3]); |
| 119 | + } |
| 120 | + if (argn > 4) |
| 121 | + { |
| 122 | + // Get page number |
| 123 | + pageLabel = g_strdup(args[4]); |
| 124 | + } |
| 125 | + |
| 126 | + // Open the PDF file |
| 127 | + pdffile = poppler_document_new_from_file(filename_uri, NULL, NULL); |
| 128 | + g_free(filename_uri); |
| 129 | + if (pdffile == NULL) |
| 130 | + { |
| 131 | + fprintf(stderr, "Unable to open file\n"); |
| 132 | + return -3; |
| 133 | + } |
| 134 | + |
| 135 | + int conversionErrors = 0; |
| 136 | + // Get the page |
| 137 | + |
| 138 | + if(pageLabel == NULL) |
| 139 | + { |
| 140 | + page = poppler_document_get_page(pdffile, 0); |
| 141 | + conversionErrors = convertPage(page, svgFilename, dpi); |
| 142 | + } |
| 143 | + else |
| 144 | + { |
| 145 | + if(strcmp(pageLabel, "all") == 0) |
| 146 | + { |
| 147 | + int curError; |
| 148 | + int pageCount = poppler_document_get_n_pages(pdffile); |
| 149 | + |
| 150 | + if(pageCount > 9999999) |
| 151 | + { |
| 152 | + fprintf(stderr, "Too many pages (>9,999,999)\n"); |
| 153 | + return -5; |
| 154 | + } |
| 155 | + |
| 156 | + size_t svgFilenameBufLen = strlen(svgFilename) + 1; |
| 157 | + char *svgFilenameBuffer = (char*)malloc(svgFilenameBufLen); |
| 158 | + assert(svgFilenameBuffer != NULL); |
| 159 | + |
| 160 | + int pageInd; |
| 161 | + for(pageInd = 0; pageInd < pageCount; pageInd++) |
| 162 | + { |
| 163 | + while (1) |
| 164 | + { |
| 165 | + size_t _wr_len = snprintf(svgFilenameBuffer, svgFilenameBufLen, svgFilename, pageInd + 1); |
| 166 | + if (_wr_len >= svgFilenameBufLen) |
| 167 | + { |
| 168 | + svgFilenameBufLen = _wr_len + 1; |
| 169 | + svgFilenameBuffer = (char*)realloc(svgFilenameBuffer, svgFilenameBufLen); |
| 170 | + assert(svgFilenameBuffer != NULL); |
| 171 | + continue; |
| 172 | + } |
| 173 | + break; |
| 174 | + } |
| 175 | + |
| 176 | + page = poppler_document_get_page(pdffile, pageInd); |
| 177 | + curError = convertPage(page, svgFilenameBuffer, dpi); |
| 178 | + if(curError != 0) |
| 179 | + conversionErrors = -1; |
| 180 | + } |
| 181 | + free(svgFilenameBuffer); |
| 182 | + } |
| 183 | + else |
| 184 | + { |
| 185 | + page = poppler_document_get_page_by_label(pdffile, pageLabel); |
| 186 | + conversionErrors = convertPage(page, svgFilename, dpi); |
| 187 | + g_free(pageLabel); |
| 188 | + } |
| 189 | + } |
| 190 | + |
| 191 | + g_object_unref(pdffile); |
| 192 | + |
| 193 | + if(conversionErrors != 0) |
| 194 | + { |
| 195 | + return -4; |
| 196 | + } |
| 197 | + else |
| 198 | + { |
| 199 | + return 0; |
| 200 | + } |
173 | 201 |
|
174 | 202 | }
|
0 commit comments