PHP запускает команду linux "less" через exec - предупреждение о бинарном файле
Я должен конвертировать некоторые файлы PDF в TXT. Я заканчиваю командой "less", потому что, например, у pdftotext есть некоторые проблемы с таблицами в PDF. Проблема в том, что когда я запускал команду из функции exec (или shell_exec/system), а не просто отображал мне информацию, выбранный PDF - это двоичный файл, а файл результатов - просто TXT с данными PDF в нем. Но когда я обычно делаю то же самое в терминале, все в порядке. Я также попытался войти в систему как пользователь www_data и выполнил команду от имени этого пользователя, но проблем также нет.
Команда:
$ less /var/www/original.pdf > /var/www/new.txt
Код PHP:
exec("less -f /var/www/original.pdf > /var/www/new.txt 2>&1");
Результат из PHP exec:
"/var/www/original.pdf" may be a binary file. See it anyway?
Параметр "-f" в команде exec есть, потому что тогда вам не нужно нажимать "y" для "да, я все равно хочу это увидеть".
set | grep less
выходы:
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
Lossless LZW RLE Zip' -- "$cur" ));
_apport_parameterless
_apport_parameterless
_apport_parameterless
_apport_parameterless
_apport_parameterless ()
3 ответа
Из того, что я прочитал, ваша консоль может отображать файл PDF с less
потому что у вас установлен входной препроцессор, например lesspipe
или же lessfile
, Способ сделать less
использовать эти препроцессоры, читая переменную окружения под названием LESSOPEN, которая указывает на lesspipe
а также lessfile
скрипт.
Возможно, ваш веб-сервер через переменные окружения и команды оболочки сможет воспроизвести это поведение, чтобы ваши вызовы less
разбирать PDF-файлы правильно.
Я бы посоветовал вызвать скрипт bash, чтобы выполнить преобразование вместо вас less
непосредственно. Таким образом, ваш bash-скрипт сможет устанавливать соответствующие переменные среды и выполнять соответствующие команды для преобразования ваших PDF-файлов в читаемый вывод.
Вот пример того, как это сделать:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
Затем из PHP вызовите этот скрипт следующим образом:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
Если это не работает, попробуйте изменить eval $(lesspipe)
в eval $(lessfile)
,
Как выполнялся код PHP? В командной строке, через php file.php
или веб-сервером, когда вы нажмете на него с помощью браузера http://servername/something/file.php
?
Одно предположение, что less
вы выполняете, когда делаете это в командной строке не то же самое less
как при запуске кода PHP.
Прежде всего, less - это интерактивная программа для чтения текстовых потоков. В этом контексте вы должны использовать cat
вместо. Это или курс не будут работать, так как PDF - это двоичный формат, а не текстовый.
Почему бы вам не использовать конвертер PDF в текст, как pdftotext
?