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 () 
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top