swfrender has some existing support for detecting page ranges, but only outputs 
the first page matched. 

I've modified it to output multiple pages: 
- each page in the specified page range is selected for output 
- each page is output to an individual file 
- the output filename is suffixed with the page number 

Patch is attached (the GitHub mirror doesn't appear current, so I haven't tried 
a pull request via that channel). 
Has been tested on OS X Snow Leopard and RHEL 6.2 x86_64. 

There was/is mixed tabs/spaces in swfrender.c, and some of the existing 
indenting was broken, which I've fixed in sections I modified - if you're 
strict about whitespace changes let me know and I'll re-patch minimally. 

cheers 
tim 
From a3d9d6bc6a7e50ecbb436ad300562e26701f6ed9 Mon Sep 17 00:00:00 2001
From: timw <[email protected]>
Date: Wed, 27 Jun 2012 10:11:41 +1200
Subject: [PATCH] Allow swfrender to output multiple page ranges, using the
 existing page range support, but allowing multiple pages to
 be selected and suffixing the output filename for each
 page.

Also documented the arguments.
---
 src/swfrender.c |  169 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 98 insertions(+), 71 deletions(-)

diff --git a/src/swfrender.c b/src/swfrender.c
index afdb9ee..58c7eb8 100644
--- a/src/swfrender.c
+++ b/src/swfrender.c
@@ -93,13 +93,14 @@ int args_callback_longoption(char*name,char*val)
 void args_callback_usage(char *name)
 {
     printf("\n");
-    printf("Usage: %s file.swf [-o output.png]\n", name);
+    printf("Usage: %s file.swf [-options]\n", name);
     printf("\n");
     printf("-h , --help                    Print short help message and exit\n");
     printf("-l , --legacy                  Use old rendering framework\n");
-    printf("-o , --output		   Output file (default: output.png)\n");
-    printf("-X , --width                   Width of resulting image\n");
-    printf("-Y , --height                  Height of resulting image\n");
+    printf("-o , --output                  Output file, suffixed for multiple pages (default: output.png)\n");
+    printf("-p , --pages range             Render pages in specified range e.g. 9 or 1-20 or 1,4-6,9-11 (default: all pages)\n");
+    printf("-X , --width width             Scale output to specific width (proportional unless height specified)\n");
+    printf("-Y , --height height           Scale output to specific height (proportional unless width specified)\n");
     printf("\n");
 }
 int args_callback_command(char*name,char*val)
