xref: /AOO41X/main/sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  *  OpenOffice.org - a multi-platform office productivity suite
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  *  The Contents of this file are made available subject to
6*cdf0e10cSrcweir  *  the terms of GNU General Public License Version 2.
7*cdf0e10cSrcweir  *
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  *    GNU General Public License, version 2
10*cdf0e10cSrcweir  *    =============================================
11*cdf0e10cSrcweir  *    Copyright 2005 by Sun Microsystems, Inc.
12*cdf0e10cSrcweir  *    901 San Antonio Road, Palo Alto, CA 94303, USA
13*cdf0e10cSrcweir  *
14*cdf0e10cSrcweir  *    This program is free software; you can redistribute it and/or
15*cdf0e10cSrcweir  *    modify it under the terms of the GNU General Public License as
16*cdf0e10cSrcweir  *    published by the Free Software Foundation; either version 2 of
17*cdf0e10cSrcweir  *    the License, or (at your option) any later version.
18*cdf0e10cSrcweir  *
19*cdf0e10cSrcweir  *    This program is distributed in the hope that it will be useful,
20*cdf0e10cSrcweir  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
21*cdf0e10cSrcweir  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22*cdf0e10cSrcweir  *    GNU General Public License for more details.
23*cdf0e10cSrcweir  *
24*cdf0e10cSrcweir  *    You should have received a copy of the GNU General Public
25*cdf0e10cSrcweir  *    License along with this program; if not, write to the Free
26*cdf0e10cSrcweir  *    Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
27*cdf0e10cSrcweir  *    Boston, MA 02110-1301, USA.
28*cdf0e10cSrcweir  *
29*cdf0e10cSrcweir  ************************************************************************/
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "pdfioutdev_gpl.hxx"
32*cdf0e10cSrcweir //#include "SecurityHandler.h"
33*cdf0e10cSrcweir #ifdef WNT
34*cdf0e10cSrcweir # include <io.h>
35*cdf0e10cSrcweir # include <fcntl.h>  /*_O_BINARY*/
36*cdf0e10cSrcweir #endif
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir FILE* g_binary_out=stderr;
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir #ifndef SYSTEM_POPPLER
41*cdf0e10cSrcweir static char ownerPassword[33] = "\001";
42*cdf0e10cSrcweir static char userPassword[33]  = "\001";
43*cdf0e10cSrcweir static char outputFile[256]   = "\001";
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir static ArgDesc argDesc[] = {
46*cdf0e10cSrcweir   {(char*)"-f",          argString,      outputFile,     sizeof(outputFile),
47*cdf0e10cSrcweir    (char*)"output file for binary streams"},
48*cdf0e10cSrcweir   {(char*)"-opw",        argString,      ownerPassword,  sizeof(ownerPassword),
49*cdf0e10cSrcweir    (char*)"owner password (for encrypted files)"},
50*cdf0e10cSrcweir   {(char*)"-upw",        argString,      userPassword,   sizeof(userPassword),
51*cdf0e10cSrcweir    (char*)"user password (for encrypted files)"},
52*cdf0e10cSrcweir   {NULL, argString, NULL, 0, NULL }
53*cdf0e10cSrcweir };
54*cdf0e10cSrcweir #else
55*cdf0e10cSrcweir static const char *ownerPassword = "\001";
56*cdf0e10cSrcweir static const char *userPassword  = "\001";
57*cdf0e10cSrcweir static const char *outputFile   = "\001";
58*cdf0e10cSrcweir #endif
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir int main(int argc, char **argv)
61*cdf0e10cSrcweir {
62*cdf0e10cSrcweir #ifndef SYSTEM_POPPLER
63*cdf0e10cSrcweir     // parse args; initialize to defaults
64*cdf0e10cSrcweir     if( !parseArgs(argDesc, &argc, argv) )
65*cdf0e10cSrcweir         return 1;
66*cdf0e10cSrcweir #else
67*cdf0e10cSrcweir     int k = 0;
68*cdf0e10cSrcweir     while (k < argc)
69*cdf0e10cSrcweir     {
70*cdf0e10cSrcweir         if (!strcmp(argv[k], "-f"))
71*cdf0e10cSrcweir         {
72*cdf0e10cSrcweir             outputFile = argv[k+1];
73*cdf0e10cSrcweir             --argc;
74*cdf0e10cSrcweir             for (int j = k; j < argc; ++j)
75*cdf0e10cSrcweir                 argv[j] = argv[j+1];
76*cdf0e10cSrcweir         }
77*cdf0e10cSrcweir         else if (!strcmp(argv[k], "-opw"))
78*cdf0e10cSrcweir         {
79*cdf0e10cSrcweir             ownerPassword = argv[k+1];
80*cdf0e10cSrcweir             --argc;
81*cdf0e10cSrcweir             for (int j = k; j < argc; ++j)
82*cdf0e10cSrcweir                 argv[j] = argv[j+1];
83*cdf0e10cSrcweir         }
84*cdf0e10cSrcweir         else if (!strcmp(argv[k], "-upw"))
85*cdf0e10cSrcweir         {
86*cdf0e10cSrcweir             userPassword = argv[k+1];
87*cdf0e10cSrcweir             --argc;
88*cdf0e10cSrcweir             for (int j = k; j < argc; ++j)
89*cdf0e10cSrcweir                 argv[j] = argv[j+1];
90*cdf0e10cSrcweir         }
91*cdf0e10cSrcweir 	++k;
92*cdf0e10cSrcweir     }
93*cdf0e10cSrcweir #endif
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir     if( argc < 2 )
96*cdf0e10cSrcweir         return 1;
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir     // read config file
99*cdf0e10cSrcweir     globalParams = new GlobalParams(
100*cdf0e10cSrcweir #ifndef SYSTEM_POPPLER
101*cdf0e10cSrcweir         (char*)""
102*cdf0e10cSrcweir #endif
103*cdf0e10cSrcweir     );
104*cdf0e10cSrcweir     globalParams->setErrQuiet(gTrue);
105*cdf0e10cSrcweir #if !defined(SYSTEM_POPPLER) || defined(_MSC_VER)
106*cdf0e10cSrcweir     globalParams->setupBaseFonts(NULL);
107*cdf0e10cSrcweir #endif
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir     // try to read a possible open password form stdin
110*cdf0e10cSrcweir     char aPwBuf[129];
111*cdf0e10cSrcweir     aPwBuf[128] = 0;
112*cdf0e10cSrcweir     if( ! fgets( aPwBuf, sizeof(aPwBuf)-1, stdin ) )
113*cdf0e10cSrcweir         aPwBuf[0] = 0; // mark as empty
114*cdf0e10cSrcweir     else
115*cdf0e10cSrcweir     {
116*cdf0e10cSrcweir         for( unsigned int i = 0; i < sizeof(aPwBuf); i++ )
117*cdf0e10cSrcweir         {
118*cdf0e10cSrcweir             if( aPwBuf[i] == '\n' )
119*cdf0e10cSrcweir             {
120*cdf0e10cSrcweir                 aPwBuf[i] = 0;
121*cdf0e10cSrcweir                 break;
122*cdf0e10cSrcweir             }
123*cdf0e10cSrcweir         }
124*cdf0e10cSrcweir     }
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir     // PDFDoc takes over ownership for all strings below
127*cdf0e10cSrcweir     GooString* pFileName    = new GooString(argv[1]);
128*cdf0e10cSrcweir     GooString* pTempErrFileName     = new GooString("_err.pdf");
129*cdf0e10cSrcweir     GooString* pTempErrFileNamePath = new GooString(argv[0]);
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir     GooString* pErrFileName = new GooString(pTempErrFileNamePath,pTempErrFileName);
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir     // check for password string(s)
135*cdf0e10cSrcweir     GooString* pOwnerPasswordStr( aPwBuf[0] != 0
136*cdf0e10cSrcweir                                  ? new GooString( aPwBuf )
137*cdf0e10cSrcweir                                  : (ownerPassword[0] != '\001'
138*cdf0e10cSrcweir                                     ? new GooString(ownerPassword)
139*cdf0e10cSrcweir                                     : (GooString *)NULL ) );
140*cdf0e10cSrcweir     GooString* pUserPasswordStr(  userPassword[0] != '\001'
141*cdf0e10cSrcweir                                   ? new GooString(userPassword)
142*cdf0e10cSrcweir                                   : (GooString *)NULL );
143*cdf0e10cSrcweir     if( outputFile[0] != '\001' )
144*cdf0e10cSrcweir         g_binary_out = fopen(outputFile,"wb");
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir #ifdef WNT
147*cdf0e10cSrcweir     // Win actually modifies output for O_TEXT file mode, so need to
148*cdf0e10cSrcweir     // revert to binary here
149*cdf0e10cSrcweir     _setmode( _fileno( g_binary_out ), _O_BINARY );
150*cdf0e10cSrcweir #endif
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir     PDFDoc aDoc( pFileName,
153*cdf0e10cSrcweir                  pOwnerPasswordStr,
154*cdf0e10cSrcweir                  pUserPasswordStr );
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir     PDFDoc aErrDoc( pErrFileName,
157*cdf0e10cSrcweir                  pOwnerPasswordStr,
158*cdf0e10cSrcweir                  pUserPasswordStr );
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir    // Check various permissions.
162*cdf0e10cSrcweir    if ( !aDoc.isOk()||
163*cdf0e10cSrcweir         !aDoc.okToPrint() ||
164*cdf0e10cSrcweir         !aDoc.okToChange()||
165*cdf0e10cSrcweir         !aDoc.okToCopy()||
166*cdf0e10cSrcweir         !aDoc.okToAddNotes() )
167*cdf0e10cSrcweir    {
168*cdf0e10cSrcweir         pdfi::PDFOutDev* pOutDev( new pdfi::PDFOutDev(&aErrDoc) );
169*cdf0e10cSrcweir 
170*cdf0e10cSrcweir         const int nPages = aErrDoc.isOk() ? aErrDoc.getNumPages() : 0;
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir         // tell receiver early - needed for proper progress calculation
173*cdf0e10cSrcweir         pOutDev->setPageNum( nPages );
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir         // virtual resolution of the PDF OutputDev in dpi
176*cdf0e10cSrcweir         static const int PDFI_OUTDEV_RESOLUTION=7200;
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir        // do the conversion
179*cdf0e10cSrcweir        for( int i=1; i<=nPages; ++i )
180*cdf0e10cSrcweir        {
181*cdf0e10cSrcweir           aErrDoc.displayPage( pOutDev,
182*cdf0e10cSrcweir                             i,
183*cdf0e10cSrcweir                             PDFI_OUTDEV_RESOLUTION,
184*cdf0e10cSrcweir                             PDFI_OUTDEV_RESOLUTION,
185*cdf0e10cSrcweir                             0, gTrue, gTrue, gTrue );
186*cdf0e10cSrcweir           aErrDoc.processLinks( pOutDev, i );
187*cdf0e10cSrcweir        }
188*cdf0e10cSrcweir    }
189*cdf0e10cSrcweir    else
190*cdf0e10cSrcweir    {
191*cdf0e10cSrcweir       pdfi::PDFOutDev* pOutDev( new pdfi::PDFOutDev(&aDoc) );
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir       // tell receiver early - needed for proper progress calculation
194*cdf0e10cSrcweir       pOutDev->setPageNum( aDoc.getNumPages() );
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir       // virtual resolution of the PDF OutputDev in dpi
197*cdf0e10cSrcweir       static const int PDFI_OUTDEV_RESOLUTION=7200;
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir       // do the conversion
200*cdf0e10cSrcweir       const int nPages = aDoc.getNumPages();
201*cdf0e10cSrcweir       for( int i=1; i<=nPages; ++i )
202*cdf0e10cSrcweir       {
203*cdf0e10cSrcweir         aDoc.displayPage( pOutDev,
204*cdf0e10cSrcweir                           i,
205*cdf0e10cSrcweir                           PDFI_OUTDEV_RESOLUTION,
206*cdf0e10cSrcweir                           PDFI_OUTDEV_RESOLUTION,
207*cdf0e10cSrcweir                           0, gTrue, gTrue, gTrue );
208*cdf0e10cSrcweir         aDoc.processLinks( pOutDev, i );
209*cdf0e10cSrcweir       }
210*cdf0e10cSrcweir    }
211*cdf0e10cSrcweir     return 0;
212*cdf0e10cSrcweir }
213*cdf0e10cSrcweir 
214