From ee40bce861cf13c1f1ec172fc8e9118440372833 Mon Sep 17 00:00:00 2001 From: Benjamin Adler 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 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 #include +// ben +#include #include #include #include @@ -212,7 +214,7 @@ QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int h, SplashOutputDev *splash_output = static_cast(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 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, "\n"); for (int page = firstPage; page <= lastPage; ++page) { fprintf(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