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 () 
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top