xpdf-3.02 fixes
[swftools.git] / lib / pdf / pdf.cc
index a79f143..7ba786d 100644 (file)
@@ -1,11 +1,14 @@
 #include "../gfxdevice.h"
 #include "../gfxsource.h"
 #include "../log.h"
+#include "config.h"
 #include "GlobalParams.h"
 #include "InfoOutputDev.h"
 #include "GFXOutputDev.h"
 #include "../mem.h"
 #include "pdf.h"
+#define NO_ARGPARSER
+#include "../args.h"
 
 static parameter_t* device_config = 0;
 static parameter_t* device_config_next = 0;
@@ -15,6 +18,8 @@ int ppm_dpi = 0;
 
 static double zoom = 72; /* xpdf: 86 */
 
+static char* global_page_range = 0;
+
 typedef struct _pdf_page_info
 {
     int xMin, yMin, xMax, yMax;
@@ -22,6 +27,7 @@ typedef struct _pdf_page_info
     int number_of_images;
     int number_of_links;
     int number_of_fonts;
+    char has_info;
 } pdf_page_info_t;
 
 typedef struct _pdf_doc_internal
@@ -69,6 +75,11 @@ void render2(gfxpage_t*page, gfxdevice_t*output)
        return;
     }
 
+    if(!pi->pages[page->nr-1].has_info) {
+       msg("<fatal> pdf_page_render: page %d was previously set as not-to-render via the \"pages\" option", page->nr);
+       return;
+    }
+
     if(pi->protect) {
        gfxdevice_t*dev = pi->outputDev->device;
         dev->setparameter(dev, "protect", "1");
@@ -76,6 +87,7 @@ void render2(gfxpage_t*page, gfxdevice_t*output)
     pi->outputDev->setInfo(pi->info);
     pi->outputDev->setXRef(pi->doc, pi->doc->getXRef());
     pi->doc->displayPage((OutputDev*)pi->outputDev, page->nr, zoom, zoom, /*rotate*/0, true, true, /*doLinks*/(int)1);
+    pi->doc->processLinks((OutputDev*)pi->outputDev, page->nr);
 }
 
     
@@ -114,6 +126,11 @@ void pdf_doc_destroy(gfxdocument_t*gfx)
 
     free(gfx->internal);gfx->internal=0;
     free(gfx);gfx=0;
+
+    if(global_page_range) {
+       free(global_page_range);
+       global_page_range = 0;
+    }
 }
 
 void pdf_doc_set_parameter(gfxdocument_t*gfx, char*name, char*value)
@@ -172,6 +189,8 @@ void pdf_set_parameter(char*name, char*value)
     msg("<verbose> setting parameter %s to \"%s\"", name, value);
     if(!strncmp(name, "fontdir", strlen("fontdir"))) {
         addGlobalFontDir(value);
+    } else if(!strcmp(name, "pages")) {
+       global_page_range = strdup(value);
     } else if(!strncmp(name, "font", strlen("font"))) {
        addGlobalFont(value);
     } else if(!strncmp(name, "languagedir", strlen("languagedir"))) {
@@ -278,6 +297,7 @@ gfxdocument_t*pdf_open(char*filename)
       delete userPW;
     }
     if (!i->doc->isOk()) {
+        printf("xpdf reports document as broken.\n");
         return 0;
     }
 
@@ -322,17 +342,24 @@ gfxdocument_t*pdf_open(char*filename)
     InfoOutputDev*io = new InfoOutputDev();
     int t;
     i->pages = (pdf_page_info_t*)malloc(sizeof(pdf_page_info_t)*pdf_doc->num_pages);
+    memset(i->pages,0,sizeof(pdf_page_info_t)*pdf_doc->num_pages);
     for(t=1;t<=pdf_doc->num_pages;t++) {
-       i->doc->displayPage((OutputDev*)io, t, zoom, zoom, /*rotate*/0, /*usemediabox*/true, /*crop*/true, /*doLinks*/(int)1);
-       i->pages[t-1].xMin = io->x1;
-       i->pages[t-1].yMin = io->y1;
-       i->pages[t-1].xMax = io->x2;
-       i->pages[t-1].yMax = io->y2;
-       i->pages[t-1].width = io->x2 - io->x1;
-       i->pages[t-1].height = io->y2 - io->y1;
-       i->pages[t-1].number_of_images = io->num_images;
-       i->pages[t-1].number_of_links = io->num_links;
-       i->pages[t-1].number_of_fonts = io->num_fonts;
+       if(!global_page_range || is_in_range(t, global_page_range)) {
+           i->doc->displayPage((OutputDev*)io, t, zoom, zoom, /*rotate*/0, /*usemediabox*/true, /*crop*/true, /*doLinks*/(int)1);
+#if xpdfUpdateVersion >= 16
+           i->doc->processLinks((OutputDev*)io, t);
+#endif
+           i->pages[t-1].xMin = io->x1;
+           i->pages[t-1].yMin = io->y1;
+           i->pages[t-1].xMax = io->x2;
+           i->pages[t-1].yMax = io->y2;
+           i->pages[t-1].width = io->x2 - io->x1;
+           i->pages[t-1].height = io->y2 - io->y1;
+           i->pages[t-1].number_of_images = io->num_images;
+           i->pages[t-1].number_of_links = io->num_links;
+           i->pages[t-1].number_of_fonts = io->num_fonts;
+           i->pages[t-1].has_info = 1;
+       }
     }
     i->info = io;
     i->outputDev = new GFXOutputDev(device_config);