Hello!

I created a first patch to get what I need, and it *seems* to work fine. I'm not a C++ expert and haven't touched poppler before, so I'm prepared to work on the patch a little more; yes, I'll remove all the useless comments and debug output before sending a real patch.

Please tell me what you think!

cheers,
ben
From ee40bce861cf13c1f1ec172fc8e9118440372833 Mon Sep 17 00:00:00 2001
From: Benjamin Adler <[email protected]>
Date: Thu, 28 Oct 2010 17:22:16 +0200
Subject: [PATCH] Added support for using mediaBox, cropBox, bleedBox, trimBox, 
artBox as
 pageBoxes.

---
 cpp/poppler-page.cpp            |    4 +-
 poppler/OutputDev.h             |    5 +-
 poppler/PDFDoc.cc               |   12 ++--
 poppler/PDFDoc.h                |    6 +-
 poppler/PSOutputDev.cc          |   10 ++--
 poppler/PSOutputDev.h           |    4 +-
 poppler/Page.cc                 |  122 ++++++++++++++++++++++++++++++++-------
 poppler/Page.h                  |   13 +++--
 qt4/src/poppler-page.cc         |   17 ++++--
 qt4/src/poppler-ps-converter.cc |    2 +-
 test/perf-test.cc               |   13 ++--
 utils/HtmlOutputDev.h           |    2 +-
 utils/pdfimages.cc              |    2 +-
 utils/pdftoabw.cc               |    2 +-
 utils/pdftohtml.cc              |    6 +-
 utils/pdftoppm.cc               |   40 +++++++++++-
 utils/pdftops.cc                |   33 ++++++++++-
 utils/pdftotext.cc              |    6 +-
 18 files changed, 224 insertions(+), 75 deletions(-)

