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