目录

PHP操作LibreOffice将替换变量后的word文件转换为PDF文件

目录

PHP操作LibreOffice将替换变量后的word文件转换为PDF文件

安装libreoffice见:

libreOfficePath = $libreOfficePath;     }          /**      * 检查LibreOffice是否可用      */     public function checkLibreOffice() {         if (!file_exists($this->libreOfficePath)) {             throw new Exception("LibreOffice未找到,请检查路径设置");         }         return true;     }     /**      * 转换单个Word文件为PDF      * @param string $inputFile 输入Word文件路径      * @param string $outputDir 输出PDF目录      * @return bool 转换是否成功      */     public function convertToPdfByShellExec($inputFile, $outputDir) {         // 检查输入文件是否存在         if (!file_exists($inputFile)) {             throw new Exception("输入文件不存在: " . $inputFile);         }                  // 确保输出目录存在         if (!file_exists($outputDir)) {             mkdir($outputDir, 0755, true);         }                  // 获取文件名(不含扩展名)         $filename = pathinfo($inputFile, PATHINFO_FILENAME);                  // 核心-构建转换命令         // --headless: 无界面模式         // --convert-to pdf: 转换为PDF         // --outdir: 输出目录         //libreoffice --headless --convert-to pdf:writer_pdf_Export --outdir /output/path input.docx         $command = escapeshellcmd($this->libreOfficePath) .         ' --headless --convert-to pdf:writer_pdf_Export --outdir '             .escapeshellarg($outputDir).' '.escapeshellarg($inputFile).' 2>&1 &';                          // 执行命令             shell_exec($command);             // 检查是否转换成功             $pdfFile = $outputDir . '/' . $filename . '.pdf';             if (file_exists($pdfFile)) {                 return [                     'success' => true,                     'pdf_path' => $pdfFile,                     'message' => '转换成功'                 ];             } else {                 return [                     'success' => false,                     'input_file' => $inputFile,                     'message' => '转换失败'                 ];             }     }          /**      * 转换单个Word文件为PDF      * @param string $inputFile 输入Word文件路径      * @param string $outputDir 输出PDF目录      * @return bool 转换是否成功      */     public function convertToPdfByExec($inputFile, $outputDir) {         // 检查输入文件是否存在         if (!file_exists($inputFile)) {             throw new Exception("输入文件不存在: " . $inputFile);         }                  // 确保输出目录存在         if (!file_exists($outputDir)) {             mkdir($outputDir, 0755, true);         }                  // 获取文件名(不含扩展名)         $filename = pathinfo($inputFile, PATHINFO_FILENAME);                  // 核心-构建转换命令         // --headless: 无界面模式         // --convert-to pdf: 转换为PDF         // --outdir: 输出目录         //libreoffice --headless --convert-to pdf:writer_pdf_Export --outdir /output/path input.docx         $command = escapeshellcmd($this->libreOfficePath) .         ' --headless --convert-to pdf:writer_pdf_Export --outdir '             .escapeshellarg($outputDir).' '.escapeshellarg($inputFile).' 2>&1 &';                      // 执行命令         \exec($command, $output, $returnVar);                  // 检查是否转换成功         $pdfFile = $outputDir . '/' . $filename . '.pdf';         if ($returnVar === 0 && file_exists($pdfFile)) {             return [                 'success' => true,                 'pdf_path' => $pdfFile,                 'message' => '转换成功'             ];         } else {             return [                 'success' => false,                 'input_file' => $inputFile,                 'message' => '转换失败,错误码: ' . $returnVar . ', 输出: ' . implode("\n", $output)             ];         }     }     /**      * 批量转换目录中的Word文件      * @param string $inputDir 输入目录      * @param string $outputDir 输出目录      * @param array $extensions 要处理的文件扩展名      * @return array 转换结果      */     public function batchConvertToPdf($inputDir, $outputDir, $extensions = ['doc', 'docx']) {         if (!is_dir($inputDir)) {             throw new Exception("输入目录不存在: " . $inputDir);         }                  $results = [];         $directory = new \RecursiveDirectoryIterator($inputDir);         $iterator = new \RecursiveIteratorIterator($directory);         $regex = new \RegexIterator($iterator, '/^.+\.(' . implode('|', $extensions) . ')$/i', \RecursiveRegexIterator::GET_MATCH);                  foreach ($regex as $file) {             $filePath = $file[0];             $results[] = $this->convertToPdfByShellExec($filePath, $outputDir);         }                  return $results;     } } /******************************************************* setValue('val001', $replace);             $doc->setValue('val002', $replace01);             //Temporary document filename (with path)             $tempDocumentFilename = $doc->save();                          // 根据操作系统设置正确的LibreOffice路径             // Windows示例: 'C:/Program Files/LibreOffice/program/soffice.exe'             // Linux示例: '/usr/bin/libreoffice'             // Mac示例: '/Applications/LibreOffice.app/Contents/MacOS/soffice'             $converter = new WordToPdfConverter('/usr/bin/libreoffice');                          // 检查LibreOffice是否可用             $converter->checkLibreOffice();                          // 设置输入文件和输出目录             $inputFile = $tempDocumentFilename;             // PDF输出目录             $outputDir = '.';                          $res_arr = $converter->convertToPdfByShellExec($inputFile, $outputDir);             if($res_arr['success']){                 dd(rename($res_arr['pdf_path'], './123.pdf'));             }else{                 dd($res_arr);             }         } catch (Exception $e) {             echo "错误: " . $e->getMessage() . "\n";             exit;         }     } }