/** * Funcion para dividir archivos PDF a partir de una tag encontrada en cada hoja * y nombramiento de archivos resultantes a partir de otra tag de la hoja * @author 4L3J4NDR0 4N4Y4 (energy1011[4t]gmail[d0t]com) 2014 * @uses FPDF Class (IMPORTANTE: Modificada especialmente para este uso ) * @uses FPDI Class * @uses PDFMerger Class ( Modificada especialmente para este uso ) * @param String $filename nombre del archivo PDF a procesar (sin ruta) * @param String $pathSource ruta del archivo PDF a dividir * @param String $pathSplits ruta para guardar los PDF divididos resultantes * @param String $tagRuleToSplit palabra (tag) del PDF que funciona como disparador para la division de hojas * @param String $posTagToNameFile posicion de la tag con coordenadas formato PDF que necesitamos extraer para nombrar el archivo con el contenido de esta etiqueta * @param String $orientationPage orientacion de la pagina 'P' = normal vertical 'L' = landscape * @param String $sheetType tipo o tamaño de hoja 'Letter' , 'A4', etc * @param String $regex para obtener la TagToNameFile dentro del flujo string del PDF * @param String $stringSizeToRegex tamaño de la cadena a tomar despues de encontrar las coordenadas de la TagToNameFile se posteriormente se le aplica el regex * @param String $splitName nombre general para todos los splits que estaran dentro del zip, si no se pasa un splitName a esta funcion, el nombre para cada uno de los splits es igual al del archivo importado * @return String $responseTXT respuesta del proceso en texto */ function PDFSplitter_split($filename = '', $pathSource = '', $pathSplits = '', $tagRuleToSplit = '', $posTagToNameFile = '', $orientationPage = 'P', $sheetType = 'Letter', $regex = '/\\((.*?)\\)/', $stringSizeToRegex = 27, $splitName = NULL) { @session_start(); $responseTXT = ''; // mensajes de lo sucedido durante el proceso $filename = trim($filename); $pathSplits = trim($pathSplits); $posTagToNameFile = trim($posTagToNameFile); $orientationPage = trim(strtoupper($orientationPage)); $sheetType = trim(ucfirst($sheetType)); $stringSizeToRegex = (int) $stringSizeToRegex; if (is_null($filename)) { $responseTXT .= BR . "Es necesario el nombre del archivo a leer."; return $responseTXT; } if (is_null($pathSplits)) { $responseTXT .= BR . "No se ha indicado ruta donde se guardaran los archivos resultantes del split."; return $responseTXT; } if (is_null($tagRuleToSplit)) { //TODO: sin tagrule $responseTXT .= BR . "No se ha definido un texto o tag de criterio para dividir las hojas, por default el criterio de division sera por hojas."; } if (is_null($posTagToNameFile)) { $responseTXT .= BR . "No se ha definido ninguna dato a extraer de las hojas, para usarse en el nombramiento de archivos resultantes, por default sera el num de hoja."; } // Creo objeto FPDI y obtengo el numero de paginas $pdf = new FPDI(); // Defino el archivo a procesar en el objeto PDF $pagecount = $pdf->setSourceFile($pathSource . $filename); // Inicializo la variable que guarda el nombre del ultimo archivo (pagina dividida) $last_filename = ''; // Obtengo el session id $my_session_id = session_id(); // Borro posibles splits anteriores con el mismo session_id PDFSplitter_delete_all_session_files($pathSplits, '.pdf'); if ($pagecount > 0) { // Itero sobre las paginas del documento PDF for ($i = 1; $i <= $pagecount; $i++) { $new_pdf = new FPDI(); $new_pdf->setSourceFile($pathSource . $filename); $importedPage = $new_pdf->importPage($i); $new_pdf->AddPage($orientationPage, $sheetType); $new_pdf->useTemplate($importedPage); try { $thisTagGotContent = ''; // Agrego id de session al nombre del archivo para evitar colisiones de archivos con otros usuarios $thisFilename = $my_session_id . "_" . $filename; // Verifico nuevamente que no exista el archivo if (file_exists($pathSplits . $thisFilename)) { $responseTXT .= BR . "Existe un archivo con el mismo nombre, vuelva a intentarlo."; return $responseTXT; } // Agrego un consecutivo al nombre del archivo (el numero de hoja) $thisFilename = str_replace('.pdf', '-' . $i . '.pdf', $thisFilename); //Verifica si cada split lleva un nombre if ($splitName != NULL) { // cada split se le agrega el nombre pasado por parametro $thisFilename = str_replace(str_replace('.pdf', '', $filename), $splitName, $thisFilename); } $new_pdf->Output($pathSplits . $thisFilename, "F"); $responseTXT .= BR . BR . ICON_IMG . "Hoja " . $i . " dividida "; // Obtengo la posicion de la etiqueta que voy a extraer para utilizara como parte de nombre del archivo $thisPosTagToGet = @strpos($new_pdf->mybuffer, $posTagToNameFile); // Obtengo la posicion de la etiqueta que usare como disparador del split $thisPosTriggerTab = @strpos($new_pdf->mybuffer, $tagRuleToSplit); // Si existe la etiqueta a extraer en la hoja actual y existe la etiqueta trigger del esplit (Es una hoja que inicia el archivo y necesitamos extraer la etiqueta para nombrarlo) if ($thisPosTagToGet != false && $thisPosTriggerTab != false) { // Obtengo la string con las coordenadas y doy 27 caracteres de tolerancia en la cadena a partir de la posicion de las coordenadas en el string $myStringTag = substr($new_pdf->mybuffer, $thisPosTagToGet, $stringSizeToRegex); // Libero memoria unset($new_pdf->mybuffer); // Obtengo el valor de la etiqueta que esta dentro del parentesis preg_match($regex, $myStringTag, $result); //Libero memoria unset($myStringTag); $thisTagGotContent = $result[1]; // Defino nuevo nombre al archivo a partir del tag obtenido $newNameWithTag = str_replace('-' . $i . '.pdf', '_' . $thisTagGotContent . '.pdf', $thisFilename); // $responseTXT .= BR."--Nombre actual:".$thisFilename; // $responseTXT .= BR."--Nuevo nombre:".$newNameWithTag; // Renombro el archivo con el nuevo tag incluido @rename($pathSplits . $thisFilename, $pathSplits . $newNameWithTag); // $responseTXT .= BR."--Archivo renombrado a:".$pathSplits.$newNameWithTag; $thisFilename = $newNameWithTag; } //Necesito un merge con la hoja anterior ? // No tenemos la trigger tab para el split entonces tenemos una hoja que es consecutiva y necesitamos un merge con el archivo anterior if ($thisPosTriggerTab === false && strlen($last_filename) > 0 && $thisPosTagToGet === false) { // Obtengo la cadena dond e se encuentran los datos de X etiqueta (Folio dentro del documento) $responseTXT .= BR . "---->" . ICON_IMG . "Hoja:" . $i . " Esta es una hoja consecutiva, realizo merge con la hoja anterior."; $config = array('myOrientation' => $orientationPage, 'mySheetType' => $sheetType); $pdfMerge = new PDFMerger($config); $pdfMerge->addPDF($last_filename, 'all')->addPDF($pathSplits . $thisFilename, 'all')->merge('file', $last_filename); // borro el archivo que ya hice merge con la hoja anterior if (file_exists($pathSplits . $thisFilename)) { // $responseTXT .= BR."--Borre el archivo:".$thisFilename; unlink($pathSplits . $thisFilename); // Libero memoria del merge merge unset($pdfMerge); continue; } } // Guardo el nombre del archivo tratado en la iteracion actual para usarlo en la siguiente iteracion $last_filename = $pathSplits . $thisFilename; } catch (Exception $e) { PDFSplitter_log_it($this->config->item('ruta_pdfsplitter_log'), "Archivo con compresion no permitida."); // Tenemos una exception $responseTXT = $e->getMessage() . "\n"; $new_pdf->cleanUp(); // Borro el archivo .pdf fuente que se iba a dividir unlink($pathSource . $filename); return $responseTXT; } $new_pdf->cleanUp(); // libero memoria del objeto hoja pdf de esta iteracion unset($new_pdf); } // End for iteracion por hojas del pdf return $responseTXT .= BR . "Proceso completado."; } // end if pages < 0 }
/** * Regresa el zipfile descargable * @author 4L3J4NDR0 4N4Y4 (energy1011[4t]gmail[d0t]com) 2014 * @uses PDFSplitter_get_zipfile() * @return boolean */ function download_zip() { $result = PDFSplitter_get_zipfile($this->config->item('ruta_splited_files'), $this->config->item('ruta_zipfile'), 'Archivos.zip'); if ($result == false) { echo "Error al generar el archivo descargable"; PDFSplitter_log_it($this->config->item('ruta_pdfsplitter_log'), "Error: al entregar el archivo descargable."); } else { return $result; } }