PHP rodar o linux "menos" comando exec via - arquivo binário aviso
Pergunta
Eu tenho que converter arquivos de PDF para TXT.Eu acabar com o "menos" de comando, porque por exemplo pdftotext tem alguns problemas com tabelas em PDF.O problema é que quando eu executei o comando de função exec (ou shell_exec/sistema), menos apenas mostrando-me mais informação, que escolheu o PDF é binário de arquivo e o arquivo de resultado é apenas TXT com dados PDF nele.Mas quando eu faço a mesma coisa normalmente no terminal, está tudo ok.Eu também tentou entrar como www_data usuário e executou o comando como este usuário, mas também não há problema.
Comando:
$ less /var/www/original.pdf > /var/www/new.txt
Código PHP:
exec("less -f /var/www/original.pdf > /var/www/new.txt 2>&1");
Resultado do PHP exec:
"/var/www/original.pdf" may be a binary file. See it anyway?
O "-f" opção no comando exec existe, porque então você não precisa pressione "y" para "sim, eu quero vê-lo de qualquer maneira."
set | grep less
rendimento:
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 ()
Solução
Pelo que li, o seu console é capaz de exibir um arquivo PDF com less
porque você tem uma entrada pré-processador instalado, como lesspipe
ou lessfile
.A maneira de se fazer less
utilize os pré-processador é através da leitura de uma variável de ambiente chamada LESSOPEN, que aponta para o lesspipe
e lessfile
script.
Não seria uma forma de o servidor web, através de variáveis de ambiente e comandos de shell, pode ser capaz de replicar este comportamento, para que as chamadas para less
analisar PDFs corretamente.
O que eu sugeriria seria a chamada para um bash script para fazer a conversão para você, em vez de chamar less
diretamente.Dessa forma, o script bash seria capaz de definir o adequado variáveis de ambiente e executar os comandos apropriados para converter seus arquivos PDF para uma saída legível.
Aqui está um exemplo de como fazer isso:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
Em seguida, a partir de PHP, chamada de script como este:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
Se não funcionar, tente alterar eval $(lesspipe)
para eval $(lessfile)
.
Outras dicas
Primeiro de tudo, menos é um programa interativo para ler o texto fluxos.Neste contexto, você deve usar cat
em vez disso.Este curso não funcionará uma vez que o PDF é um formato binário, em oposição ao texto de base.
Por que você não use um pdf para conversor de texto, como pdftotext
?
Como foi o código PHP executado?Na linha de comando, através de php file.php
ou por um servidor Web quando você atingi-lo com um navegador http://servername/something/file.php
?
Uma suposição é que o less
executar quando a fazê-lo na linha de comando não é o mesmo less
como quando o código PHP é executado.