PHP запускает команду Linux «less» через exec — предупреждение о двоичном файле

StackOverflow https://stackoverflow.com//questions/12709486

  •  13-12-2019
  •  | 
  •  

Вопрос

Мне нужно конвертировать некоторые 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top