X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fpdf2swf.c;h=8d9d4eb9b70a731e2e8e6e06b7c2f332bedabfe5;hb=2d0c8c0eb7185244af3890bbfad944001ea8f006;hp=48904e538f65a2ef9747fee73d27b9bef9ab1420;hpb=da91e3e4408443fcd917bee01022576b1ed7a904;p=swftools.git diff --git a/src/pdf2swf.c b/src/pdf2swf.c index 48904e5..8d9d4eb 100644 --- a/src/pdf2swf.c +++ b/src/pdf2swf.c @@ -28,15 +28,13 @@ #ifdef HAVE_DIRENT_H #include #endif -#ifdef HAVE_SYS_STAT_H -#include -#endif #include "../lib/args.h" #include "../lib/os.h" #include "../lib/rfxswf.h" #include "../lib/devices/swf.h" #include "../lib/devices/arts.h" -#include "../lib/xpdf/pdf.h" +#include "../lib/devices/record.h" +#include "../lib/pdf/pdf.h" #include "../lib/log.h" #define SWFDIR concatPaths(getInstallationPath(), "swfs") @@ -55,6 +53,8 @@ static char * viewer = 0; static int xnup = 1; static int ynup = 1; +static int info_only = 0; + static int flatten = 0; char* fontpaths[256]; @@ -187,55 +187,61 @@ int args_callback_option(char*name,char*val) { if(c && *c && c[1]) { *c = 0; c++; - driver->set_parameter(s,c); + driver->set_parameter(driver, s,c); } else - driver->set_parameter(s,"1"); + driver->set_parameter(driver, s,"1"); return 1; } else if (!strcmp(name, "S")) { - driver->set_parameter("drawonlyshapes", "1"); + driver->set_parameter(driver, "drawonlyshapes", "1"); return 0; } else if (!strcmp(name, "i")) { - driver->set_parameter("ignoredraworder", "1"); + driver->set_parameter(driver, "ignoredraworder", "1"); return 0; } else if (!strcmp(name, "z")) { - driver->set_parameter("enablezlib", "1"); + driver->set_parameter(driver, "enablezlib", "1"); zlib = 1; return 0; } else if (!strcmp(name, "n")) { - driver->set_parameter("opennewwindow", "1"); + driver->set_parameter(driver, "opennewwindow", "1"); + return 0; + } + else if (!strcmp(name, "I")) + { + info_only = 1; return 0; } else if (!strcmp(name, "t")) { - driver->set_parameter("insertstop", "1"); + driver->set_parameter(driver, "insertstop", "1"); return 0; } else if (!strcmp(name, "T")) { if(!strcasecmp(val, "mx")) - driver->set_parameter("flashversion", "6"); + driver->set_parameter(driver, "flashversion", "6"); else - driver->set_parameter("flashversion", val); + driver->set_parameter(driver, "flashversion", val); return 1; } else if (!strcmp(name, "f")) { - driver->set_parameter("storeallcharacters", "1"); + driver->set_parameter(driver, "storeallcharacters", "1"); + driver->set_parameter(driver, "extrafontdata", "1"); return 0; } else if (!strcmp(name, "w")) { - driver->set_parameter("linksopennewwindow", "0"); + driver->set_parameter(driver, "linksopennewwindow", "0"); return 0; } else if (!strcmp(name, "G")) @@ -301,10 +307,10 @@ int args_callback_option(char*name,char*val) { else if (!strcmp(name, "j")) { if(name[1]) { - driver->set_parameter("jpegquality", &name[1]); + driver->set_parameter(driver, "jpegquality", &name[1]); return 0; } else { - driver->set_parameter("jpegquality", val); + driver->set_parameter(driver, "jpegquality", val); return 1; } } @@ -343,6 +349,7 @@ struct options_t options[] = {"q","quiet"}, {"V","version"}, {"i","ignore"}, + {"I","info"}, {"z","zlib"}, {"s","set"}, {"S","shapes"}, @@ -408,6 +415,7 @@ void args_callback_usage(char*name) " graphic errors)\n"); printf("-s filloverlap Make intersecting shapes overlap, instead of canceling each\n" " other out. (Needed for some Powerpoint PDFs)\n"); + printf("-s transparent Make the SWF transparent\n"); //deliberately undocumented (for now) //printf("-2 Put 2 pages into each frame.\n"); //printf("-4 Put 4 pages into each frame.\n"); @@ -439,6 +447,34 @@ float getRate(char*filename) return swf.frameRate / 256.0; } +void show_info(gfxsource_t*driver, char*filename) +{ + gfxdocument_t* pdf = driver->open(driver, filename); + int pagenr; + FILE*fo=0; + if(!pdf) { + msg(" Couldn't open %s", filename); + exit(1); + } + if(outputname) { + fo = fopen(outputname, "wb"); + if(!fo) { + perror(outputname);exit(1);; + } + } else { + fo = stdout; + } + + for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++) + { + gfxpage_t*page = pdf->getpage(pdf,pagenr); + if(is_in_range(pagenr, pagerange)) { + fprintf(fo, "page=%d width=%.2f height=%.2f\n", pagenr, page->width, page->height); + } + } + pdf->destroy(pdf); +} + int main(int argn, char *argv[]) { int ret; @@ -449,26 +485,13 @@ int main(int argn, char *argv[]) int nup_pos = 0; int x,y; char* installPath = getInstallationPath(); - char* fontdir = 0; initLog(0,-1,0,0,-1,loglevel); - driver = gfxsource_pdf_create(); - -#if defined(WIN32) && defined(HAVE_STAT) && defined(HAVE_SYS_STAT_H) - if(installPath) { - fontdir = concatPaths(installPath, "fonts"); - FILE*test = fopen(concatPaths(fontdir,"\\d050000l.afm"), "rb"); - if(!test) { - fprintf(stderr, "Couldn't find file %s - pdf2swf not installed properly? OS says:\n", concatPaths(fontdir, "\\d050000l.afm")); - perror("open"); - exit(1); - } - fclose(test); - } -#else - fontdir = concatPaths(installPath, "fonts"); -#endif + /* not needed anymore since fonts are embedded + if(installPath) { + fontpaths[fontpathpos++] = concatPaths(installPath, "fonts"); + }*/ #ifdef HAVE_SRAND48 srand48(time(0)); @@ -477,14 +500,21 @@ int main(int argn, char *argv[]) srand(time(0)); #endif #endif - processargs(argn, argv); + driver = gfxsource_pdf_create(); + processargs(argn, argv); + if(!filename) { fprintf(stderr, "Please specify an input file\n"); exit(1); } + if(info_only) { + show_info(driver, filename); + return 0; + } + if(!outputname) { if(filename) { @@ -502,17 +532,17 @@ int main(int argn, char *argv[]) // 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); } /* add fonts */ - if(fontdir) { - driver->set_parameter("fontdir", fontdir); - } for(t=0;tset_parameter("fontdir", fontpaths[t]); + driver->set_parameter(driver, "fontdir", fontpaths[t]); } char fullname[256]; @@ -521,7 +551,7 @@ int main(int argn, char *argv[]) filename = fullname; } - gfxdocument_t* pdf = driver->open(filename); + gfxdocument_t* pdf = driver->open(driver, filename); if(!pdf) { msg(" Couldn't open %s", filename); exit(1); @@ -532,7 +562,7 @@ int main(int argn, char *argv[]) gfxdevice_t*out; if(flatten) { - gfxdevice_arts_init(&wrap, &swf); + gfxdevice_removeclippings_init(&wrap, &swf); out = &wrap; } else { out = &swf; @@ -588,9 +618,9 @@ int main(int argn, char *argv[]) int t = y*xnup + x; if(pages[t].page->width > xmax[x]) - xmax[x] = pages[t].page->width; + xmax[x] = (int)pages[t].page->width; if(pages[t].page->height > ymax[y]) - ymax[y] = pages[t].page->height; + ymax[y] = (int)pages[t].page->height; } for(x=0;xfinish(out); + if(result->save(result, outputname) < 0) { exit(1); } @@ -641,45 +672,35 @@ int main(int argn, char *argv[]) pdf->destroy(pdf); - char*zip = ""; - if(zlib) + const char*zip = ""; + if(zlib) { zip = "-z"; -#undef SYSTEM_BACKTICKS - if(viewer && !preloader) { -#ifdef SYSTEM_BACKTICKS - systemf("swfcombine %s `swfdump -XY \"%s\"` \"%s\" viewport=\"%s\" -o \"%s\"",zip, - viewer, outputname, outputname); -#else + } + if(!preloader && viewer) { systemf("swfcombine %s -X %d -Y %d \"%s\" viewport=\"%s\" -o \"%s\"",zip,width,height, viewer, outputname, outputname); -#endif if(!system_quiet) printf("\n"); } if(preloader && !viewer) { msg(" --preloader option without --viewer option doesn't make very much sense."); -#ifdef SYSTEM_BACKTICKS - ret = systemf("swfcombine %s `swfdump -r \"%s\"` %s/PreLoaderTemplate.swf loader=\"%s\" movie=\"%s\" -o \"%s\"",zip, - preloader, SWFDIR, preloader, outputname, outputname); -#else ret = systemf("swfcombine %s -Y %d -X %d %s/PreLoaderTemplate.swf loader=\"%s\" movie=\"%s\" -o \"%s\"",zip,width,height, SWFDIR, preloader, outputname, outputname); -#endif if(!system_quiet) printf("\n"); } if(preloader && viewer) { - systemf("swfcombine \"%s\" viewport=%s -o __tmp__.swf", - viewer, outputname, outputname); -#ifdef SYSTEM_BACKTICKS - systemf("swfcombine %s `swfdump -XY \"%s\"` `swfdump -r \"%s\"` %s/PreLoaderTemplate.swf loader=%s movie=__tmp__.swf -o \"%s\"",zip, - outputname, preloader, SWFDIR, preloader, outputname); -#else - /* TODO: read out rate */ - systemf("swfcombine %s -X %d -Y %d -r %f %s/PreLoaderTemplate.swf loader=%s movie=__tmp__.swf -o \"%s\"",zip,width,height, - getRate(preloader), preloader, SWFDIR, preloader, outputname); +#ifdef HAVE_MKSTEMP + char tmpname[] = "__swf__XXXXXX"; + mkstemp(tmpname); +#else + char*tmpname = "__tmp__.swf"; #endif - systemf("rm __tmp__.swf"); + systemf("swfcombine \"%s\" viewport=%s -o %s", + viewer, outputname, tmpname); + systemf("swfcombine %s -X %d -Y %d -r %f %s/PreLoaderTemplate.swf loader=%s movie=%s -o \"%s\"",zip,width,height, + getRate(preloader), SWFDIR, preloader, tmpname, outputname); + systemf("rm %s", tmpname); } return 0;