]> www.fi.muni.cz Git - evince.git/blobdiff - pdf/xpdf/pdftops.cc
Synched with Xpdf 0.92
[evince.git] / pdf / xpdf / pdftops.cc
index d6fd6534258de72c0d12915936f610ff1cc97a37..e3e495d947063053e075737e05980b8eecc6dac6 100644 (file)
@@ -30,29 +30,42 @@ static int firstPage = 1;
 static int lastPage = 0;
 static GBool noEmbedFonts = gFalse;
 static GBool doForm = gFalse;
-GBool printCommands = gFalse;
+static char userPassword[33] = "";
+static GBool printVersion = gFalse;
 static GBool printHelp = gFalse;
 
 static ArgDesc argDesc[] = {
-  {"-f",      argInt,      &firstPage,     0,
+  {"-f",      argInt,      &firstPage,      0,
    "first page to print"},
-  {"-l",      argInt,      &lastPage,      0,
+  {"-l",      argInt,      &lastPage,       0,
    "last page to print"},
-  {"-paperw", argInt,      &paperWidth,    0,
+  {"-paperw", argInt,      &paperWidth,     0,
    "paper width, in points"},
-  {"-paperh", argInt,      &paperHeight,   0,
+  {"-paperh", argInt,      &paperHeight,    0,
    "paper height, in points"},
-  {"-level1", argFlag,     &psOutLevel1,   0,
+  {"-level1", argFlag,     &psOutLevel1,    0,
    "generate Level 1 PostScript"},
-  {"-noemb",  argFlag,     &noEmbedFonts,  0,
+  {"-level1sep", argFlag,  &psOutLevel1Sep, 0,
+   "generate Level 1 separable PostScript"},
+  {"-eps",    argFlag,     &psOutEPS,       0,
+   "generate Encapsulated PostScript (EPS)"},
+#if OPI_SUPPORT
+  {"-opi",    argFlag,     &psOutOPI,       0,
+   "generate OPI comments"},
+#endif
+  {"-noemb",  argFlag,     &noEmbedFonts,   0,
    "don't embed Type 1 fonts"},
-  {"-form",   argFlag,     &doForm,        0,
+  {"-form",   argFlag,     &doForm,         0,
    "generate a PostScript form"},
-  {"-q",      argFlag,     &errQuiet,      0,
+  {"-upw",    argString,   userPassword,    sizeof(userPassword),
+   "user password (for encrypted files)"},
+  {"-q",      argFlag,     &errQuiet,       0,
    "don't print any messages or errors"},
-  {"-h",      argFlag,     &printHelp,     0,
+  {"-v",      argFlag,     &printVersion,   0,
+   "print copyright and version info"},
+  {"-h",      argFlag,     &printHelp,      0,
    "print usage information"},
-  {"-help",   argFlag,     &printHelp,     0,
+  {"-help",   argFlag,     &printHelp,      0,
    "print usage information"},
   {NULL}
 };
@@ -61,19 +74,26 @@ int main(int argc, char *argv[]) {
   PDFDoc *doc;
   GString *fileName;
   GString *psFileName;
+  GString *userPW;
   PSOutputDev *psOut;
   GBool ok;
   char *p;
 
   // parse args
   ok = parseArgs(argDesc, &argc, argv);
-  if (!ok || argc < 2 || argc > 3 || printHelp) {
+  if (!ok || argc < 2 || argc > 3 || printVersion || printHelp) {
     fprintf(stderr, "pdftops version %s\n", xpdfVersion);
     fprintf(stderr, "%s\n", xpdfCopyright);
-    printUsage("pdftops", "<PDF-file> [<PS-file>]", argDesc);
+    if (!printVersion) {
+      printUsage("pdftops", "<PDF-file> [<PS-file>]", argDesc);
+    }
     exit(1);
   }
-  if (doForm && psOutLevel1) {
+  if (psOutLevel1 && psOutLevel1Sep) {
+    fprintf(stderr, "Error: use -level1 or -level1sep, not both.\n");
+    exit(1);
+  }
+  if (doForm && (psOutLevel1 || psOutLevel1Sep)) {
     fprintf(stderr, "Error: forms are only available with Level 2 output.\n");
     exit(1);
   }
@@ -87,7 +107,15 @@ int main(int argc, char *argv[]) {
 
   // open PDF file
   xref = NULL;
-  doc = new PDFDoc(fileName);
+  if (userPassword[0]) {
+    userPW = new GString(userPassword);
+  } else {
+    userPW = NULL;
+  }
+  doc = new PDFDoc(fileName, userPW);
+  if (userPW) {
+    delete userPW;
+  }
   if (!doc->isOk()) {
     goto err1;
   }
@@ -95,7 +123,7 @@ int main(int argc, char *argv[]) {
   // check for print permission
   if (!doc->okToPrint()) {
     error(-1, "Printing this document is not allowed.");
-    goto err2;
+    goto err1;
   }
 
   // construct PostScript file name
@@ -108,7 +136,7 @@ int main(int argc, char *argv[]) {
                               fileName->getLength() - 4);
     else
       psFileName = fileName->copy();
-    psFileName->append(".ps");
+    psFileName->append(psOutEPS ? ".eps" : ".ps");
   }
 
   // get page range
@@ -119,18 +147,24 @@ int main(int argc, char *argv[]) {
   if (doForm)
     lastPage = firstPage;
 
+  // check for multi-page EPS
+  if (psOutEPS && firstPage != lastPage) {
+    error(-1, "EPS files can only contain one page.");
+    goto err2;
+  }
+
   // write PostScript file
   psOut = new PSOutputDev(psFileName->getCString(), doc->getCatalog(),
                          firstPage, lastPage, !noEmbedFonts, doForm);
   if (psOut->isOk())
-    doc->displayPages(psOut, firstPage, lastPage, 72, 0);
+    doc->displayPages(psOut, firstPage, lastPage, 72, 0, gFalse);
   delete psOut;
 
   // clean up
-  delete psFileName;
  err2:
-  delete doc;
+  delete psFileName;
  err1:
+  delete doc;
   freeParams();
 
   // check for memory leaks