У меня проблема с преобразованием docx в pdf-файлы в моем скрипте.
Сначала я попытался использовать решение на основе чистого php, описанное здесь: { ссылка }
К сожалению, это не работает (создает пустой com-объект, а затем выдает фатальную ошибку).
Поэтому я попытался использовать скрипт python для этого. Здесь я использую отличный скрипт: { ссылка }
Итак, вот проблема.
Автономный скрипт Python (запускается из командной строки) работает просто хорошо, и сохраняет преобразованный PDF. К сожалению, когда я пытаюсь вызвать его через PHP, он не может сохранить преобразованный файл.
PHP сценарии могут создавать и записывать файлы в одном каталоге без проблем
Это предположительно быть локальной конфигурацией, поэтому мне нет дела до переносимости
Скрипты:
*******PHP*******
<?php
//Script only for testing Python calls, tried different methods
error_reporting(E_ALL);
echo '<h1>Begin</h1>';
echo '<h2>Before call</h2>';
exec ('python dp.py');
echo '<h2>After exec call</h2>';
system('python dp.py');
echo '<h2>After Sys Call</h2>';
passthru('python dp.py');
echo '<h2>After Pass Call</h2>';
$w = get_current_user();
var_dump($w);
?>
*****Python*****
import sys
import os
import comtypes.client
import win32com.client
wdFormatPDF = 17
#static file names for testing
in_file = 'C:\\Users\\fake_user\\OneDrive\\Stuff\\f1.docx'
out_file = 'C:\\Users\\fake_user\\OneDrive\\Stuff\\f3.pdf'
print('BEGIN<br>\n')
word = win32com.client.Dispatch('Word.Application')
word.Visible = False
doc = word.Documents.Open(in_file)
print('\nOpened Docx\n<br>')
print(in_file);
doc.SaveAs(out_file, FileFormat=wdFormatPDF)
print('\nSaved\n<br>')
doc.Close()
word.Quit()
print('DONE\n')
***** Вывод из браузера *****
Begin
Before call
After exec call
BEGIN
Opened Docx
C:\Users\fake_user\OneDrive\Stuff\f1.docx
After Sys Call
BEGIN
Opened Docx
C:\Users\fake_user\OneDrive\Stuff\f1.docx
After Pass Call
string(5) "fake_user"
Конфигурация системы
Windows 7 Professional Edition с пакетом обновления 1
Apache / 2.4.26 (Win32)
OpenSSL / 1.0.2l
PHP / 7.1.7
Python 3.8.1
Я пытался запустить Apache как системную службу и как пользователя, которому принадлежит OneDrive (имя изменено на "fake_user" здесь), так что это не должно быть проблемой с разрешениями (я думаю)
Любая помощь приветствуется