[PATCH 02/10] pdftocairo: Added SVG support.
Stefan Thomas
thomas at txtbear.com
Sat Jan 9 09:08:11 PST 2010
Simplified initialization code (necessary because there is no resize option for Cairo SVG surfaces.)
---
utils/.gitignore | 1 +
utils/pdftocairo.cc | 49 +++++++++++++++++++++++--------------------------
2 files changed, 24 insertions(+), 26 deletions(-)
diff --git a/utils/.gitignore b/utils/.gitignore
index 696f074..a77622a 100644
--- a/utils/.gitignore
+++ b/utils/.gitignore
@@ -7,6 +7,7 @@ pdfimages
pdfinfo
pdftohtml
pdftoppm
+pdftocairo
pdftops
pdftotext
pdftoabw
diff --git a/utils/pdftocairo.cc b/utils/pdftocairo.cc
index 8540b42..2a8b6dc 100644
--- a/utils/pdftocairo.cc
+++ b/utils/pdftocairo.cc
@@ -32,6 +32,7 @@
#include <cairo.h>
#include <cairo-ps.h>
#include <cairo-pdf.h>
+#include <cairo-svg.h>
#include "parseargs.h"
#include "goo/gmem.h"
#include "goo/GooString.h"
@@ -59,6 +60,7 @@ static GBool useCropBox = gFalse;
static GBool png = gFalse;
static GBool ps = gFalse;
static GBool pdf = gFalse;
+static GBool svg = gFalse;
static char ownerPassword[33] = "";
static char userPassword[33] = "";
static GBool quiet = gFalse;
@@ -103,6 +105,8 @@ static const ArgDesc argDesc[] = {
"generate PostScript file"},
{"-pdf", argFlag, &pdf, 0,
"generate a PDF file"},
+ {"-svg", argFlag, &svg, 0,
+ "generate a SVG file"},
{"-opw", argString, ownerPassword, sizeof(ownerPassword),
@@ -126,37 +130,28 @@ static const ArgDesc argDesc[] = {
};
-static void create_surface(char *outFile, cairo_surface_t **surface_out,
- GBool *printing_out)
+static cairo_surface_t *start_page(char *outFile, int w, int h,
+ double x_res, double y_res, int rotate)
{
char file[OUT_FILE_SZ];
+ cairo_surface_t *surface;
strcpy(file, outFile);
+
if (png) {
- *surface_out = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
- *printing_out = gFalse;
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w*x_res/72.0, h*y_res/72.0);
} else if (ps) {
strcat(file, ".ps");
- *surface_out = cairo_ps_surface_create (file, w, h);
- *printing_out = gTrue;
+ surface = cairo_ps_surface_create (file, w, h);
} else if (pdf) {
strcat(file, ".pdf");
- *surface_out = cairo_pdf_surface_create (file, w, h);
- *printing_out = gTrue;
- }
-}
-
-static void start_page(cairo_surface_t **surface, int w, int h,
- double x_res, double y_res, int rotate)
-{
- if (png) {
- cairo_surface_destroy(*surface);
- *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w*x_res/72.0, h*y_res/72.0);
- } else if (ps) {
- cairo_ps_surface_set_size(*surface, w, h);
- } else if (pdf) {
- cairo_pdf_surface_set_size(*surface, w, h);
+ surface = cairo_pdf_surface_create (file, w, h);
+ } else if (svg) {
+ strcat(file, ".svg");
+ surface = cairo_svg_surface_create (file, w, h);
}
+
+ return surface;
}
static void end_page(cairo_surface_t *surface, char *outFile)
@@ -167,7 +162,7 @@ static void end_page(cairo_surface_t *surface, char *outFile)
if (png) {
strcat(file, ".png");
cairo_surface_write_to_png (surface, file);
- } else if (ps || pdf) {
+ } else if (ps || pdf || svg) {
cairo_surface_show_page(surface);
}
}
@@ -270,8 +265,8 @@ int main(int argc, char *argv[]) {
goto err0;
}
- if (!png && !ps && !pdf) {
- fprintf(stderr, "One of -png, -ps, or -pdf must be specified\n");
+ if (!png && !ps && !pdf && !svg) {
+ fprintf(stderr, "One of -png, -ps, -pdf or -svg must be specified\n");
goto err0;
}
@@ -323,7 +318,6 @@ int main(int argc, char *argv[]) {
if (sz != 0)
w = h = sz;
- create_surface(outRoot, &surface, &printing);
output_dev = new CairoOutputDev ();
output_dev->startDoc(doc->getXRef (), doc->getCatalog ());
@@ -348,8 +342,11 @@ int main(int argc, char *argv[]) {
y_resolution = (72.0 * y_scaleTo) / pg_h;
}
}
+
+ // Enable printing mode for all output types except PNG
+ printing = (png) ? gFalse : gTrue;
- start_page(&surface, pg_w, pg_h, x_resolution, y_resolution, doc->getPageRotate(pg));
+ surface = start_page(outRoot, pg_w, pg_h, x_resolution, y_resolution, doc->getPageRotate(pg));
render_page(output_dev, doc, surface, printing, pg,
x, y, w, h, pg_w, pg_h, x_resolution, y_resolution);
snprintf(outFile, OUT_FILE_SZ, "%.*s-%0*d",
--
1.7.0.4
More information about the poppler
mailing list