@@ -122,79 +123,105 @@ int main(int argn, char*argv[])
     processargs(argn, argv);
 
     if(!filename) {
-	fprintf(stderr, "You must supply a filename.\n");
-	return 1;
+        fprintf(stderr, "You must supply a filename.\n");
+        return 1;
     }
 
     if(!ng) {
-	fi = open(filename, O_RDONLY|O_BINARY);
-	if (fi<=0) { 
-	    fprintf(stderr,"Couldn't open %s\n", filename);
-	    perror(filename);
-	    exit(1);
-	}
-	if(swf_ReadSWF(fi,&swf)<0) { 
-	    fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",argv[1]);
-	    close(fi);
-	}
-	assert(swf.movieSize.xmax > swf.movieSize.xmin && swf.movieSize.ymax > swf.movieSize.ymin);
-	RENDERBUF buf;
-	swf_Render_Init(&buf, 0,0, (swf.movieSize.xmax - swf.movieSize.xmin) / 20,
-				   (swf.movieSize.ymax - swf.movieSize.ymin) / 20, 2, 1);
-	swf_RenderSWF(&buf, &swf);
-	RGBA* img = swf_Render(&buf);
-        if(quantize)
-	    png_write_palette_based_2(outputname, (unsigned char*)img, buf.width, buf.height);
-        else
-	    png_write(outputname, (unsigned char*)img, buf.width, buf.height);
-	swf_Render_Delete(&buf);
+        fi = open(filename, O_RDONLY|O_BINARY);
+        if (fi<=0) { 
+            fprintf(stderr,"Couldn't open %s\n", filename);
+            perror(filename);
+            exit(1);
+        }
+        if(swf_ReadSWF(fi,&swf)<0) { 
+            fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",argv[1]);
+            close(fi);
+        }
+        assert(swf.movieSize.xmax > swf.movieSize.xmin && swf.movieSize.ymax > swf.movieSize.ymin);
+        RENDERBUF buf;
+        swf_Render_Init(&buf, 0,0, (swf.movieSize.xmax - swf.movieSize.xmin) / 20,
+                       (swf.movieSize.ymax - swf.movieSize.ymin) / 20, 2, 1);
+        swf_RenderSWF(&buf, &swf);
+        RGBA* img = swf_Render(&buf);
+            if(quantize)
+            png_write_palette_based_2(outputname, (unsigned char*)img, buf.width, buf.height);
+            else
+            png_write(outputname, (unsigned char*)img, buf.width, buf.height);
+        swf_Render_Delete(&buf);
     } else {
-	parameter_t*p;
+        parameter_t*p;
 
-	gfxsource_t*src = gfxsource_swf_create();
-	for(p=params;p;p=p->next) {
-	    src->setparameter(src, p->name, p->value);
-	}
-	gfxdocument_t*doc = src->open(src, filename);
-	for(p=params;p;p=p->next) {
-	    doc->setparameter(doc, p->name, p->value);
-	}
-	if(!doc) {
-	    fprintf(stderr,"Couldn't open %s\n", filename);
-	    exit(1);
-	}
-	gfxdevice_t dev2,*dev=&dev2;
-	gfxdevice_render_init(dev);
-        dev->setparameter(dev, "antialise", "4");
-        if(quantize) {
-            dev->setparameter(dev, "palette", "1");
+        gfxsource_t*src = gfxsource_swf_create();
+        for(p=params;p;p=p->next) {
+            src->setparameter(src, p->name, p->value);
         }
-	if(width || height) {
-	    dev = gfxdevice_rescale_new(dev, width, height, 0);
-	}
-	for(p=params;p;p=p->next) {
-	    dev->setparameter(dev, p->name, p->value);
-	}
-
-	int t;
-	for(t=1;t<=doc->num_pages;t++) {
-            if(!is_in_range(t, pagerange))
-                continue;
-	    gfxpage_t* page = doc->getpage(doc, t);
-	    dev->startpage(dev, page->width, page->height);
-	    page->render(page, dev);
-	    dev->endpage(dev);
-	    page->destroy(page);
-	    break;
-	}
-	gfxresult_t*result = dev->finish(dev);
-	if(result) {
-	    if(result->save(result, outputname) < 0) {
-		exit(1);
-	    }
-	    result->destroy(result);
-	}
-	doc->destroy(doc);
+        gfxdocument_t*doc = src->open(src, filename);
+        for(p=params;p;p=p->next) {
+            doc->setparameter(doc, p->name, p->value);
+        }
+        if(!doc) {
+            fprintf(stderr,"Couldn't open %s\n", filename);
+            exit(1);
+        }
+        int t;
+        int count = 0;
+        char to_output[doc->num_pages];
+        for(t=1;t<=doc->num_pages;t++) {
+            to_output[t-1] = 0;
+            if(is_in_range(t, pagerange)) {
+                to_output[t-1] = 1;
+                count++;
+            }
+        }
+        if (count == 0) {
+            fprintf(stderr,"No pages selected for output. Available pages are 1..%d\n", doc->num_pages);
+            exit(1);
+        }
+        for(t=1;t<=sizeof(to_output);t++) {
+            if (to_output[t-1]) {
+                gfxdevice_t dev2,*dev=&dev2;
+                gfxdevice_render_init(dev);
+                    dev->setparameter(dev, "antialise", "4");
+                    if(quantize) {
+                        dev->setparameter(dev, "palette", "1");
+                    }
+                if(width || height) {
+                    dev = gfxdevice_rescale_new(dev, width, height, 0);
+                }
+                for(p=params;p;p=p->next) {
+                    dev->setparameter(dev, p->name, p->value);
+                }
+
+                gfxpage_t* page = doc->getpage(doc, t);
+                dev->startpage(dev, page->width, page->height);
+                page->render(page, dev);
+                dev->endpage(dev);
+                page->destroy(page);
+                
+                gfxresult_t* result = dev->finish(dev);
+                if(result) {
+                    char* effective_outputname = outputname;
+                    char suffixed_outputname[1000];
+                    if (count > 1) {
+                        effective_outputname = suffixed_outputname;
+                        char* ext = strrchr(outputname, '.');
+                        if (ext) {
+                            strncpy(suffixed_outputname, outputname, (ext - outputname));
+                            sprintf(suffixed_outputname + (ext-outputname), "-%d.%s", t, (ext+1));
+                        } else {
+                            sprintf(suffixed_outputname, "%s-%d", outputname, t);
+                        }
+                    }
+                    if(result->save(result, effective_outputname) < 0) {
+                        fprintf(stderr,"Error writing page %d to %s\n", t, outputname);
+                        exit(1);
+                    }
+                    result->destroy(result);
+                }
+            }
+        }
+        doc->destroy(doc);
     }
     return 0;
 }
-- 
1.7.9

---------------
SWFTools-common is a self-managed list. To subscribe/unsubscribe, or amend an 
existing subscription, please kindly point your favourite web browser 
at:<http://lists.nongnu.org/mailman/listinfo/swftools-common>

Reply via email to