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?

Другие вопросы по тегам