log(sprintf('Making temporary directory %s.', $tempDirectory), Zend_Log::INFO); mkdir($tempDirectory); // ----------------------------------------------------------------------------- // Generate temporary documents $tempFilenames = array(); $mailMerge = new Zend_Service_LiveDocx_MailMerge(); $mailMerge->setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); $mailMerge->setLocalTemplate('template.docx'); for ($iteration = 1; $iteration <= $iterations; $iteration ++) { $tempFilename = sprintf('%s/%010s.pdf', $tempDirectory, $iteration); $tempFilenames[] = $tempFilename; $mailMerge->assign('software', randomString()) ->assign('licensee', randomString()) ->assign('company', randomString()) ->assign('date', Zend_Date::now()->toString(Zend_Date::DATE_LONG)) ->assign('time', Zend_Date::now()->toString(Zend_Date::TIME_LONG)) ->assign('city', randomString()) ->assign('country', randomString()); $mailMerge->createDocument(); file_put_contents($tempFilename, $mailMerge->retrieveDocument('pdf')); $logger->log(sprintf('Generating temporary document %s.', $tempFilename), Zend_Log::INFO); } unset($mailMerge); // ----------------------------------------------------------------------------- // Concatenate temporary documents and write output document $outputFilename = './document-concat.pdf'; $logger->log('Concatenating temporary documents...', Zend_Log::INFO); if (true === concatenatePdfFilenames($tempFilenames, $outputFilename, $processor)) { $logger->log(sprintf('...DONE. Saved output document as %s.', $outputFilename), Zend_Log::INFO); } else { $logger->log(sprintf('...ERROR.'), Zend_Log::ERR); } // ----------------------------------------------------------------------------- // Delete temporary directory $logger->log(sprintf('Deleting temporary directory %s.', $tempDirectory), Zend_Log::INFO); if (is_dir($tempDirectory)) { recursiveRemoveDirectory($tempDirectory); } // ============================================================================= // Helper functions /** * Create a random string * * @return string */ function randomString() { $ret = ''; $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $poolLen = strlen($pool); $stringLen = rand(5, 25); for ($i = 0; $i < $stringLen; $i ++) { $pos = (rand() % $poolLen); $ret .= $pool{$pos}; } return $ret; } /** * Recursively remove directory * * @param string $dir * @return void */ function recursiveRemoveDirectory($dir) { $files = glob($dir . '*', GLOB_MARK); foreach ($files as $file) { if ('/' === substr($file, - 1)) { recursiveRemoveDirectory($file); } else { unlink($file); } } if (is_dir($dir)) { rmdir($dir); } } /** * Concatenate the files in passed array $inputFilenames into one file * $outputFilename, using concatenation processor (external 3rd party command * line tool) specified in $processor * * @param array $inputFilenames * @param array $outputFilename * @param string $processor * @return boolean */ function concatenatePdfFilenames($inputFilenames, $outputFilename, $processor = EXEC_PDFTK) { $ret = false; $logger = Zend_Registry::get('logger'); if (! (is_file(EXEC_PDFTK) || is_file(EXEC_GHOSTSCRIPT))) { $logger->log('Either pdftk or ghostscript are required for this sample application.', Zend_Log::CRIT); exit(); } if (is_file($outputFilename)) { unlink($outputFilename); } switch ($processor) { case PROCESSOR_PDFTK : $format = '%s %s cat output %s'; $command = sprintf($format, EXEC_PDFTK, implode($inputFilenames, ' '), $outputFilename); break; case PROCESSOR_GHOSTSCRIPT : $format = '%s -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dAutoFilterColorImages=false '; $format .= '-dAutoFilterGrayImages=false -dAutoFilterMonoImages=false '; $format .= '-dColorImageFilter=/FlateEncode -dCompatibilityLevel=1.3 -dEmbedAllFonts=true '; $format .= '-dGrayImageFilter=/FlateEncode -dMaxSubsetPct=100 -dMonoImageFilter=/CCITTFaxEncode '; $format .= '-dSubsetFonts=true -sOUTPUTFILE=%s %s'; $command = sprintf($format, EXEC_GHOSTSCRIPT, $outputFilename, implode($inputFilenames, ' ')); break; default: $logger->log('Invalid concatenation processor - use PROCESSOR_PDFTK or PROCESSOR_GHOSTSCRIPT only.', Zend_Log::CRIT); exit(); break; } $command = escapeshellcmd($command); exec($command); if (is_file($outputFilename) && filesize($outputFilename) > 0) { $ret = true; } return $ret; }