]> www.fi.muni.cz Git - evince.git/blob - pdftotext.cc
189d4898fc89c333d115f409e5dde1c26fd87036
[evince.git] / pdftotext.cc
1 //========================================================================
2 //
3 // pdftotext.cc
4 //
5 // Copyright 1997 Derek B. Noonburg
6 //
7 //========================================================================
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <stddef.h>
12 #include <string.h>
13 #include "parseargs.h"
14 #include "GString.h"
15 #include "gmem.h"
16 #include "Object.h"
17 #include "Stream.h"
18 #include "Array.h"
19 #include "Dict.h"
20 #include "XRef.h"
21 #include "Catalog.h"
22 #include "Page.h"
23 #include "PDFDoc.h"
24 #include "TextOutputDev.h"
25 #include "Params.h"
26 #include "Error.h"
27 #include "config.h"
28
29 static int firstPage = 1;
30 static int lastPage = 0;
31 static GBool useASCII7 = gFalse;
32 #if JAPANESE_SUPPORT
33 static GBool useEUCJP = gFalse;
34 #endif
35 static GBool rawOrder = gFalse;
36 GBool printCommands = gFalse;
37 static GBool printHelp = gFalse;
38
39 static ArgDesc argDesc[] = {
40   {"-f",      argInt,      &firstPage,     0,
41    "first page to convert"},
42   {"-l",      argInt,      &lastPage,      0,
43    "last page to convert"},
44   {"-ascii7", argFlag,     &useASCII7,     0,
45    "convert to 7-bit ASCII (default is 8-bit ISO Latin-1)"},
46 #if JAPANESE_SUPPORT
47   {"-eucjp",  argFlag,     &useEUCJP,      0,
48    "convert Japanese text to EUC-JP"},
49 #endif
50   {"-raw",    argFlag,     &rawOrder,      0,
51    "keep strings in content stream order"},
52   {"-q",      argFlag,     &errQuiet,      0,
53    "don't print any messages or errors"},
54   {"-h",      argFlag,     &printHelp,     0,
55    "print usage information"},
56   {"-help",   argFlag,     &printHelp,     0,
57    "print usage information"},
58   {NULL}
59 };
60
61 int main(int argc, char *argv[]) {
62   PDFDoc *doc;
63   GString *fileName;
64   GString *textFileName;
65   TextOutputDev *textOut;
66   GBool ok;
67   char *p;
68
69   // parse args
70   ok = parseArgs(argDesc, &argc, argv);
71   if (!ok || argc < 2 || argc > 3 || printHelp) {
72     fprintf(stderr, "pdftotext version %s\n", xpdfVersion);
73     fprintf(stderr, "%s\n", xpdfCopyright);
74     printUsage("pdftotext", "<PDF-file> [<text-file>]", argDesc);
75     exit(1);
76   }
77   fileName = new GString(argv[1]);
78
79   // init error file
80   errorInit();
81
82   // read config file
83   initParams(xpdfConfigFile);
84
85   // open PDF file
86   xref = NULL;
87   doc = new PDFDoc(fileName);
88   if (!doc->isOk()) {
89     goto err1;
90   }
91
92   // check for copy permission
93   if (!doc->okToCopy()) {
94     error(-1, "Copying of text from this document is not allowed.");
95     goto err2;
96   }
97
98   // construct text file name
99   if (argc == 3) {
100     textFileName = new GString(argv[2]);
101   } else {
102     p = fileName->getCString() + fileName->getLength() - 4;
103     if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF"))
104       textFileName = new GString(fileName->getCString(),
105                                  fileName->getLength() - 4);
106     else
107       textFileName = fileName->copy();
108     textFileName->append(".txt");
109   }
110
111   // get page range
112   if (firstPage < 1)
113     firstPage = 1;
114   if (lastPage < 1 || lastPage > doc->getNumPages())
115     lastPage = doc->getNumPages();
116
117   // write text file
118 #if JAPANESE_SUPPORT
119   useASCII7 |= useEUCJP;
120 #endif
121   textOut = new TextOutputDev(textFileName->getCString(), useASCII7, rawOrder);
122   if (textOut->isOk())
123     doc->displayPages(textOut, firstPage, lastPage, 72, 0);
124   delete textOut;
125
126   // clean up
127   delete textFileName;
128  err2:
129   delete doc;
130  err1:
131   freeParams();
132
133   // check for memory leaks
134   Object::memCheck(stderr);
135   gMemReport(stderr);
136
137   return 0;
138 }