diff --git a/cpp/poppler-page.cpp b/cpp/poppler-page.cpp
index 4e2f730..11f3103 100644
--- a/cpp/poppler-page.cpp
+++ b/cpp/poppler-page.cpp
@@ -209,7 +209,7 @@ bool page::search(const ustring &text, rectf &r, 
search_direction_enum direction
     double rect_bottom = r.bottom();
 
     TextOutputDev td(NULL, gTrue, gFalse, gFalse);
-    d->doc->doc->displayPage(&td, d->index + 1, 72, 72, rotation_value, false, 
true, false);
+    d->doc->doc->displayPage(&td, d->index + 1, 72, 72, rotation_value, 
Page::cropBox, false);
     TextPage *text_page = td.takeText();
 
     switch (direction) {
@@ -268,7 +268,7 @@ ustring page::text(const rectf &r, text_layout_enum 
layout_mode) const
     std::auto_ptr<GooString> s;
     const GBool use_raw_order = (layout_mode == raw_order_layout);
     TextOutputDev td(0, gFalse, use_raw_order, gFalse);
-    d->doc->doc->displayPage(&td, d->index + 1, 72, 72, 0, false, true, false);
+    d->doc->doc->displayPage(&td, d->index + 1, 72, 72, 0, Page::cropBox, 
false);
     if (r.is_empty()) {
         const PDFRectangle *rect = d->page->getCropBox();
         s.reset(td.getText(rect->x1, rect->y1, rect->x2, rect->y2));
diff --git a/poppler/OutputDev.h b/poppler/OutputDev.h
index cdc74cf..445cae0 100644
--- a/poppler/OutputDev.h
+++ b/poppler/OutputDev.h
@@ -37,6 +37,7 @@
 #include "goo/gtypes.h"
 #include "CharTypes.h"
 #include "Object.h"
+#include "Page.h"
 
 class Dict;
 class GooHash;
@@ -52,7 +53,7 @@ class Stream;
 class Links;
 class Link;
 class Catalog;
-class Page;
+//ben class Page;
 class Function;
 
 //------------------------------------------------------------------------
@@ -122,7 +123,7 @@ public:
   // OutputDev will use some alternate means to display the page
   // before returning false.
   virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI,
-                              int rotate, GBool useMediaBox, GBool crop,
+                               int rotate, Page::PageBox cropBox,
                               int sliceX, int sliceY, int sliceW, int sliceH,
                               GBool printing, Catalog * catalog,
                               GBool (* abortCheckCbk)(void *data) = NULL,
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index 8155250..6283a0c 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -376,7 +376,7 @@ GBool PDFDoc::checkEncryption(GooString *ownerPassword, 
GooString *userPassword)
 
 void PDFDoc::displayPage(OutputDev *out, int page,
                         double hDPI, double vDPI, int rotate,
-                        GBool useMediaBox, GBool crop, GBool printing,
+                         Page::PageBox cropBox, GBool printing,
                         GBool (*abortCheckCbk)(void *data),
                         void *abortCheckCbkData,
                          GBool (*annotDisplayDecideCbk)(Annot *annot, void 
*user_data),
@@ -386,14 +386,14 @@ void PDFDoc::displayPage(OutputDev *out, int page,
   }
   if (catalog->getPage(page))
     catalog->getPage(page)->display(out, hDPI, vDPI,
-                                   rotate, useMediaBox, crop, printing, 
catalog,
+                                    rotate, cropBox, printing, catalog,
                                    abortCheckCbk, abortCheckCbkData,
                                    annotDisplayDecideCbk, 
annotDisplayDecideCbkData);
 }
 
 void PDFDoc::displayPages(OutputDev *out, int firstPage, int lastPage,
                          double hDPI, double vDPI, int rotate,
-                         GBool useMediaBox, GBool crop, GBool printing,
+                          Page::PageBox cropBox, GBool printing,
                          GBool (*abortCheckCbk)(void *data),
                          void *abortCheckCbkData,
                           GBool (*annotDisplayDecideCbk)(Annot *annot, void 
*user_data),
@@ -401,7 +401,7 @@ void PDFDoc::displayPages(OutputDev *out, int firstPage, 
int lastPage,
   int page;
 
   for (page = firstPage; page <= lastPage; ++page) {
-    displayPage(out, page, hDPI, vDPI, rotate, useMediaBox, crop, printing,
+    displayPage(out, page, hDPI, vDPI, rotate, cropBox, printing,
                abortCheckCbk, abortCheckCbkData,
                 annotDisplayDecideCbk, annotDisplayDecideCbkData);
   }
@@ -409,7 +409,7 @@ void PDFDoc::displayPages(OutputDev *out, int firstPage, 
int lastPage,
 
 void PDFDoc::displayPageSlice(OutputDev *out, int page,
                              double hDPI, double vDPI, int rotate,
-                             GBool useMediaBox, GBool crop, GBool printing,
+                              /*GBool useMediaBox, GBool crop*/Page::PageBox 
cropBox, GBool printing,
                              int sliceX, int sliceY, int sliceW, int sliceH,
                              GBool (*abortCheckCbk)(void *data),
                              void *abortCheckCbkData,
@@ -417,7 +417,7 @@ void PDFDoc::displayPageSlice(OutputDev *out, int page,
                               void *annotDisplayDecideCbkData) {
   if (catalog->getPage(page))
     catalog->getPage(page)->displaySlice(out, hDPI, vDPI,
-                                        rotate, useMediaBox, crop,
+                                         rotate, cropBox,
                                         sliceX, sliceY, sliceW, sliceH,
                                         printing, catalog,
                                         abortCheckCbk, abortCheckCbkData,
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
index 8fa2dcf..e4c807f 100644
--- a/poppler/PDFDoc.h
+++ b/poppler/PDFDoc.h
@@ -127,7 +127,7 @@ public:
   // Display a page.
   void displayPage(OutputDev *out, int page,
                   double hDPI, double vDPI, int rotate,
-                  GBool useMediaBox, GBool crop, GBool printing,
+                   /*GBool useMediaBox, GBool crop*/Page::PageBox cropBox, 
GBool printing,
                   GBool (*abortCheckCbk)(void *data) = NULL,
                   void *abortCheckCbkData = NULL,
                    GBool (*annotDisplayDecideCbk)(Annot *annot, void 
*user_data) = NULL,
@@ -136,7 +136,7 @@ public:
   // Display a range of pages.
   void displayPages(OutputDev *out, int firstPage, int lastPage,
                    double hDPI, double vDPI, int rotate,
-                   GBool useMediaBox, GBool crop, GBool printing,
+                    /*GBool useMediaBox, GBool crop*/Page::PageBox cropBox, 
GBool printing,
                    GBool (*abortCheckCbk)(void *data) = NULL,
                    void *abortCheckCbkData = NULL,
                     GBool (*annotDisplayDecideCbk)(Annot *annot, void 
*user_data) = NULL,
@@ -145,7 +145,7 @@ public:
   // Display part of a page.
   void displayPageSlice(OutputDev *out, int page,
                        double hDPI, double vDPI, int rotate, 
-                       GBool useMediaBox, GBool crop, GBool printing,
+                        /*GBool useMediaBox, GBool crop*/Page::PageBox 
cropBox, GBool printing,
                        int sliceX, int sliceY, int sliceW, int sliceH,
                        GBool (*abortCheckCbk)(void *data) = NULL,
                        void *abortCheckCbkData = NULL,
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
index f7e4b8c..ae0c518 100644
--- a/poppler/PSOutputDev.cc
+++ b/poppler/PSOutputDev.cc
@@ -2941,7 +2941,7 @@ void PSOutputDev::setupForm(Ref id, Object *strObj) {
 }
 
 GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/,
-                                 int rotateA, GBool useMediaBox, GBool crop,
+                                  int rotateA, /*GBool useMediaBox, GBool 
crop*/ Page::PageBox cropBox,
                                  int sliceX, int sliceY,
                                  int sliceW, int sliceH,
                                  GBool printing, Catalog *catalog,
@@ -2964,7 +2964,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double 
/*hDPI*/, double /*vDPI*/,
 
   if (!forceRasterize) {
     scan = new PreScanOutputDev();
-    page->displaySlice(scan, 72, 72, rotateA, useMediaBox, crop,
+    page->displaySlice(scan, 72, 72, rotateA, cropBox,
                      sliceX, sliceY, sliceW, sliceH,
                      printing, catalog, abortCheckCbk, abortCheckCbkData);
     rasterize = scan->usesTransparency();
@@ -2998,13 +2998,13 @@ GBool PSOutputDev::checkPageSlice(Page *page, double 
/*hDPI*/, double /*vDPI*/,
   }
   splashOut->startDoc(xref);
   page->displaySlice(splashOut, splashDPI, splashDPI, rotateA,
-                    useMediaBox, crop,
+                     cropBox,
                     sliceX, sliceY, sliceW, sliceH,
                     printing, catalog, abortCheckCbk, abortCheckCbkData);
 
   // start the PS page
-  page->makeBox(splashDPI, splashDPI, rotateA, useMediaBox, gFalse,
-               sliceX, sliceY, sliceW, sliceH, &box, &crop);
+  page->makeBox(splashDPI, splashDPI, rotateA, cropBox, gFalse,
+                sliceX, sliceY, sliceW, sliceH, &box/*, &crop*/);
   rotateA += page->getRotate();
   if (rotateA >= 360) {
     rotateA -= 360;
diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h
index 2ac7b13..955f6b7 100644
--- a/poppler/PSOutputDev.h
+++ b/poppler/PSOutputDev.h
@@ -161,7 +161,9 @@ public:
   // OutputDev will use some alternate means to display the page
   // before returning false.
   virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI,
-                              int rotate, GBool useMediaBox, GBool crop,
+                               int rotate,
+                               //GBool useMediaBox, GBool crop,
+                               Page::PageBox cropBox,
                               int sliceX, int sliceY, int sliceW, int sliceH,
                               GBool printing, Catalog *catalog,
                               GBool (*abortCheckCbk)(void *data) = NULL,
diff --git a/poppler/Page.cc b/poppler/Page.cc
index caf233f..bcb7d4e 100644
--- a/poppler/Page.cc
+++ b/poppler/Page.cc
@@ -400,26 +400,29 @@ Links *Page::getLinks(Catalog *catalog) {
 }
 
 void Page::display(OutputDev *out, double hDPI, double vDPI,
-                  int rotate, GBool useMediaBox, GBool crop,
+                   int rotate, Page::PageBox cropBox,
                   GBool printing, Catalog *catalog,
                   GBool (*abortCheckCbk)(void *data),
                   void *abortCheckCbkData,
                    GBool (*annotDisplayDecideCbk)(Annot *annot, void 
*user_data),
                    void *annotDisplayDecideCbkData) {
-  displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop, -1, -1, -1, -1, 
printing, catalog,
+  displaySlice(out, hDPI, vDPI, rotate, cropBox, -1, -1, -1, -1, printing, 
catalog,
               abortCheckCbk, abortCheckCbkData,
                annotDisplayDecideCbk, annotDisplayDecideCbkData);
 }
 
 Gfx *Page::createGfx(OutputDev *out, double hDPI, double vDPI,
-                    int rotate, GBool useMediaBox, GBool crop,
+                     int rotate,
+                     // GBool useMediaBox, GBool crop,
+                     Page::PageBox boxSelectedForCropping,
                     int sliceX, int sliceY, int sliceW, int sliceH,
                     GBool printing, Catalog *catalog,
                     GBool (*abortCheckCbk)(void *data),
                     void *abortCheckCbkData,
                     GBool (*annotDisplayDecideCbk)(Annot *annot, void 
*user_data),
                     void *annotDisplayDecideCbkData) {
-  PDFRectangle *mediaBox, *cropBox;
+
+  // A PDFRectangle matching the box that we want to crop to.
   PDFRectangle box;
   Gfx *gfx;
 
@@ -430,28 +433,59 @@ Gfx *Page::createGfx(OutputDev *out, double hDPI, double 
vDPI,
     rotate += 360;
   }
 
-  makeBox(hDPI, vDPI, rotate, useMediaBox, out->upsideDown(),
-         sliceX, sliceY, sliceW, sliceH, &box, &crop);
-  cropBox = getCropBox();
-  mediaBox = getMediaBox();
+  PDFRectangle *cropBox = getCropBox();
+  PDFRectangle *mediaBox = getMediaBox();
+  PDFRectangle *bleedBox = getBleedBox();
+  PDFRectangle *trimBox = getTrimBox();
+  PDFRectangle *artBox = getArtBox();
+
+  // I suppose this sizes "box" appropriately.
+  // makeBox(hDPI, vDPI, rotate, useMediaBox, out->upsideDown(), sliceX, 
sliceY, sliceW, sliceH, &box, &crop);
+  makeBox(hDPI, vDPI, rotate, boxSelectedForCropping, out->upsideDown(), 
sliceX, sliceY, sliceW, sliceH, &box);
 
   if (globalParams->getPrintCommands()) {
     printf("***** MediaBox = ll:%g,%g ur:%g,%g\n",
            mediaBox->x1, mediaBox->y1, mediaBox->x2, mediaBox->y2);
       printf("***** CropBox = ll:%g,%g ur:%g,%g\n",
             cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2);
+      printf("***** BleedBox = ll:%g,%g ur:%g,%g\n",
+             bleedBox->x1, bleedBox->y1, bleedBox->x2, bleedBox->y2);
+      printf("***** TrimBox = ll:%g,%g ur:%g,%g\n",
+             trimBox->x1, trimBox->y1, trimBox->x2, trimBox->y2);
+      printf("***** ArtBox = ll:%g,%g ur:%g,%g\n",
+             artBox->x1, artBox->y1, artBox->x2, artBox->y2);
     printf("***** Rotate = %d\n", attrs->getRotate());
   }
 
+  PDFRectangle *pdfRectangleToUseForCropping = NULL;
+  if (boxSelectedForCropping == Page::mediaBox) {
+      pdfRectangleToUseForCropping = NULL;
+  } else if (boxSelectedForCropping == Page::cropBox) {
+      pdfRectangleToUseForCropping = cropBox;
+  } else if (boxSelectedForCropping == Page::bleedBox) {
+      pdfRectangleToUseForCropping = bleedBox;
+  } else if (boxSelectedForCropping == Page::trimBox) {
+      pdfRectangleToUseForCropping = trimBox;
+  } else if (boxSelectedForCropping == Page::artBox) {
+      pdfRectangleToUseForCropping = artBox;
+  }
+
+  printf("ben: boxSelectedForCropping: %d\n", boxSelectedForCropping);
+  printf("ben: PDFRectangle1: %1.2f %1.2f %1.2f %1.2f\n", box.x1, box.y1, 
box.x2, box.y2);
+  if(boxSelectedForCropping)
+      printf("ben: PDFRectangle2: %1.2f %1.2f %1.2f %1.2f\n", 
pdfRectangleToUseForCropping->x1, pdfRectangleToUseForCropping->y1, 
pdfRectangleToUseForCropping->x2, pdfRectangleToUseForCropping->y2);
+  else
+      printf("ben: PDFRectangle2: is NULL\n");
+
   gfx = new Gfx(xref, out, num, attrs->getResourceDict(), catalog,
-               hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL,
+                hDPI, vDPI, &box, pdfRectangleToUseForCropping,
                rotate, abortCheckCbk, abortCheckCbkData);
 
   return gfx;
 }
 
 void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
-                       int rotate, GBool useMediaBox, GBool crop,
+                        int rotate, Page::PageBox cropBox,
                        int sliceX, int sliceY, int sliceW, int sliceH,
                        GBool printing, Catalog *catalog,
                        GBool (*abortCheckCbk)(void *data),
@@ -463,14 +497,16 @@ void Page::displaySlice(OutputDev *out, double hDPI, 
double vDPI,
   Annots *annotList;
   int i;
   
-  if (!out->checkPageSlice(this, hDPI, vDPI, rotate, useMediaBox, crop,
+  if (!out->checkPageSlice(this, hDPI, vDPI, rotate, cropBox,
                           sliceX, sliceY, sliceW, sliceH,
                           printing, catalog,
                           abortCheckCbk, abortCheckCbkData)) {
+      printf("ben: not displaying, checkPageSlice is false");
     return;
   }
 
-  gfx = createGfx(out, hDPI, vDPI, rotate, useMediaBox, crop,
+  printf("ben: createGfx(): %d\n", cropBox);
+  gfx = createGfx(out, hDPI, vDPI, rotate, cropBox,
                  sliceX, sliceY, sliceW, sliceH,
                  printing, catalog,
                  abortCheckCbk, abortCheckCbkData,
@@ -623,17 +659,39 @@ GBool Page::loadThumb(unsigned char **data_out,
   return success;
 }
 
+/*
 void Page::makeBox(double hDPI, double vDPI, int rotate,
                   GBool useMediaBox, GBool upsideDown,
                   double sliceX, double sliceY, double sliceW, double sliceH,
-                  PDFRectangle *box, GBool *crop) {
-  PDFRectangle *mediaBox, *cropBox, *baseBox;
+                   PDFRectangle *box, GBool *crop) {*/
+
+void Page::makeBox(double hDPI, double vDPI, int rotate,
+                   Page::PageBox cropBox, GBool upsideDown,
+                   double sliceX, double sliceY, double sliceW, double sliceH,
+                   PDFRectangle *box) {
+//  PDFRectangle *mediaBox, *cropBox, *baseBox;
+    PDFRectangle *baseBox = getMediaBox();
   double kx, ky;
 
-  mediaBox = getMediaBox();
-  cropBox = getCropBox();
+//  mediaBox = getMediaBox();
+//  cropBox = getCropBox();
+  printf("ben: makeBox cropBox: %d\n", cropBox);
+  printf("ben: makeBox sliceW %.2f, sliceH %.2f\n", sliceW, sliceH);
   if (sliceW >= 0 && sliceH >= 0) {
-    baseBox = useMediaBox ? mediaBox : cropBox;
+
+      // baseBox = useMediaBox ? mediaBox : cropBox;
+      // MediaBox/CropBox/BleedBox/TrimBox/ArtBox
+      printf("ben: slice is>0, box is: %d\n", cropBox);
+      if (cropBox == Page::cropBox) {
+          baseBox = getCropBox();
+      } else if (cropBox == Page::bleedBox) {
+          baseBox = getBleedBox();
+      } else if (cropBox == Page::trimBox) {
+          baseBox = getTrimBox();
+      } else if (cropBox == Page::artBox) {
+          baseBox = getArtBox();
+      }
+
     kx = 72.0 / hDPI;
     ky = 72.0 / vDPI;
     if (rotate == 90) {
@@ -677,12 +735,34 @@ void Page::makeBox(double hDPI, double vDPI, int rotate,
        box->y2 = baseBox->y1 + ky * (sliceY + sliceH);
       }
     }
-  } else if (useMediaBox) {
-    *box = *mediaBox;
+  } else if (cropBox == Page::mediaBox) {
+    //*box = *mediaBox;
+      printf("ben: makeBox using mediaBox\n");
+      *box = *getMediaBox();
+  } else if (cropBox == Page::cropBox) {
+    //*box = *mediaBox;
+      printf("ben: makeBox using cropBox\n");
+      *box = *getCropBox();
+  } else if (cropBox == Page::bleedBox) {
+    //*box = *mediaBox;
+      printf("ben: makeBox using bleedBox\n");
+      *box = *getBleedBox();
+  } else if (cropBox == Page::trimBox) {
+    //*box = *mediaBox;
+      printf("ben: makeBox using trimBox\n");
+      *box = *getTrimBox();
+  } else if (cropBox == Page::artBox) {
+    //*box = *mediaBox;
+      printf("ben: makeBox using artBox\n");
+      *box = *getArtBox();
   } else {
-    *box = *cropBox;
-    *crop = gFalse;
+    //*box = *cropBox;
+      printf("ben: makeBox ERROR!\n");
+      *box = *getMediaBox();
+    //*crop = gFalse;
   }
+
+  printf("ben: After makeBox, box will be %.2f %.2f %.2f %.2f\n", box->x1, 
box->y1, box->x2, box->y2);
 }
 
 void Page::processLinks(OutputDev *out, Catalog *catalog) {
diff --git a/poppler/Page.h b/poppler/Page.h
index 9d892b1..be64bb5 100644
--- a/poppler/Page.h
+++ b/poppler/Page.h
@@ -134,6 +134,9 @@ public:
   // Is page valid?
   GBool isOk() { return ok; }
 
+  // Available page-boxes, used for cropping.
+  enum PageBox { mediaBox, cropBox, bleedBox, trimBox, artBox };
+
   // Get page parameters.
   int getNum() { return num; }
   PDFRectangle *getMediaBox() { return attrs->getMediaBox(); }
@@ -194,7 +197,7 @@ public:
   Object *getActions(Object *obj) { return actions.fetch(xref, obj); }
 
   Gfx *createGfx(OutputDev *out, double hDPI, double vDPI,
-                int rotate, GBool useMediaBox, GBool crop,
+                 int rotate, /*GBool useMediaBox, GBool crop*/Page::PageBox 
cropBox,
                 int sliceX, int sliceY, int sliceW, int sliceH,
                 GBool printing, Catalog *catalog,
                 GBool (*abortCheckCbk)(void *data),
@@ -204,7 +207,7 @@ public:
 
   // Display a page.
   void display(OutputDev *out, double hDPI, double vDPI,
-              int rotate, GBool useMediaBox, GBool crop,
+               int rotate, /*GBool useMediaBox, GBool crop*/Page::PageBox 
cropBox,
               GBool printing, Catalog *catalog,
               GBool (*abortCheckCbk)(void *data) = NULL,
               void *abortCheckCbkData = NULL,
@@ -213,7 +216,7 @@ public:
 
   // Display part of a page.
   void displaySlice(OutputDev *out, double hDPI, double vDPI,
-                   int rotate, GBool useMediaBox, GBool crop,
+                    int rotate, /*GBool useMediaBox, GBool crop*/Page::PageBox 
cropBox,
                    int sliceX, int sliceY, int sliceW, int sliceH,
                    GBool printing, Catalog *catalog,
                    GBool (*abortCheckCbk)(void *data) = NULL,
@@ -224,9 +227,9 @@ public:
   void display(Gfx *gfx);
 
   void makeBox(double hDPI, double vDPI, int rotate,
-              GBool useMediaBox, GBool upsideDown,
+               Page::PageBox cropBox, GBool upsideDown,
               double sliceX, double sliceY, double sliceW, double sliceH,
-              PDFRectangle *box, GBool *crop);
+               PDFRectangle *box);
 
   void processLinks(OutputDev *out, Catalog *catalog);
 
diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
index 293d09b..c35354b 100644
--- a/qt4/src/poppler-page.cc
+++ b/qt4/src/poppler-page.cc
@@ -34,6 +34,8 @@
 
 #include <config.h>
 #include <PDFDoc.h>
+// ben
+#include <Page.h>
 #include <Catalog.h>
 #include <Form.h>
 #include <ErrorCodes.h>
@@ -212,7 +214,7 @@ QImage Page::renderToImage(double xres, double yres, int x, 
int y, int w, int h,
       SplashOutputDev *splash_output = static_cast<SplashOutputDev 
*>(m_page->parentDoc->getOutputDev());
 
       m_page->parentDoc->doc->displayPageSlice(splash_output, m_page->index + 
1, xres, yres,
-                                                rotation, false, true, false, 
x, y, w, h);
+                                                 rotation, 
::Page::cropBox/*false, true*/, false, x, y, w, h);
 
       SplashBitmap *bitmap = splash_output->getBitmap();
       int bw = bitmap->getWidth();
@@ -262,8 +264,7 @@ QImage Page::renderToImage(double xres, double yres, int x, 
int y, int w, int h,
                                                 xres,
                                                 yres,
                                                 rotation,
-                                                false,
-                                                true,
+                                                 ::Page::cropBox,
                                                 false,
                                                 x,
                                                 y,
@@ -306,7 +307,7 @@ QString Page::text(const QRectF &r, TextLayout textLayout) 
const
   const GBool rawOrder = textLayout == RawOrderLayout;
   output_dev = new TextOutputDev(0, gFalse, rawOrder, gFalse);
   m_page->parentDoc->doc->displayPageSlice(output_dev, m_page->index + 1, 72, 
72,
-      0, false, true, false, -1, -1, -1, -1);
+      0, ::Page::cropBox, false, -1, -1, -1, -1);
   if (r.isNull())
   {
     rect = m_page->page->getCropBox();
@@ -346,7 +347,7 @@ bool Page::search(const QString &text, double &sLeft, 
double &sTop, double &sRig
 
   // fetch ourselves a textpage
   TextOutputDev td(NULL, gTrue, gFalse, gFalse);
-  m_page->parentDoc->doc->displayPage( &td, m_page->index + 1, 72, 72, 
rotation, false, true, false );
+  m_page->parentDoc->doc->displayPage( &td, m_page->index + 1, 72, 72, 
rotation, ::Page::cropBox, false );
   TextPage *textPage=td.takeText();
 
   if (direction == FromTop)
@@ -392,8 +393,12 @@ QList<TextBox*> Page::textList(Rotation rotate) const
   
   int rotation = (int)rotate * 90;
 
+// Help! Which pageBox does "useMediaBox:false, crop:false" correspond to? 
Neither mediaBox nor cropBox?
+//  m_page->parentDoc->doc->displayPageSlice(output_dev, m_page->index + 1, 
72, 72,
+//      rotation, false, false, false, -1, -1, -1, -1);
+
   m_page->parentDoc->doc->displayPageSlice(output_dev, m_page->index + 1, 72, 
72,
-      rotation, false, false, false, -1, -1, -1, -1);
+      rotation, ::Page::mediaBox, false, -1, -1, -1, -1);
 
   TextWordList *word_list = output_dev->makeWordList();
   
diff --git a/qt4/src/poppler-ps-converter.cc b/qt4/src/poppler-ps-converter.cc
index f39673d..95bf9d5 100644
--- a/qt4/src/poppler-ps-converter.cc
+++ b/qt4/src/poppler-ps-converter.cc
@@ -231,7 +231,7 @@ bool PSConverter::convert()
                GBool isPrinting = (d->opts & Printing) ? gTrue : gFalse;
                foreach(int page, d->pageList)
                {
-                       d->document->doc->displayPage(psOut, page, d->hDPI, 
d->vDPI, d->rotate, gFalse, gTrue, isPrinting);
+                        d->document->doc->displayPage(psOut, page, d->hDPI, 
d->vDPI, d->rotate, ::Page::cropBox, isPrinting);
                        if (d->pageConvertedCallback)
                                (*d->pageConvertedCallback)(page, 
d->pageConvertedPayload);
                }
diff --git a/test/perf-test.cc b/test/perf-test.cc
index 6d6961e..972a49d 100644
--- a/test/perf-test.cc
+++ b/test/perf-test.cc
@@ -443,11 +443,10 @@ SplashBitmap *PdfEnginePoppler::renderBitmap(int pageNo, 
double zoomReal, int ro
 
     double hDPI = (double)PDF_FILE_DPI * zoomReal * 0.01;
     double vDPI = (double)PDF_FILE_DPI * zoomReal * 0.01;
-    GBool  useMediaBox = gFalse;
-    GBool  crop        = gTrue;
+//    GBool  useMediaBox = gFalse;
+//    GBool  crop        = gTrue;
     GBool  doLinks     = gTrue;
-    _pdfDoc->displayPage(_outputDev, pageNo, hDPI, vDPI, rotation, 
useMediaBox, 
-        crop, doLinks, NULL, NULL);
+    _pdfDoc->displayPage(_outputDev, pageNo, hDPI, vDPI, rotation, 
Page::cropBox, doLinks, NULL, NULL);
 
     SplashBitmap* bmp = _outputDev->takeBitmap();
     return bmp;
@@ -871,10 +870,10 @@ static void RenderPdfAsText(const char *fileName)
 
         msTimer.start();
         int rotate = 0;
-        GBool useMediaBox = gFalse;
-        GBool crop = gTrue;
+//        GBool useMediaBox = gFalse;
+//        GBool crop = gTrue;
         GBool doLinks = gFalse;
-        pdfDoc->displayPage(textOut, curPage, 72, 72, rotate, useMediaBox, 
crop, doLinks);
+        pdfDoc->displayPage(textOut, curPage, 72, 72, rotate, Page::cropBox, 
doLinks);
         txt = textOut->getText(0.0, 0.0, 10000.0, 10000.0);
         msTimer.stop();
         timeInMs = msTimer.getElapsed();
diff --git a/utils/HtmlOutputDev.h b/utils/HtmlOutputDev.h
index 24ccfd1..55cc7b4 100644
--- a/utils/HtmlOutputDev.h
+++ b/utils/HtmlOutputDev.h
@@ -250,7 +250,7 @@ public:
   //----- initialization and control
 
   virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI,
-                               int rotate, GBool useMediaBox, GBool crop,
+                               int rotate, Page::PageBox cropBox/*GBool 
useMediaBox, GBool crop*/,
                                int sliceX, int sliceY, int sliceW, int sliceH,
                                GBool printing, Catalog * catalogA,
                                GBool (* abortCheckCbk)(void *data) = NULL,
diff --git a/utils/pdfimages.cc b/utils/pdfimages.cc
index ffa7991..5f332cd 100644
--- a/utils/pdfimages.cc
+++ b/utils/pdfimages.cc
@@ -160,7 +160,7 @@ int main(int argc, char *argv[]) {
   imgOut = new ImageOutputDev(imgRoot, dumpJPEG);
   if (imgOut->isOk()) {
       doc->displayPages(imgOut, firstPage, lastPage, 72, 72, 0,
-                       gTrue, gFalse, gFalse);
+                        Page::mediaBox, gFalse);
   }
   delete imgOut;
 
diff --git a/utils/pdftoabw.cc b/utils/pdftoabw.cc
index 5a53281..407df43 100644
--- a/utils/pdftoabw.cc
+++ b/utils/pdftoabw.cc
@@ -173,7 +173,7 @@ int main(int argc, char *argv[]) {
 
   if (abwOut->isOk())
   {
-    doc->displayPages(abwOut, firstPage, lastPage, 72, 72, 0, gTrue, gFalse, 
gFalse);
+    doc->displayPages(abwOut, firstPage, lastPage, 72, 72, 0, Page::mediaBox, 
gFalse);
     abwOut->createABW();
   }
 
diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc
index 5323b6e..48a7b0e 100644
--- a/utils/pdftohtml.cc
+++ b/utils/pdftohtml.cc
@@ -402,7 +402,7 @@ int main(int argc, char *argv[]) {
   if (htmlOut->isOk())
   {
     doc->displayPages(htmlOut, firstPage, lastPage, 72, 72, 0,
-                     gTrue, gFalse, gFalse);
+                      Page::mediaBox, gFalse);
        if (!xml)
        {
                htmlOut->dumpDocOutline(doc->getCatalog());
@@ -434,7 +434,7 @@ int main(int argc, char *argv[]) {
 
         doc->displayPage(splashOut, pg,
                          resolution, resolution,
-                         0, gTrue, gFalse, gFalse);
+                         0, Page::mediaBox, gFalse);
         SplashBitmap *bitmap = splashOut->getBitmap();
 
         imgFileName = GooString::format("{0:s}{1:03d}.{2:s}", 
@@ -461,7 +461,7 @@ int main(int argc, char *argv[]) {
           doc->getCatalog(), NULL, firstPage, lastPage, psModePS, w, h);
       psOut->setDisplayText(gFalse);
       doc->displayPages(psOut, firstPage, lastPage, 72, 72, 0,
-          gTrue, gFalse, gFalse);
+          Page::mediaBox, gFalse);
       delete psOut;
 
       /*sprintf(buf, "%s -sDEVICE=png16m -dBATCH -dNOPROMPT -dNOPAUSE -r%d 
-sOutputFile=%s%%03d.png -g%dx%d -q %s", GHOSTSCRIPT, resolution, 
htmlFileName->getCString(), w, h,
diff --git a/utils/pdftoppm.cc b/utils/pdftoppm.cc
index c4cc43b..e34a03f 100644
--- a/utils/pdftoppm.cc
+++ b/utils/pdftoppm.cc
@@ -65,6 +65,8 @@ static int w = 0;
 static int h = 0;
 static int sz = 0;
 static GBool useCropBox = gFalse;
+// ben
+static char pageBoxString[33] = "\001";
 static GBool mono = gFalse;
 static GBool gray = gFalse;
 static GBool png = gFalse;
@@ -112,7 +114,10 @@ static const ArgDesc argDesc[] = {
   {"-sz",     argInt,      &sz,            0,
    "size of crop square in pixels (sets W and H)"},
   {"-cropbox",argFlag,     &useCropBox,    0,
-   "use the crop box rather than media box"},
+   "use the crop box rather than media box. Deprecated, use -crop"},
+  {"-crop",   argString,   pageBoxString,   sizeof(pageBoxString),
+   "Crop using MediaBox(default)/CropBox/BleedBox/TrimBox/ArtBox"},
+
 
   {"-mono",   argFlag,     &mono,          0,
    "generate a monochrome PBM file"},
@@ -158,6 +163,7 @@ static const ArgDesc argDesc[] = {
 
 static void savePageSlice(PDFDoc *doc,
                    SplashOutputDev *splashOut, 
+                   Page::PageBox pageBox,
                    int pg, int x, int y, int w, int h, 
                    double pg_w, double pg_h, 
                    char *ppmFile) {
@@ -165,10 +171,15 @@ static void savePageSlice(PDFDoc *doc,
   if (h == 0) h = (int)ceil(pg_h);
   w = (x+w > pg_w ? (int)ceil(pg_w-x) : w);
   h = (y+h > pg_h ? (int)ceil(pg_h-y) : h);
+
+  // For backwards-compatibility with -cropbox
+  if(useCropBox) pageBox = Page::cropBox;
+
   doc->displayPageSlice(splashOut, 
     pg, x_resolution, y_resolution, 
     0,
-    !useCropBox, gFalse, gFalse,
+    pageBox,
+    gFalse,
     x, y, w, h
   );
 
@@ -222,6 +233,10 @@ int main(int argc, char *argv[]) {
   int pg, pg_num_len;
   double pg_w, pg_h, tmp;
 
+  // This holds the PageBox to be used for cropping, as selected by the user 
using
+  // the -crop parameter. MediaBox is the default.
+  Page::PageBox pageBox = Page::mediaBox;
+
   exitCode = 99;
 
   // parse args
@@ -307,6 +322,23 @@ int main(int argc, char *argv[]) {
   if (lastPage < 1 || lastPage > doc->getNumPages())
     lastPage = doc->getNumPages();
 
+
+  // set up pagebox as desired by user.
+  if (pageBoxString[0] != '\001') {
+      // MediaBox/CropBox/BleedBox/TrimBox/ArtBox
+      if (!strcasecmp(pageBoxString, "MediaBox")) {
+        pageBox = Page::mediaBox;
+      } else if (!strcasecmp(pageBoxString, "CropBox")) {
+        pageBox = Page::cropBox;
+      } else if (!strcasecmp(pageBoxString, "BleedBox")) {
+        pageBox = Page::bleedBox;
+      } else if (!strcasecmp(pageBoxString, "TrimBox")) {
+        pageBox = Page::trimBox;
+      } else if (!strcasecmp(pageBoxString, "ArtBox")) {
+        pageBox = Page::artBox;
+      }
+  }
+
   // write PPM files
   paperColor[0] = 255;
   paperColor[1] = 255;
@@ -351,9 +383,9 @@ int main(int argc, char *argv[]) {
       snprintf(ppmFile, PPM_FILE_SZ, "%.*s-%0*d.%s",
               PPM_FILE_SZ - 32, ppmRoot, pg_num_len, pg,
               png ? "png" : jpeg ? "jpg" : mono ? "pbm" : gray ? "pgm" : 
"ppm");
-      savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, ppmFile);
+      savePageSlice(doc, splashOut, pageBox, pg, x, y, w, h, pg_w, pg_h, 
ppmFile);
     } else {
-      savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, NULL);
+      savePageSlice(doc, splashOut, pageBox, pg, x, y, w, h, pg_w, pg_h, NULL);
     }
   }
   delete splashOut;
diff --git a/utils/pdftops.cc b/utils/pdftops.cc
index 0bc43a1..0384c3e 100644
--- a/utils/pdftops.cc
+++ b/utils/pdftops.cc
@@ -94,6 +94,8 @@ static char paperSize[15] = "";
 static int paperWidth = -1;
 static int paperHeight = -1;
 static GBool noCrop = gFalse;
+// ben
+static char pageBoxString[33] = "\001";
 static GBool expand = gFalse;
 static GBool noShrink = gFalse;
 static GBool noCenter = gFalse;
@@ -150,7 +152,11 @@ static const ArgDesc argDesc[] = {
   {"-paperh",     argInt,      &paperHeight,    0,
    "paper height, in points"},
   {"-nocrop",     argFlag,     &noCrop,         0,
-   "don't crop pages to CropBox"},
+   "don't crop pages to CropBox. Deprecated, use -crop"},
+// ben
+  {"-crop",       argString,   pageBoxString,   sizeof(pageBoxString),
+   "Crop using MediaBox(default)/CropBox/BleedBox/TrimBox/ArtBox"},
+
   {"-expand",     argFlag,     &expand,         0,
    "expand pages smaller than the paper size"},
   {"-noshrink",   argFlag,     &noShrink,       0,
@@ -185,6 +191,11 @@ int main(int argc, char *argv[]) {
   PSLevel level;
   PSOutMode mode;
   GooString *ownerPW, *userPW;
+
+  // This holds the PageBox to be used for cropping, as selected by the user 
using
+  // the -crop parameter. MediaBox is the default.
+  Page::PageBox pageBox = Page::mediaBox;
+
   PSOutputDev *psOut;
   GBool ok;
   char *p;
@@ -358,6 +369,22 @@ int main(int argc, char *argv[]) {
     goto err2;
   }
 
+  // set up cropbox as desired by user.
+  if (pageBoxString[0] != '\001') {
+      // MediaBox/CropBox/BleedBox/TrimBox/ArtBox
+      if (!strcasecmp(pageBoxString, "MediaBox")) {
+        pageBox = Page::mediaBox;
+      } else if (!strcasecmp(pageBoxString, "CropBox")) {
+        pageBox = Page::cropBox;
+      } else if (!strcasecmp(pageBoxString, "BleedBox")) {
+        pageBox = Page::bleedBox;
+      } else if (!strcasecmp(pageBoxString, "TrimBox")) {
+        pageBox = Page::trimBox;
+      } else if (!strcasecmp(pageBoxString, "ArtBox")) {
+        pageBox = Page::artBox;
+      }
+  }
+
   // write PostScript file
   psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
                          doc->getCatalog(), NULL, firstPage, lastPage, mode,
@@ -365,8 +392,8 @@ int main(int argc, char *argv[]) {
                          paperHeight,
                          duplex);
   if (psOut->isOk()) {
-    doc->displayPages(psOut, firstPage, lastPage, 72, 72,
-                     0, noCrop, !noCrop, gTrue);
+//      ben: fprintf(stderr, "now displayPage with box %d\n", pageCropBox);
+    doc->displayPages(psOut, firstPage, lastPage, 72, 72, 0, pageBox, gTrue);
   } else {
     delete psOut;
     exitCode = 2;
diff --git a/utils/pdftotext.cc b/utils/pdftotext.cc
index b189e84..88b6eac 100644
--- a/utils/pdftotext.cc
+++ b/utils/pdftotext.cc
@@ -339,7 +339,7 @@ int main(int argc, char *argv[]) {
       fprintf(f, "<doc>\n");
       for (int page = firstPage; page <= lastPage; ++page) {
         fprintf(f, "  <page width=\"%f\" 
height=\"%f\">\n",doc->getPageCropWidth(page), doc->getPageCropHeight(page));
-        doc->displayPage(textOut, page, resolution, resolution, 0, gTrue, 
gFalse, gFalse);
+        doc->displayPage(textOut, page, resolution, resolution, 0, 
Page::mediaBox, gFalse);
         TextWordList *wordlist = textOut->makeWordList();
         const int word_length = wordlist != NULL ? wordlist->getLength() : 0;
         TextWord *word;
@@ -366,12 +366,12 @@ int main(int argc, char *argv[]) {
     if (textOut->isOk()) {
       if ((w==0) && (h==0) && (x==0) && (y==0)) {
        doc->displayPages(textOut, firstPage, lastPage, resolution, resolution, 
0,
-                         gTrue, gFalse, gFalse);
+                          Page::mediaBox, gFalse);
       } else {
        
        for (int page = firstPage; page <= lastPage; ++page) {
          doc->displayPageSlice(textOut, page, resolution, resolution, 0,
-                             gTrue, gFalse, gFalse, 
+                              Page::mediaBox, gFalse,
                              x, y, w, h);
        }
       }
-- 
1.6.3.3

_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to