pass -X,-Y, -r options with preloader/viewer linking using command
[swftools.git] / pdf2swf / pdf2swf.cc
1 /* pdf2swf.cc
2    main routine for pdf2swf(1)
3
4    Part of the swftools package.
5    
6    Copyright (c) 2001 Matthias Kramm <kramm@quiss.org> 
7
8    This file is distributed under the GPL, see file COPYING for details */
9
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <stdarg.h>
13 #include <string.h>
14 #include <unistd.h>
15 #include "../config.h"
16 #include "../lib/args.h"
17 #include "pdfswf.h"
18 #include "t1lib.h"
19 extern "C" {
20 #include "log.h"
21 }
22
23 static char * outputname = 0;
24 static int loglevel = 3;
25 static char * pagerange = 0;
26 static char * filename = 0;
27 static char * password = 0;
28
29 static char * preloader = 0;
30 static char * viewer = 0;
31
32 int systemf(const char* format, ...)
33 {
34     char buf[1024];
35     va_list arglist;
36     va_start(arglist, format);
37     vsprintf(buf, format, arglist);
38     va_end(arglist);
39
40     printf("%s:\n", buf);
41     fflush(stdout);
42     return system(buf);
43 }
44
45 int args_callback_option(char*name,char*val) {
46     if (!strcmp(name, "o"))
47     {
48         outputname = val;
49         return 1;
50     }
51     else if (!strcmp(name, "v"))
52     {
53         loglevel ++;
54         return 0;
55     }
56     else if (name[0]=='p')
57     {
58         /* check whether the page range follows the p directly, like 
59            in -p1,2 */
60         do {
61             name++;
62         } while(*name == 32 || *name == 13 || *name == 10 || *name == '\t');
63
64         if(*name) {
65             pagerange = name;
66             return 0;
67         } 
68         pagerange = val;        
69         return 1;
70     }
71     else if (!strcmp(name, "P"))
72     {
73         password = val;
74         return 1;
75     }
76     else if (!strcmp(name, "s"))
77     {
78         pdfswf_drawonlyshapes();
79         return 0;
80     }
81     else if (!strcmp(name, "i"))
82     {
83         pdfswf_ignoredraworder();
84         return 0;
85     }
86     else if (!strcmp(name, "n"))
87     {
88         pdfswf_linksopennewwindow();
89         return 0;
90     }
91     else if (!strcmp(name, "f"))
92     {
93         pdfswf_storeallcharacters();
94         return 0;
95     }
96     else if (!strcmp(name, "l"))
97     {
98         if(val)
99         {
100             preloader = val;
101         }
102         else
103         {
104             systemf("ls %s/swfs/*_loader.swf", DATADIR);
105             printf("\n");
106             exit(1);
107         }
108         return 1;
109     }
110     else if (!strcmp(name, "b"))
111     {
112         if(val)
113         {
114             viewer = val;
115         }
116         else
117         {
118             systemf("ls %s/swfs/*_viewer.swf", DATADIR);
119             printf("\n");
120             exit(1);
121         }
122         return 1;
123     }
124     else if (name[0]=='j')
125     {
126         if(name[1]) {
127             pdfswf_jpegquality(atoi(&name[1]));
128             return 0;
129         } else {
130             pdfswf_jpegquality(atoi(val));
131             return 1;
132         }
133     }
134     else if (!strcmp(name, "V"))
135     {   
136         printf("pdf2swf - part of %s %s\n", PACKAGE, VERSION);
137         exit(0);
138     }
139     else 
140     {
141         fprintf(stderr, "Unknown option: -%s\n", name);
142         exit(1);
143     }
144     return 0;
145 }
146
147 struct options_t options[] =
148 {{"o","output"},
149  {"V","version"},
150  {"i","ignore"},
151  {"s","shapes"},
152  {"j","jpegquality"},
153  {"p","pages"},
154  {"w","samewindow"},
155  {"f","fonts"},
156  {"b","viewer"},
157  {"l","preloader"},
158  {0,0}
159 };
160
161 int args_callback_longoption(char*name,char*val) {
162     return args_long2shortoption(options, name, val);
163 }
164
165 int args_callback_command(char*name, char*val) {
166     if (!filename) 
167         filename = name;
168     else {
169         if(outputname)
170         {
171              fprintf(stderr, "Error: Do you want the output to go to %s or to %s?", 
172                      outputname, name);
173              exit(1);
174         }
175         outputname = name;
176     }
177     return 0;
178 }
179
180 void args_callback_usage(char*name)
181 {
182     printf("Usage: %s [-si] [-j quality] [-p range] [-P password] input.pdf [output.swf]\n", name);
183     printf("\n");
184     printf("-p  --pages=range          Convert only pages in range\n");
185     printf("-P  --password=password    Use password for deciphering the pdf\n");
186     printf("-s  --shapes               Don't use SWF Fonts, but store everything as shape\n");
187     printf("-i  --ignore               Ignore draw order (makes the SWF file smaller)\n");
188     printf("-j  --jpegquality=quality  Set quality of embedded jpeg pictures (default:85)\n");
189     printf("-v  --verbose              Be verbose. Use more than one -v for greater effect\n");
190     printf("-w  --samewindow           Don't open a new Browser Window for Links in the SWF\n");
191     printf("-f  --fonts                Store full fonts in SWF. (Don't reduce to used characters)\n");
192     printf("-b  --viewer name          Link viewer \"name\" to the pdf (\"%s -b\" for list)\n");
193     printf("-l  --preloader name       Link preloader \"name\" to the pdf (\"%s -l\" for list)\n");
194     printf("-V  --version              Print program version\n");
195 }
196
197 int main(int argn, char *argv[])
198 {
199 #ifdef HAVE_SRAND48
200     srand48(time(0));
201 #else
202 #ifdef HAVE_SRAND
203     srand(time(0));
204 #endif
205 #endif
206     processargs(argn, argv);
207     initLog(0,-1,0,0,-1,loglevel);
208     if(!outputname)
209     {
210         fprintf(stderr, "Please use -o to specify an output file\n");
211         exit(1);
212     }
213
214     // test if the page range is o.k.
215     is_in_range(0x7fffffff, pagerange);
216
217     if (!filename) {
218         args_callback_usage(argv[0]);
219         exit(0);
220     }
221
222     logf("<verbose> reading data files from %s\n", DATADIR);
223     //TODO: use tempnam here. Check if environment already contains a
224     //T1LIB_CONFIG.
225     putenv( "T1LIB_CONFIG=/tmp/t1lib.config.tmp");
226     FILE*fi = fopen("/tmp/t1lib.config.tmp", "wb");
227     fprintf(fi, "FONTDATABASE=%s/fonts/FontDataBase\n", DATADIR);
228     fprintf(fi, "ENCODING=%s/fonts:.\n", DATADIR);
229     fprintf(fi, "AFM=%s/fonts:.\n", DATADIR);
230     fprintf(fi, "TYPE1=%s/fonts:.\n", DATADIR);
231     fclose(fi);
232     /* initialize t1lib */
233     T1_SetBitmapPad( 16);
234     if ((T1_InitLib(NO_LOGFILE)==NULL)){
235         fprintf(stderr, "Initialization of t1lib failed\n");
236         exit(1);
237     }
238     unlink("/tmp/t1lib.config.tmp");
239
240     pdfswf_init(filename, password);
241     pdfswf_setoutputfilename(outputname);
242
243     int pages = pdfswf_numpages();
244     int t = 1;
245     for(t = 1; t <= pages; t++) 
246     {
247         if(is_in_range(t, pagerange))
248         pdfswf_convertpage(t);
249     }
250     pdfswf_performconversion();
251
252     pdfswf_close();
253
254     if(!viewer && preloader)
255         logf("<warning> --preloader option without --viewer option doesn't make very much sense.");
256     if(viewer || preloader)
257         printf("\n");
258
259     if(viewer) {
260         systemf("swfcombine `swfdump -XY %s` %s viewport=%s -o %s",
261                 outputname, viewer, outputname, outputname);
262         printf("\n");
263     }
264     if(preloader) {
265         systemf("swfcombine `swfdump -r %s` %s/swfs/PreLoaderTemplate.swf loader=%s movie=%s -o %s",
266                 preloader, DATADIR, preloader, outputname, outputname);
267         printf("\n");
268     }
269
270     return 0;
271 }
272
273