[poppler] utils/pdftoppm.cc

Pino Toscano pino at kemper.freedesktop.org
Wed Oct 24 09:38:42 PDT 2012


 utils/pdftoppm.cc |  876 +++++++++++++++++++++++++++---------------------------
 1 file changed, 438 insertions(+), 438 deletions(-)

New commits:
commit 3be4e835d765f2f060e2a2e07dd23905c3212cdd
Author: Pino Toscano <pino at kde.org>
Date:   Wed Oct 24 18:37:06 2012 +0200

    dos2unix

diff --git a/utils/pdftoppm.cc b/utils/pdftoppm.cc
index ec10c4a..cebb12a 100644
--- a/utils/pdftoppm.cc
+++ b/utils/pdftoppm.cc
@@ -1,438 +1,438 @@
-//========================================================================
-//
-// pdftoppm.cc
-//
-// Copyright 2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-//========================================================================
-//
-// Modified under the Poppler project - http://poppler.freedesktop.org
-//
-// All changes made under the Poppler project to this file are licensed
-// under GPL version 2 or later
-//
-// Copyright (C) 2007 Ilmari Heikkinen <ilmari.heikkinen at gmail.com>
-// Copyright (C) 2008 Richard Airlie <richard.airlie at maglabs.net>
-// Copyright (C) 2009 Michael K. Johnson <a1237 at danlj.org>
-// Copyright (C) 2009 Shen Liang <shenzhuxi at gmail.com>
-// Copyright (C) 2009 Stefan Thomas <thomas at eload24.com>
-// Copyright (C) 2009-2011 Albert Astals Cid <aacid at kde.org>
-// Copyright (C) 2010, 2012 Adrian Johnson <ajohnson at redneon.com>
-// Copyright (C) 2010 Hib Eris <hib at hiberis.nl>
-// Copyright (C) 2010 Jonathan Liu <net147 at gmail.com>
-// Copyright (C) 2010 William Bader <williambader at hotmail.com>
-// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag at alfa.de>
-//
-// To see a description of the changes please see the Changelog file that
-// came with your tarball or type make ChangeLog if you are building from git
-//
-//========================================================================
-
-#include "config.h"
-#include <poppler-config.h>
-#ifdef _WIN32
-#include <fcntl.h> // for O_BINARY
-#include <io.h>    // for setmode
-#endif
-#include <stdio.h>
-#include <math.h>
-#include "parseargs.h"
-#include "goo/gmem.h"
-#include "goo/GooString.h"
-#include "GlobalParams.h"
-#include "Object.h"
-#include "PDFDoc.h"
-#include "PDFDocFactory.h"
-#include "splash/SplashBitmap.h"
-#include "splash/Splash.h"
-#include "SplashOutputDev.h"
-
-static int firstPage = 1;
-static int lastPage = 0;
-static GBool printOnlyOdd = gFalse;
-static GBool printOnlyEven = gFalse;
-static GBool singleFile = gFalse;
-static double resolution = 0.0;
-static double x_resolution = 150.0;
-static double y_resolution = 150.0;
-static int scaleTo = 0;
-static int x_scaleTo = 0;
-static int y_scaleTo = 0;
-static int x = 0;
-static int y = 0;
-static int w = 0;
-static int h = 0;
-static int sz = 0;
-static GBool useCropBox = gFalse;
-static GBool mono = gFalse;
-static GBool gray = gFalse;
-static GBool png = gFalse;
-static GBool jpeg = gFalse;
-static GBool jpegcmyk = gFalse;
-static GBool tiff = gFalse;
-#if SPLASH_CMYK
-static GBool overprint = gFalse;
-#endif
-static char enableFreeTypeStr[16] = "";
-static char antialiasStr[16] = "";
-static char vectorAntialiasStr[16] = "";
-static char ownerPassword[33] = "";
-static char userPassword[33] = "";
-static char TiffCompressionStr[16] = "";
-static GBool quiet = gFalse;
-static GBool printVersion = gFalse;
-static GBool printHelp = gFalse;
-
-static const ArgDesc argDesc[] = {
-  {"-f",      argInt,      &firstPage,     0,
-   "first page to print"},
-  {"-l",      argInt,      &lastPage,      0,
-   "last page to print"},
-  {"-o",      argFlag,      &printOnlyOdd, 0,
-   "print only odd pages"},
-  {"-e",      argFlag,      &printOnlyEven, 0,
-   "print only even pages"},
-  {"-singlefile", argFlag,  &singleFile,   0,
-   "write only the first page and do not add digits"},
-
-  {"-r",      argFP,       &resolution,    0,
-   "resolution, in DPI (default is 150)"},
-  {"-rx",      argFP,       &x_resolution,    0,
-   "X resolution, in DPI (default is 150)"},
-  {"-ry",      argFP,       &y_resolution,    0,
-   "Y resolution, in DPI (default is 150)"},
-  {"-scale-to",      argInt,       &scaleTo,    0,
-   "scales each page to fit within scale-to*scale-to pixel box"},
-  {"-scale-to-x",      argInt,       &x_scaleTo,    0,
-   "scales each page horizontally to fit in scale-to-x pixels"},
-  {"-scale-to-y",      argInt,       &y_scaleTo,    0,
-   "scales each page vertically to fit in scale-to-y pixels"},
-
-  {"-x",      argInt,      &x,             0,
-   "x-coordinate of the crop area top left corner"},
-  {"-y",      argInt,      &y,             0,
-   "y-coordinate of the crop area top left corner"},
-  {"-W",      argInt,      &w,             0,
-   "width of crop area in pixels (default is 0)"},
-  {"-H",      argInt,      &h,             0,
-   "height of crop area in pixels (default is 0)"},
-  {"-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"},
-
-  {"-mono",   argFlag,     &mono,          0,
-   "generate a monochrome PBM file"},
-  {"-gray",   argFlag,     &gray,          0,
-   "generate a grayscale PGM file"},
-#if ENABLE_LIBPNG
-  {"-png",    argFlag,     &png,           0,
-   "generate a PNG file"},
-#endif
-#if ENABLE_LIBJPEG
-  {"-jpeg",   argFlag,     &jpeg,           0,
-   "generate a JPEG file"},
-#if SPLASH_CMYK
-  {"-jpegcmyk",argFlag,    &jpegcmyk,       0,
-   "generate a CMYK JPEG file"},
-#endif
-#endif
-#if SPLASH_CMYK
-  {"-overprint",argFlag,   &overprint,      0,
-   "enable overprint"},
-#endif
-#if ENABLE_LIBTIFF
-  {"-tiff",    argFlag,     &tiff,           0,
-   "generate a TIFF file"},
-  {"-tiffcompression", argString, TiffCompressionStr, sizeof(TiffCompressionStr),
-   "set TIFF compression: none, packbits, jpeg, lzw, deflate"},
-#endif
-#if HAVE_FREETYPE_FREETYPE_H | HAVE_FREETYPE_H
-  {"-freetype",   argString,      enableFreeTypeStr, sizeof(enableFreeTypeStr),
-   "enable FreeType font rasterizer: yes, no"},
-#endif
-  
-  {"-aa",         argString,      antialiasStr,   sizeof(antialiasStr),
-   "enable font anti-aliasing: yes, no"},
-  {"-aaVector",   argString,      vectorAntialiasStr, sizeof(vectorAntialiasStr),
-   "enable vector anti-aliasing: yes, no"},
-  
-  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
-   "owner password (for encrypted files)"},
-  {"-upw",    argString,   userPassword,   sizeof(userPassword),
-   "user password (for encrypted files)"},
-  
-  {"-q",      argFlag,     &quiet,         0,
-   "don't print any messages or errors"},
-  {"-v",      argFlag,     &printVersion,  0,
-   "print copyright and version info"},
-  {"-h",      argFlag,     &printHelp,     0,
-   "print usage information"},
-  {"-help",   argFlag,     &printHelp,     0,
-   "print usage information"},
-  {"--help",  argFlag,     &printHelp,     0,
-   "print usage information"},
-  {"-?",      argFlag,     &printHelp,     0,
-   "print usage information"},
-  {NULL}
-};
-
-static void savePageSlice(PDFDoc *doc,
-                   SplashOutputDev *splashOut, 
-                   int pg, int x, int y, int w, int h, 
-                   double pg_w, double pg_h, 
-                   char *ppmFile) {
-  if (w == 0) w = (int)ceil(pg_w);
-  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);
-  doc->displayPageSlice(splashOut, 
-    pg, x_resolution, y_resolution, 
-    0,
-    !useCropBox, gFalse, gFalse,
-    x, y, w, h
-  );
-
-  SplashBitmap *bitmap = splashOut->getBitmap();
-  
-  if (ppmFile != NULL) {
-    if (png) {
-      bitmap->writeImgFile(splashFormatPng, ppmFile, x_resolution, y_resolution);
-    } else if (jpeg) {
-      bitmap->writeImgFile(splashFormatJpeg, ppmFile, x_resolution, y_resolution);
-    } else if (jpegcmyk) {
-      bitmap->writeImgFile(splashFormatJpegCMYK, ppmFile, x_resolution, y_resolution);
-    } else if (tiff) {
-      bitmap->writeImgFile(splashFormatTiff, ppmFile, x_resolution, y_resolution, TiffCompressionStr);
-    } else {
-      bitmap->writePNMFile(ppmFile);
-    }
-  } else {
-#ifdef _WIN32
-    setmode(fileno(stdout), O_BINARY);
-#endif
-
-    if (png) {
-      bitmap->writeImgFile(splashFormatPng, stdout, x_resolution, y_resolution);
-    } else if (jpeg) {
-      bitmap->writeImgFile(splashFormatJpeg, stdout, x_resolution, y_resolution);
-    } else if (tiff) {
-      bitmap->writeImgFile(splashFormatTiff, stdout, x_resolution, y_resolution, TiffCompressionStr);
-    } else {
-      bitmap->writePNMFile(stdout);
-    }
-  }
-}
-
-static int numberOfCharacters(unsigned int n)
-{
-  int charNum = 0;
-  while (n >= 10)
-  {
-    n = n / 10;
-    charNum++;
-  }
-  charNum++;
-  return charNum;
-}
-
-int main(int argc, char *argv[]) {
-  PDFDoc *doc;
-  GooString *fileName = NULL;
-  char *ppmRoot = NULL;
-  char *ppmFile;
-  GooString *ownerPW, *userPW;
-  SplashColor paperColor;
-  SplashOutputDev *splashOut;
-  GBool ok;
-  int exitCode;
-  int pg, pg_num_len;
-  double pg_w, pg_h, tmp;
-
-  exitCode = 99;
-
-  // parse args
-  ok = parseArgs(argDesc, &argc, argv);
-  if (mono && gray) {
-    ok = gFalse;
-  }
-  if ( resolution != 0.0 &&
-       (x_resolution == 150.0 ||
-        y_resolution == 150.0)) {
-    x_resolution = resolution;
-    y_resolution = resolution;
-  }
-  if (!ok || argc > 3 || printVersion || printHelp) {
-    fprintf(stderr, "pdftoppm version %s\n", PACKAGE_VERSION);
-    fprintf(stderr, "%s\n", popplerCopyright);
-    fprintf(stderr, "%s\n", xpdfCopyright);
-    if (!printVersion) {
-      printUsage("pdftoppm", "[PDF-file [PPM-file-prefix]]", argDesc);
-    }
-    if (printVersion || printHelp)
-      exitCode = 0;
-    goto err0;
-  }
-  if (argc > 1) fileName = new GooString(argv[1]);
-  if (argc == 3) ppmRoot = argv[2];
-
-  // read config file
-  globalParams = new GlobalParams();
-  if (enableFreeTypeStr[0]) {
-    if (!globalParams->setEnableFreeType(enableFreeTypeStr)) {
-      fprintf(stderr, "Bad '-freetype' value on command line\n");
-    }
-  }
-  if (antialiasStr[0]) {
-    if (!globalParams->setAntialias(antialiasStr)) {
-      fprintf(stderr, "Bad '-aa' value on command line\n");
-    }
-  }
-  if (vectorAntialiasStr[0]) {
-    if (!globalParams->setVectorAntialias(vectorAntialiasStr)) {
-      fprintf(stderr, "Bad '-aaVector' value on command line\n");
-    }
-  }
-  if (quiet) {
-    globalParams->setErrQuiet(quiet);
-  }
-
-  // open PDF file
-  if (ownerPassword[0]) {
-    ownerPW = new GooString(ownerPassword);
-  } else {
-    ownerPW = NULL;
-  }
-  if (userPassword[0]) {
-    userPW = new GooString(userPassword);
-  } else {
-    userPW = NULL;
-  }
-
-  if (fileName == NULL) {
-    fileName = new GooString("fd://0");
-  }
-  if (fileName->cmp("-") == 0) {
-    delete fileName;
-    fileName = new GooString("fd://0");
-  }
-  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
-  delete fileName;
-
-  if (userPW) {
-    delete userPW;
-  }
-  if (ownerPW) {
-    delete ownerPW;
-  }
-  if (!doc->isOk()) {
-    exitCode = 1;
-    goto err1;
-  }
-
-  // get page range
-  if (firstPage < 1)
-    firstPage = 1;
-  if (singleFile && lastPage < 1)
-    lastPage = firstPage;
-  if (lastPage < 1 || lastPage > doc->getNumPages())
-    lastPage = doc->getNumPages();
-
-  if (singleFile && firstPage < lastPage) {
-    if (!quiet) {
-      fprintf(stderr,
-        "Warning: Single file will write only the first of the %d pages.\n",
-        lastPage + 1 - firstPage);
-    }
-    lastPage = firstPage;
-  }
-
-  // write PPM files
-#if SPLASH_CMYK
-  if (jpegcmyk || overprint) {
-    globalParams->setOverprintPreview(gTrue);
-    for (int cp = 0; cp < SPOT_NCOMPS+4; cp++)
-      paperColor[cp] = 0;
-  } else 
-#endif
-  {
-    paperColor[0] = 255;
-    paperColor[1] = 255;
-    paperColor[2] = 255;
-  }
-  splashOut = new SplashOutputDev(mono ? splashModeMono1 :
-				    gray ? splashModeMono8 :
-#if SPLASH_CMYK
-				    (jpegcmyk || overprint) ? splashModeDeviceN8 :
-#endif
-				             splashModeRGB8, 4,
-				  gFalse, paperColor);
-  splashOut->startDoc(doc);
-  if (sz != 0) w = h = sz;
-  pg_num_len = numberOfCharacters(doc->getNumPages());
-  for (pg = firstPage; pg <= lastPage; ++pg) {
-    if (printOnlyEven && pg % 2 == 0) continue;
-    if (printOnlyOdd && pg % 2 == 1) continue;
-    if (useCropBox) {
-      pg_w = doc->getPageCropWidth(pg);
-      pg_h = doc->getPageCropHeight(pg);
-    } else {
-      pg_w = doc->getPageMediaWidth(pg);
-      pg_h = doc->getPageMediaHeight(pg);
-    }
-
-    if (scaleTo != 0) {
-      resolution = (72.0 * scaleTo) / (pg_w > pg_h ? pg_w : pg_h);
-      x_resolution = y_resolution = resolution;
-    } else {
-      if (x_scaleTo > 0) {
-        x_resolution = (72.0 * x_scaleTo) / pg_w;
-        if (y_scaleTo == -1)
-          y_resolution = x_resolution;
-      }
-      if (y_scaleTo > 0) {
-        y_resolution = (72.0 * y_scaleTo) / pg_h;
-        if (x_scaleTo == -1)
-          x_resolution = y_resolution;
-      }
-    }
-    pg_w = pg_w * (x_resolution / 72.0);
-    pg_h = pg_h * (y_resolution / 72.0);
-    if ((doc->getPageRotate(pg) == 90) || (doc->getPageRotate(pg) == 270)) {
-      tmp = pg_w;
-      pg_w = pg_h;
-      pg_h = tmp;
-    }
-    if (ppmRoot != NULL) {
-      const char *ext = png ? "png" : (jpeg || jpegcmyk) ? "jpg" : tiff ? "tif" : mono ? "pbm" : gray ? "pgm" : "ppm";
-      if (singleFile) {
-        ppmFile = new char[strlen(ppmRoot) + 1 + strlen(ext) + 1];
-        sprintf(ppmFile, "%s.%s", ppmRoot, ext);
-      } else {
-        ppmFile = new char[strlen(ppmRoot) + 1 + pg_num_len + 1 + strlen(ext) + 1];
-        sprintf(ppmFile, "%s-%0*d.%s", ppmRoot, pg_num_len, pg, ext);
-      }
-      savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, ppmFile);
-      delete[] ppmFile;
-    } else {
-      savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, NULL);
-    }
-  }
-  delete splashOut;
-
-  exitCode = 0;
-
-  // clean up
- err1:
-  delete doc;
-  delete globalParams;
- err0:
-
-  // check for memory leaks
-  Object::memCheck(stderr);
-  gMemReport(stderr);
-
-  return exitCode;
-}
+//========================================================================
+//
+// pdftoppm.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+//========================================================================
+//
+// Modified under the Poppler project - http://poppler.freedesktop.org
+//
+// All changes made under the Poppler project to this file are licensed
+// under GPL version 2 or later
+//
+// Copyright (C) 2007 Ilmari Heikkinen <ilmari.heikkinen at gmail.com>
+// Copyright (C) 2008 Richard Airlie <richard.airlie at maglabs.net>
+// Copyright (C) 2009 Michael K. Johnson <a1237 at danlj.org>
+// Copyright (C) 2009 Shen Liang <shenzhuxi at gmail.com>
+// Copyright (C) 2009 Stefan Thomas <thomas at eload24.com>
+// Copyright (C) 2009-2011 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2010, 2012 Adrian Johnson <ajohnson at redneon.com>
+// Copyright (C) 2010 Hib Eris <hib at hiberis.nl>
+// Copyright (C) 2010 Jonathan Liu <net147 at gmail.com>
+// Copyright (C) 2010 William Bader <williambader at hotmail.com>
+// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag at alfa.de>
+//
+// To see a description of the changes please see the Changelog file that
+// came with your tarball or type make ChangeLog if you are building from git
+//
+//========================================================================
+
+#include "config.h"
+#include <poppler-config.h>
+#ifdef _WIN32
+#include <fcntl.h> // for O_BINARY
+#include <io.h>    // for setmode
+#endif
+#include <stdio.h>
+#include <math.h>
+#include "parseargs.h"
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "GlobalParams.h"
+#include "Object.h"
+#include "PDFDoc.h"
+#include "PDFDocFactory.h"
+#include "splash/SplashBitmap.h"
+#include "splash/Splash.h"
+#include "SplashOutputDev.h"
+
+static int firstPage = 1;
+static int lastPage = 0;
+static GBool printOnlyOdd = gFalse;
+static GBool printOnlyEven = gFalse;
+static GBool singleFile = gFalse;
+static double resolution = 0.0;
+static double x_resolution = 150.0;
+static double y_resolution = 150.0;
+static int scaleTo = 0;
+static int x_scaleTo = 0;
+static int y_scaleTo = 0;
+static int x = 0;
+static int y = 0;
+static int w = 0;
+static int h = 0;
+static int sz = 0;
+static GBool useCropBox = gFalse;
+static GBool mono = gFalse;
+static GBool gray = gFalse;
+static GBool png = gFalse;
+static GBool jpeg = gFalse;
+static GBool jpegcmyk = gFalse;
+static GBool tiff = gFalse;
+#if SPLASH_CMYK
+static GBool overprint = gFalse;
+#endif
+static char enableFreeTypeStr[16] = "";
+static char antialiasStr[16] = "";
+static char vectorAntialiasStr[16] = "";
+static char ownerPassword[33] = "";
+static char userPassword[33] = "";
+static char TiffCompressionStr[16] = "";
+static GBool quiet = gFalse;
+static GBool printVersion = gFalse;
+static GBool printHelp = gFalse;
+
+static const ArgDesc argDesc[] = {
+  {"-f",      argInt,      &firstPage,     0,
+   "first page to print"},
+  {"-l",      argInt,      &lastPage,      0,
+   "last page to print"},
+  {"-o",      argFlag,      &printOnlyOdd, 0,
+   "print only odd pages"},
+  {"-e",      argFlag,      &printOnlyEven, 0,
+   "print only even pages"},
+  {"-singlefile", argFlag,  &singleFile,   0,
+   "write only the first page and do not add digits"},
+
+  {"-r",      argFP,       &resolution,    0,
+   "resolution, in DPI (default is 150)"},
+  {"-rx",      argFP,       &x_resolution,    0,
+   "X resolution, in DPI (default is 150)"},
+  {"-ry",      argFP,       &y_resolution,    0,
+   "Y resolution, in DPI (default is 150)"},
+  {"-scale-to",      argInt,       &scaleTo,    0,
+   "scales each page to fit within scale-to*scale-to pixel box"},
+  {"-scale-to-x",      argInt,       &x_scaleTo,    0,
+   "scales each page horizontally to fit in scale-to-x pixels"},
+  {"-scale-to-y",      argInt,       &y_scaleTo,    0,
+   "scales each page vertically to fit in scale-to-y pixels"},
+
+  {"-x",      argInt,      &x,             0,
+   "x-coordinate of the crop area top left corner"},
+  {"-y",      argInt,      &y,             0,
+   "y-coordinate of the crop area top left corner"},
+  {"-W",      argInt,      &w,             0,
+   "width of crop area in pixels (default is 0)"},
+  {"-H",      argInt,      &h,             0,
+   "height of crop area in pixels (default is 0)"},
+  {"-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"},
+
+  {"-mono",   argFlag,     &mono,          0,
+   "generate a monochrome PBM file"},
+  {"-gray",   argFlag,     &gray,          0,
+   "generate a grayscale PGM file"},
+#if ENABLE_LIBPNG
+  {"-png",    argFlag,     &png,           0,
+   "generate a PNG file"},
+#endif
+#if ENABLE_LIBJPEG
+  {"-jpeg",   argFlag,     &jpeg,           0,
+   "generate a JPEG file"},
+#if SPLASH_CMYK
+  {"-jpegcmyk",argFlag,    &jpegcmyk,       0,
+   "generate a CMYK JPEG file"},
+#endif
+#endif
+#if SPLASH_CMYK
+  {"-overprint",argFlag,   &overprint,      0,
+   "enable overprint"},
+#endif
+#if ENABLE_LIBTIFF
+  {"-tiff",    argFlag,     &tiff,           0,
+   "generate a TIFF file"},
+  {"-tiffcompression", argString, TiffCompressionStr, sizeof(TiffCompressionStr),
+   "set TIFF compression: none, packbits, jpeg, lzw, deflate"},
+#endif
+#if HAVE_FREETYPE_FREETYPE_H | HAVE_FREETYPE_H
+  {"-freetype",   argString,      enableFreeTypeStr, sizeof(enableFreeTypeStr),
+   "enable FreeType font rasterizer: yes, no"},
+#endif
+  
+  {"-aa",         argString,      antialiasStr,   sizeof(antialiasStr),
+   "enable font anti-aliasing: yes, no"},
+  {"-aaVector",   argString,      vectorAntialiasStr, sizeof(vectorAntialiasStr),
+   "enable vector anti-aliasing: yes, no"},
+  
+  {"-opw",    argString,   ownerPassword,  sizeof(ownerPassword),
+   "owner password (for encrypted files)"},
+  {"-upw",    argString,   userPassword,   sizeof(userPassword),
+   "user password (for encrypted files)"},
+  
+  {"-q",      argFlag,     &quiet,         0,
+   "don't print any messages or errors"},
+  {"-v",      argFlag,     &printVersion,  0,
+   "print copyright and version info"},
+  {"-h",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-help",   argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"--help",  argFlag,     &printHelp,     0,
+   "print usage information"},
+  {"-?",      argFlag,     &printHelp,     0,
+   "print usage information"},
+  {NULL}
+};
+
+static void savePageSlice(PDFDoc *doc,
+                   SplashOutputDev *splashOut, 
+                   int pg, int x, int y, int w, int h, 
+                   double pg_w, double pg_h, 
+                   char *ppmFile) {
+  if (w == 0) w = (int)ceil(pg_w);
+  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);
+  doc->displayPageSlice(splashOut, 
+    pg, x_resolution, y_resolution, 
+    0,
+    !useCropBox, gFalse, gFalse,
+    x, y, w, h
+  );
+
+  SplashBitmap *bitmap = splashOut->getBitmap();
+  
+  if (ppmFile != NULL) {
+    if (png) {
+      bitmap->writeImgFile(splashFormatPng, ppmFile, x_resolution, y_resolution);
+    } else if (jpeg) {
+      bitmap->writeImgFile(splashFormatJpeg, ppmFile, x_resolution, y_resolution);
+    } else if (jpegcmyk) {
+      bitmap->writeImgFile(splashFormatJpegCMYK, ppmFile, x_resolution, y_resolution);
+    } else if (tiff) {
+      bitmap->writeImgFile(splashFormatTiff, ppmFile, x_resolution, y_resolution, TiffCompressionStr);
+    } else {
+      bitmap->writePNMFile(ppmFile);
+    }
+  } else {
+#ifdef _WIN32
+    setmode(fileno(stdout), O_BINARY);
+#endif
+
+    if (png) {
+      bitmap->writeImgFile(splashFormatPng, stdout, x_resolution, y_resolution);
+    } else if (jpeg) {
+      bitmap->writeImgFile(splashFormatJpeg, stdout, x_resolution, y_resolution);
+    } else if (tiff) {
+      bitmap->writeImgFile(splashFormatTiff, stdout, x_resolution, y_resolution, TiffCompressionStr);
+    } else {
+      bitmap->writePNMFile(stdout);
+    }
+  }
+}
+
+static int numberOfCharacters(unsigned int n)
+{
+  int charNum = 0;
+  while (n >= 10)
+  {
+    n = n / 10;
+    charNum++;
+  }
+  charNum++;
+  return charNum;
+}
+
+int main(int argc, char *argv[]) {
+  PDFDoc *doc;
+  GooString *fileName = NULL;
+  char *ppmRoot = NULL;
+  char *ppmFile;
+  GooString *ownerPW, *userPW;
+  SplashColor paperColor;
+  SplashOutputDev *splashOut;
+  GBool ok;
+  int exitCode;
+  int pg, pg_num_len;
+  double pg_w, pg_h, tmp;
+
+  exitCode = 99;
+
+  // parse args
+  ok = parseArgs(argDesc, &argc, argv);
+  if (mono && gray) {
+    ok = gFalse;
+  }
+  if ( resolution != 0.0 &&
+       (x_resolution == 150.0 ||
+        y_resolution == 150.0)) {
+    x_resolution = resolution;
+    y_resolution = resolution;
+  }
+  if (!ok || argc > 3 || printVersion || printHelp) {
+    fprintf(stderr, "pdftoppm version %s\n", PACKAGE_VERSION);
+    fprintf(stderr, "%s\n", popplerCopyright);
+    fprintf(stderr, "%s\n", xpdfCopyright);
+    if (!printVersion) {
+      printUsage("pdftoppm", "[PDF-file [PPM-file-prefix]]", argDesc);
+    }
+    if (printVersion || printHelp)
+      exitCode = 0;
+    goto err0;
+  }
+  if (argc > 1) fileName = new GooString(argv[1]);
+  if (argc == 3) ppmRoot = argv[2];
+
+  // read config file
+  globalParams = new GlobalParams();
+  if (enableFreeTypeStr[0]) {
+    if (!globalParams->setEnableFreeType(enableFreeTypeStr)) {
+      fprintf(stderr, "Bad '-freetype' value on command line\n");
+    }
+  }
+  if (antialiasStr[0]) {
+    if (!globalParams->setAntialias(antialiasStr)) {
+      fprintf(stderr, "Bad '-aa' value on command line\n");
+    }
+  }
+  if (vectorAntialiasStr[0]) {
+    if (!globalParams->setVectorAntialias(vectorAntialiasStr)) {
+      fprintf(stderr, "Bad '-aaVector' value on command line\n");
+    }
+  }
+  if (quiet) {
+    globalParams->setErrQuiet(quiet);
+  }
+
+  // open PDF file
+  if (ownerPassword[0]) {
+    ownerPW = new GooString(ownerPassword);
+  } else {
+    ownerPW = NULL;
+  }
+  if (userPassword[0]) {
+    userPW = new GooString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+
+  if (fileName == NULL) {
+    fileName = new GooString("fd://0");
+  }
+  if (fileName->cmp("-") == 0) {
+    delete fileName;
+    fileName = new GooString("fd://0");
+  }
+  doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW);
+  delete fileName;
+
+  if (userPW) {
+    delete userPW;
+  }
+  if (ownerPW) {
+    delete ownerPW;
+  }
+  if (!doc->isOk()) {
+    exitCode = 1;
+    goto err1;
+  }
+
+  // get page range
+  if (firstPage < 1)
+    firstPage = 1;
+  if (singleFile && lastPage < 1)
+    lastPage = firstPage;
+  if (lastPage < 1 || lastPage > doc->getNumPages())
+    lastPage = doc->getNumPages();
+
+  if (singleFile && firstPage < lastPage) {
+    if (!quiet) {
+      fprintf(stderr,
+        "Warning: Single file will write only the first of the %d pages.\n",
+        lastPage + 1 - firstPage);
+    }
+    lastPage = firstPage;
+  }
+
+  // write PPM files
+#if SPLASH_CMYK
+  if (jpegcmyk || overprint) {
+    globalParams->setOverprintPreview(gTrue);
+    for (int cp = 0; cp < SPOT_NCOMPS+4; cp++)
+      paperColor[cp] = 0;
+  } else 
+#endif
+  {
+    paperColor[0] = 255;
+    paperColor[1] = 255;
+    paperColor[2] = 255;
+  }
+  splashOut = new SplashOutputDev(mono ? splashModeMono1 :
+				    gray ? splashModeMono8 :
+#if SPLASH_CMYK
+				    (jpegcmyk || overprint) ? splashModeDeviceN8 :
+#endif
+				             splashModeRGB8, 4,
+				  gFalse, paperColor);
+  splashOut->startDoc(doc);
+  if (sz != 0) w = h = sz;
+  pg_num_len = numberOfCharacters(doc->getNumPages());
+  for (pg = firstPage; pg <= lastPage; ++pg) {
+    if (printOnlyEven && pg % 2 == 0) continue;
+    if (printOnlyOdd && pg % 2 == 1) continue;
+    if (useCropBox) {
+      pg_w = doc->getPageCropWidth(pg);
+      pg_h = doc->getPageCropHeight(pg);
+    } else {
+      pg_w = doc->getPageMediaWidth(pg);
+      pg_h = doc->getPageMediaHeight(pg);
+    }
+
+    if (scaleTo != 0) {
+      resolution = (72.0 * scaleTo) / (pg_w > pg_h ? pg_w : pg_h);
+      x_resolution = y_resolution = resolution;
+    } else {
+      if (x_scaleTo > 0) {
+        x_resolution = (72.0 * x_scaleTo) / pg_w;
+        if (y_scaleTo == -1)
+          y_resolution = x_resolution;
+      }
+      if (y_scaleTo > 0) {
+        y_resolution = (72.0 * y_scaleTo) / pg_h;
+        if (x_scaleTo == -1)
+          x_resolution = y_resolution;
+      }
+    }
+    pg_w = pg_w * (x_resolution / 72.0);
+    pg_h = pg_h * (y_resolution / 72.0);
+    if ((doc->getPageRotate(pg) == 90) || (doc->getPageRotate(pg) == 270)) {
+      tmp = pg_w;
+      pg_w = pg_h;
+      pg_h = tmp;
+    }
+    if (ppmRoot != NULL) {
+      const char *ext = png ? "png" : (jpeg || jpegcmyk) ? "jpg" : tiff ? "tif" : mono ? "pbm" : gray ? "pgm" : "ppm";
+      if (singleFile) {
+        ppmFile = new char[strlen(ppmRoot) + 1 + strlen(ext) + 1];
+        sprintf(ppmFile, "%s.%s", ppmRoot, ext);
+      } else {
+        ppmFile = new char[strlen(ppmRoot) + 1 + pg_num_len + 1 + strlen(ext) + 1];
+        sprintf(ppmFile, "%s-%0*d.%s", ppmRoot, pg_num_len, pg, ext);
+      }
+      savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, ppmFile);
+      delete[] ppmFile;
+    } else {
+      savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, NULL);
+    }
+  }
+  delete splashOut;
+
+  exitCode = 0;
+
+  // clean up
+ err1:
+  delete doc;
+  delete globalParams;
+ err0:
+
+  // check for memory leaks
+  Object::memCheck(stderr);
+  gMemReport(stderr);
+
+  return exitCode;
+}


More information about the poppler mailing list