1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 #include "pdfioutdev_gpl.hxx" 23 //#include "SecurityHandler.h" 24 #ifdef WNT 25 # include <io.h> 26 # include <fcntl.h> /*_O_BINARY*/ 27 #endif 28 29 FILE* g_binary_out=stderr; 30 31 static const char *ownerPassword = "\001"; 32 static const char *userPassword = "\001"; 33 static const char *outputFile = "\001"; 34 35 int main(int argc, char **argv) 36 { 37 int k = 0; 38 while (k < argc) 39 { 40 if (!strcmp(argv[k], "-f")) 41 { 42 outputFile = argv[k+1]; 43 --argc; 44 for (int j = k; j < argc; ++j) 45 argv[j] = argv[j+1]; 46 } 47 else if (!strcmp(argv[k], "-opw")) 48 { 49 ownerPassword = argv[k+1]; 50 --argc; 51 for (int j = k; j < argc; ++j) 52 argv[j] = argv[j+1]; 53 } 54 else if (!strcmp(argv[k], "-upw")) 55 { 56 userPassword = argv[k+1]; 57 --argc; 58 for (int j = k; j < argc; ++j) 59 argv[j] = argv[j+1]; 60 } 61 ++k; 62 } 63 64 if( argc < 2 ) 65 return 1; 66 67 // read config file 68 globalParams = new GlobalParams( 69 ); 70 globalParams->setErrQuiet(gTrue); 71 #ifdef _MSC_VER 72 globalParams->setupBaseFonts(NULL); 73 #endif 74 75 // try to read a possible open password form stdin 76 char aPwBuf[129]; 77 aPwBuf[128] = 0; 78 if( ! fgets( aPwBuf, sizeof(aPwBuf)-1, stdin ) ) 79 aPwBuf[0] = 0; // mark as empty 80 else 81 { 82 for( unsigned int i = 0; i < sizeof(aPwBuf); i++ ) 83 { 84 if( aPwBuf[i] == '\n' ) 85 { 86 aPwBuf[i] = 0; 87 break; 88 } 89 } 90 } 91 92 // PDFDoc takes over ownership for all strings below 93 GooString* pFileName = new GooString(argv[1]); 94 GooString* pTempErrFileName = new GooString("_err.pdf"); 95 GooString* pTempErrFileNamePath = new GooString(argv[0]); 96 97 GooString* pErrFileName = new GooString(pTempErrFileNamePath,pTempErrFileName); 98 99 100 // check for password string(s) 101 GooString* pOwnerPasswordStr( aPwBuf[0] != 0 102 ? new GooString( aPwBuf ) 103 : (ownerPassword[0] != '\001' 104 ? new GooString(ownerPassword) 105 : (GooString *)NULL ) ); 106 GooString* pUserPasswordStr( userPassword[0] != '\001' 107 ? new GooString(userPassword) 108 : (GooString *)NULL ); 109 if( outputFile[0] != '\001' ) 110 g_binary_out = fopen(outputFile,"wb"); 111 112 #ifdef WNT 113 // Win actually modifies output for O_TEXT file mode, so need to 114 // revert to binary here 115 _setmode( _fileno( g_binary_out ), _O_BINARY ); 116 #endif 117 118 PDFDoc aDoc( pFileName, 119 pOwnerPasswordStr, 120 pUserPasswordStr ); 121 122 PDFDoc aErrDoc( pErrFileName, 123 pOwnerPasswordStr, 124 pUserPasswordStr ); 125 126 127 // Check various permissions. 128 if ( !aDoc.isOk()|| 129 !aDoc.okToPrint() || 130 !aDoc.okToChange()|| 131 !aDoc.okToCopy()|| 132 !aDoc.okToAddNotes() ) 133 { 134 pdfi::PDFOutDev* pOutDev( new pdfi::PDFOutDev(&aErrDoc) ); 135 136 const int nPages = aErrDoc.isOk() ? aErrDoc.getNumPages() : 0; 137 138 // tell receiver early - needed for proper progress calculation 139 pOutDev->setPageNum( nPages ); 140 141 // virtual resolution of the PDF OutputDev in dpi 142 static const int PDFI_OUTDEV_RESOLUTION=7200; 143 144 // do the conversion 145 for( int i=1; i<=nPages; ++i ) 146 { 147 aErrDoc.displayPage( pOutDev, 148 i, 149 PDFI_OUTDEV_RESOLUTION, 150 PDFI_OUTDEV_RESOLUTION, 151 0, gTrue, gTrue, gTrue ); 152 aErrDoc.processLinks( pOutDev, i ); 153 } 154 } 155 else 156 { 157 pdfi::PDFOutDev* pOutDev( new pdfi::PDFOutDev(&aDoc) ); 158 159 // tell receiver early - needed for proper progress calculation 160 pOutDev->setPageNum( aDoc.getNumPages() ); 161 162 // virtual resolution of the PDF OutputDev in dpi 163 static const int PDFI_OUTDEV_RESOLUTION=7200; 164 165 // do the conversion 166 const int nPages = aDoc.getNumPages(); 167 for( int i=1; i<=nPages; ++i ) 168 { 169 aDoc.displayPage( pOutDev, 170 i, 171 PDFI_OUTDEV_RESOLUTION, 172 PDFI_OUTDEV_RESOLUTION, 173 0, gTrue, gTrue, gTrue ); 174 aDoc.processLinks( pOutDev, i ); 175 } 176 } 177 return 0; 178 } 179