You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
4.5 KiB
174 lines
4.5 KiB
// Copyright (C) 2007 David Barton (davebarton@cityinthesky.co.uk) |
|
// <http://www.cityinthesky.co.uk/> |
|
|
|
// Copyright (C) 2007 Matthew Flaschen (matthew.flaschen@gatech.edu) |
|
// Updated to allow conversion of all pages at once. |
|
|
|
// This program is free software: you can redistribute it and/or modify |
|
// it under the terms of the GNU General Public License as published by |
|
// the Free Software Foundation, either version 2 of the License, or |
|
// (at your option) any later version. |
|
// |
|
// This program is distributed in the hope that it will be useful, |
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
// GNU General Public License for more details. |
|
// |
|
// You should have received a copy of the GNU General Public License |
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
// Definitely works with Cairo v1.2.6 and Poppler 0.5.4 |
|
|
|
#include "glib.h" |
|
#include "glib/poppler.h" |
|
#include "glib/poppler-document.h" |
|
#include "glib/poppler-page.h" |
|
#include "cairo.h" |
|
#include "cairo-svg.h" |
|
|
|
#include <stdlib.h> |
|
#include <stdio.h> |
|
#include <string.h> |
|
|
|
// Begin theft from ePDFview (Copyright (C) 2006 Emma's Software) under the GPL |
|
gchar *getAbsoluteFileName(const gchar *fileName) |
|
{ |
|
gchar *absoluteFileName = NULL; |
|
if (g_path_is_absolute(fileName)) { |
|
absoluteFileName = g_strdup(fileName); |
|
} |
|
else { |
|
gchar *currentDir = g_get_current_dir(); |
|
absoluteFileName = g_build_filename(currentDir, fileName, NULL); |
|
g_free(currentDir); |
|
} |
|
return absoluteFileName; |
|
} |
|
// End theft from ePDFview |
|
|
|
|
|
int convertPage(PopplerPage *page, const char* svgFilename) |
|
{ |
|
// Poppler stuff |
|
double width, height; |
|
|
|
// Cairo stuff |
|
cairo_surface_t *surface; |
|
cairo_t *drawcontext; |
|
|
|
if (page == NULL) { |
|
fprintf(stderr, "Page does not exist\n"); |
|
return -1; |
|
} |
|
poppler_page_get_size (page, &width, &height); |
|
|
|
// Open the SVG file |
|
surface = cairo_svg_surface_create(svgFilename, width, height); |
|
drawcontext = cairo_create(surface); |
|
|
|
// Render the PDF file into the SVG file |
|
poppler_page_render(page, drawcontext); |
|
cairo_show_page(drawcontext); |
|
|
|
// Close the SVG file |
|
cairo_destroy(drawcontext); |
|
cairo_surface_destroy(surface); |
|
|
|
// Close the PDF file |
|
g_object_unref(page); |
|
|
|
return 0; |
|
} |
|
|
|
int main(int argn, char *args[]) |
|
{ |
|
// Poppler stuff |
|
PopplerDocument *pdffile; |
|
PopplerPage *page; |
|
|
|
// Initialise the GType library |
|
g_type_init (); |
|
|
|
// Get command line arguments |
|
if ((argn < 3)||(argn > 4)) { |
|
printf("Usage: pdf2svg <in file.pdf> <out file.svg> [<page no>]\n"); |
|
return -2; |
|
} |
|
gchar *absoluteFileName = getAbsoluteFileName(args[1]); |
|
gchar *filename_uri = g_filename_to_uri(absoluteFileName, NULL, NULL); |
|
gchar *pageLabel = NULL; |
|
|
|
char* svgFilename = args[2]; |
|
|
|
g_free(absoluteFileName); |
|
if (argn == 4) { |
|
// Get page number |
|
pageLabel = g_strdup(args[3]); |
|
} |
|
|
|
// Open the PDF file |
|
pdffile = poppler_document_new_from_file(filename_uri, NULL, NULL); |
|
g_free(filename_uri); |
|
if (pdffile == NULL) { |
|
fprintf(stderr, "Unable to open file\n"); |
|
return -3; |
|
} |
|
|
|
int conversionErrors = 0; |
|
// Get the page |
|
|
|
if(pageLabel == NULL) |
|
{ |
|
page = poppler_document_get_page(pdffile, 0); |
|
conversionErrors = convertPage(page, svgFilename); |
|
} |
|
else |
|
{ |
|
if(strcmp(pageLabel, "all") == 0) |
|
{ |
|
int curError; |
|
int pageCount = poppler_document_get_n_pages(pdffile); |
|
|
|
if(pageCount > 9999999) |
|
{ |
|
fprintf(stderr, "Too many pages (>9,999,999)\n"); |
|
return -5; |
|
} |
|
|
|
char pageCountBuffer[8]; // 9,999,999 page limit |
|
sprintf(pageCountBuffer, "%d", pageCount); |
|
|
|
char* svgFilenameBuffer = malloc(strlen(svgFilename) + strlen(pageCountBuffer)); |
|
|
|
int pageInd; |
|
for(pageInd = 0; pageInd < pageCount; pageInd++) |
|
{ |
|
sprintf(svgFilenameBuffer, svgFilename, pageInd + 1); |
|
page = poppler_document_get_page(pdffile, pageInd); |
|
curError = convertPage(page, svgFilenameBuffer); |
|
if(curError != 0) { |
|
conversionErrors = -1; |
|
} |
|
} |
|
|
|
free(svgFilenameBuffer); |
|
} |
|
else |
|
{ |
|
page = poppler_document_get_page_by_label(pdffile, pageLabel); |
|
conversionErrors = convertPage(page, svgFilename); |
|
g_free(pageLabel); |
|
} |
|
} |
|
|
|
g_object_unref(pdffile); |
|
|
|
if(conversionErrors != 0) { |
|
return -4; |
|
} |
|
|
|
else { |
|
return 0; |
|
} |
|
|
|
}
|
|
|