#include "../lib/devices/polyops.h"
#include "../lib/devices/record.h"
#include "../lib/devices/rescale.h"
+#include "../lib/gfxfilter.h"
#include "../lib/pdf/pdf.h"
#include "../lib/log.h"
static int flatten = 0;
+static char* filters = 0;
+
char* fontpaths[256];
int fontpathpos = 0;
}
else if (!strcmp(name, "s"))
{
- char*s = strdup(val);
+ char*s = val;
char*c = strchr(s, '=');
if(c && *c && c[1]) {
*c = 0;
} else if(!strcmp(s,"help")) {
printf("PDF Parameters:\n");
gfxsource_t*pdf = gfxsource_pdf_create();
- pdf->set_parameter(pdf, "help", "");
+ pdf->setparameter(pdf, "help", "");
gfxdevice_t swf;
gfxdevice_swf_init(&swf);
printf("SWF Parameters:\n");
store_parameter("extrafontdata", "1");
return 0;
}
+ else if (!strcmp(name, "ff"))
+ {
+ if(filters) {
+ // append this to the current filter expression (we allow more than one --filter)
+ int l = strlen(filters);
+ int new_len = l + strlen(val) + 2;
+ filters = (char*)realloc(filters, new_len);
+ filters[l] = ':';
+ strcpy(filters+l+1, val);
+ } else {
+ filters = strdup(val);
+ }
+ return 1;
+ }
else if (!strcmp(name, "w"))
{
store_parameter("linksopennewwindow", "0");
{"t", "stop"},
{"T", "flashversion"},
{"F", "fontdir"},
+{"ff", "filter"},
{"b", "defaultviewer"},
{"l", "defaultloader"},
{"B", "viewer"},
out = &rescale;
}
+ if(filters) {
+ gfxfilterchain_t*chain = gfxfilterchain_parse(filters);
+ if(!chain) {
+ fprintf(stderr, "Unable to parse filters: %s\n", filters);
+ exit(1);
+ }
+ out = gfxfilterchain_apply(chain, out);
+ gfxfilterchain_destroy(chain);
+ }
+
/* pass global parameters to output device */
parameter_t*p = device_config;
while(p) {
/* pass global parameters to PDF driver*/
parameter_t*p = device_config;
while(p) {
- driver->set_parameter(driver, p->name, p->value);
+ driver->setparameter(driver, p->name, p->value);
p = p->next;
}
exit(1);
}
- if(info_only) {
- show_info(driver, filename);
- return 0;
- }
-
- if(!outputname)
- {
- if(filename) {
- outputname = stripFilename(filename, ".swf");
- msg("<notice> Output filename not given. Writing to %s", outputname);
- }
- }
-
- if(!outputname)
- {
- fprintf(stderr, "Please use -o to specify an output file\n");
- exit(1);
+ if (!info_only) {
+ if(!outputname)
+ {
+ if(filename) {
+ outputname = stripFilename(filename, ".swf");
+ msg("<notice> Output filename not given. Writing to %s", outputname);
+ }
+ }
+
+ if(!outputname)
+ {
+ fprintf(stderr, "Please use -o to specify an output file\n");
+ exit(1);
+ }
}
// test if the page range is o.k.
is_in_range(0x7fffffff, pagerange);
- if(pagerange)
- driver->set_parameter(driver, "pages", pagerange);
-
if (!filename) {
args_callback_usage(argv[0]);
exit(0);
}
+
+ char fullname[256];
+ if(password && *password) {
+ sprintf(fullname, "%s|%s", filename, password);
+ filename = fullname;
+ }
+
+ if(pagerange)
+ driver->setparameter(driver, "pages", pagerange);
/* add fonts */
for(t=0;t<fontpathpos;t++) {
- driver->set_parameter(driver, "fontdir", fontpaths[t]);
+ driver->setparameter(driver, "fontdir", fontpaths[t]);
}
- char fullname[256];
- if(password && *password) {
- sprintf(fullname, "%s|%s", filename, password);
- filename = fullname;
+ if(info_only) {
+ show_info(driver, filename);
+ return 0;
}
char*u = 0;
/* pass global parameters document */
p = device_config;
while(p) {
- pdf->set_parameter(pdf, p->name, p->value);
+ pdf->setparameter(pdf, p->name, p->value);
p = p->next;
}
if(is_in_range(pagenr, pagerange)) {
char mapping[80];
sprintf(mapping, "%d:%d", pagenr, frame);
- pdf->set_parameter(pdf, "pagemap", mapping);
+ pdf->setparameter(pdf, "pagemap", mapping);
pagenum++;
}
if(pagenum == xnup*ynup || (pagenr == pdf->num_pages && pagenum>1)) {
frame++;
}
}
+ if(pagerange && !pagenum && frame==1) {
+ fprintf(stderr, "No pages in range %s", pagerange);
+ exit(1);
+ }
pagenum = 0;
gfxdevice_t*out = create_output_device();;
+ pdf->prepare(pdf, out);
+
for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++)
{
if(is_in_range(pagenr, pagerange)) {
p->next = 0;free(p);
p = next;
}
+ if(filters) {
+ free(filters);
+ }
return 0;
}