PHP запускает команду Linux «less» через exec — предупреждение о двоичном файле
Вопрос
Мне нужно конвертировать некоторые PDF-файлы в TXT.В итоге я использую команду «меньше», потому что, например, у 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:
"/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 ()
Решение
Судя по тому, что я прочитал, ваша консоль может отображать 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)
.
Другие советы
Прежде всего, less — это интерактивная программа для чтения текстовых потоков.В этом контексте вам следует использовать cat
вместо.Это или конечно не будет работать, поскольку PDF — это двоичный формат, а не текстовый.
Почему бы вам не использовать конвертер PDF в текст, например pdftotext
?
Как выполнялся PHP-код?В командной строке через php file.php
или веб-сервером, когда вы нажимаете на него в браузере http://servername/something/file.php
?
Одно из предположений состоит в том, что less
вы выполняете, когда делаете это в командной строке, это не то же самое less
как при запуске кода PHP.