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>
