PHP Esegui il comando Linux "Meno" tramite Exec - Binary File Avvertenza
Domanda
Devo convertire alcuni file PDF in txt.Finisco con il comando "meno", perché ad esempio Pdftotext ha alcuni problemi con le tabelle in PDF.Il problema è che quando ho eseguito il comando dalla funzione Exec (o Shell_exec / System), meno mostrandomi solo informazioni, che il PDF selezionato è file binario e il file di risultato è solo txt con i dati PDF in esso.Ma quando faccio la stessa cosa normalmente nel terminale, tutto è ok.Ho anche provato ad accedere come utente www_data e comando RAN come questo utente, ma non c'è anche alcun problema.
Comando:
$ less /var/www/original.pdf > /var/www/new.txt
.
Codice PHP:
exec("less -f /var/www/original.pdf > /var/www/new.txt 2>&1");
.
Risultato da PHP Exec:
"/var/www/original.pdf" may be a binary file. See it anyway?
.
L'opzione "-f" nel comando exec è lì perché non è necessario premere "y" per "sì, voglio vederlo comunque."
set | grep less
rendisce:
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 ()
. Soluzione
Da quello che ho letto, la tua console è in grado di visualizzare un file PDF con less
perché è installato un preprocessore di ingresso, come lesspipe
o lessfile
. Il modo per rendere less
utilizzare il preprocessore è leggendo una variabile di ambiente chiamata LessOpen, che punta allo script lesspipe
e lessfile
.
Potrebbe esserci un modo in cui il tuo webserver, attraverso variabili di ambiente e comandi di shell, potrebbe essere in grado di replicare questo comportamento in modo che le chiamate a less
analizzano correttamente i PDF.
Cosa suggerirei sarebbe chiamare uno script bash per eseguire la conversione per te invece di chiamare direttamente less
. In questo modo, il tuo script Bash sarebbe in grado di impostare le variabili di ambiente appropriate ed eseguire i comandi appropriati per convertire i file PDF in un'uscita leggibile.
Ecco un esempio di come fare questo:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
.
Allora, da PHP, chiama quello script come questo:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
.
Se non funziona, prova a cambiare eval $(lesspipe)
a eval $(lessfile)
.
Altri suggerimenti
Prima di tutto, meno è un programma interattivo per leggere i flussi di testo.In questo contesto dovresti usare invece cat
.Questo o il corso non funzionerà neanche dal PDF è un formato binario contrario al testo basato.
Perché non usi un convertitore PDF in testo come pdftotext
?
Come è stato eseguito il codice PHP?Nella riga di comando, tramite php file.php
o da un server Web quando lo colpisci con un browser http://servername/something/file.php
?
Una ipotesi è che il less
che si esegue quando si esegue sulla riga di comando non è lo stesso less
come quando viene eseguito il codice PHP.