BISMILLAHIRRAHMANIRRAHEEM
ALHAMDOLILLAH после долгих поисков, наконец, нашел ответ.
Windows:
Я сделал некоторые разрешения et c ранее, должно быть тривиально с IIS. Но в конечном итоге проблема была решена как this .
Очевидно, что необходимо указать -env:UserInstallation=file:///C:\some\path
, поскольку вы не можете запускать несколько экземпляров LibreOffice одновременно без указания другой папки профиля ( Ссылка ).
Также см. То же решение здесь .
При выполнении программы через PHP через IIS учетная запись пользователя для Windows учетная запись IUSR.
Итак,
- Дайте разрешения IUSR на запись (и измените? Я даю полное) разрешения на запись в каталог
C:\inetpub\wwwroot\path
. - Измените каталог на путь LibreOffice для
soffice.com
(не требуется, если при выполнении указывается полный путь):
chdir("C:\\Program Files\\LibreOffice\\program");
Установить переменную среды HOME, так как LibreOffice нужен доступный для записи временный путь. IUSR должен иметь разрешения на этот путь. Я просто повторно использую
wwwroot
(этот шаг может быть необязательным):
putenv("HOME=C:\\inetpub\\wwwroot\\temp");
Выполнить в PHP, что-то вроде:
exec("\"C:\\Program Files\\LibreOffice\\program\\soffice.com\" --headless \"-env:UserInstallation=file:///C:/inetpub/wwwroot/LibreOfficeProfilePath1\" --convert-to pdf:writer_pdf_Export --outdir \"C:\\inetpub\\wwwroot\\result\" \"C:\\inetpub\\wwwroot\\source\\file.docx\"", $output, $ret);
// Displaying the command output
print_r($output);
echo "<br />\n\n<br />"; // Line breaks for view-source
echo "Return code: " . $ret;
Очистите, удалив каталоги профилей для LibreOffice. Поскольку вы будете создавать уникальные каталоги на лету в серверной среде для одновременных сеансов LibreOffice, вы также хотели бы их удалить. Следующий фрагмент из
здесь :
exec("rmdir /S /Q \"C:\\inetpub\\wwwroot\\LibreOfficeProfilePath1\"");
Вы можете создать этот путь к профилю автоматически, например:
// Do this before executing soffice command and pass it to -env
$profilepath = "C:/inetpub/wwwroot/LibreOfficeProfilePath" . date("YmdHis") . rand(0, 999999);
// Make sure to replace '/' with '\' when deleting
exec("rmdir /S /Q \"" . str_replace("/", "\\", $profilepath) . "\""); // Windows
exec("rm -rf \"" . str_replace("/", "\\", $profilepath) . "\"); // Linux
или вместо него использовать PHP удалить каталог с файлами в нем, как показано здесь .
LibreOffice, работающий в качестве службы, и PHP запрос конвертации документов может быть лучшим решением, но этот пост относится к вызову LibreOffice каждый раз, когда необходимо преобразование документа и затем его закрытие. Можно также использовать отдельный метод процесса, чтобы избежать ожидания завершения преобразования LibreOffice.
Linux:
- Аналогичные шаги для
www-data
, так как это учетная запись пользователя для apache в Linux. См. Решение здесь . - www-data не имеет каталога $ HOME, поэтому его необходимо указать, как указано в (3) выше.
env
путь будет выглядеть примерно так:
\"-env:UserInstallation=file:///var/www/tmp\"
Обратите внимание на три /
после file:
независимо от Windows или Linux, даже если пути в Linux начинаются с /
, или, может быть, они игнорируют sla sh в Windows, мне кажется несовместимым.
INSHAALLAH это сработает после этого.