PHP ejecuta el comando "menos" de Linux a través de exec - advertencia de archivo binario
Pregunta
Tengo que convertir algunos archivos PDF a TXT.Termino con el comando "menos", porque, por ejemplo, pdftotext tiene algunos problemas con las tablas en PDF.El problema es que cuando ejecuté el comando desde la función ejecutiva (o shell_exec/system), menos solo mostrarme información, el PDF seleccionado es un archivo binario y el archivo de resultados es solo TXT con datos PDF.Pero cuando hago lo mismo normalmente en la terminal, todo está bien.También intenté iniciar sesión como usuario www_data y ejecuté el comando como este usuario, pero tampoco hay ningún problema.
Dominio:
$ 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 del ejecutivo de PHP:
"/var/www/original.pdf" may be a binary file. See it anyway?
La opción "-f" en el comando exec está ahí porque entonces no es necesario presionar "y" para decir "sí, quiero verlo de todos modos".
set | grep less
rendimientos:
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 ()
Solución
Por lo que leí, su consola puede mostrar un archivo PDF con less
porque tienes un preprocesador de entrada instalado, como lesspipe
o lessfile
.la manera de hacer less
utilizar esos preprocesadores es leyendo una variable de entorno llamada LESSOPEN, que apunta al lesspipe
y lessfile
guion.
Puede haber una forma en que su servidor web, a través de variables de entorno y comandos de shell, pueda replicar este comportamiento para que sus llamadas a less
analizar archivos PDF correctamente.
Lo que sugeriría sería llamar a un script bash para que haga la conversión por usted en lugar de llamar less
directamente.De esa manera, su script bash podrá configurar las variables de entorno apropiadas y ejecutar los comandos apropiados para convertir sus archivos PDF en una salida legible.
A continuación se muestra un ejemplo de cómo hacer esto:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
Luego, desde PHP, llama a ese script así:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
Si no funciona intenta cambiar eval $(lesspipe)
a eval $(lessfile)
.
Otros consejos
En primer lugar, less es un programa interactivo para leer flujos de texto.En este contexto se debe utilizar cat
en cambio.Este curso tampoco funcionará ya que PDF es un formato binario en lugar de estar basado en texto.
¿Por qué no utilizas un conversor de PDF a texto como pdftotext
?
¿Cómo se ejecutó el código PHP?En la línea de comando, a través de php file.php
o por un servidor web cuando lo accedes con un navegador http://servername/something/file.php
?
Una conjetura es que el less
ejecutas cuando lo haces en la línea de comando no es lo mismo less
como cuando se ejecuta el código PHP.