PHP ejecuta el comando "menos" de Linux a través de exec - advertencia de archivo binario

StackOverflow https://stackoverflow.com//questions/12709486

  •  13-12-2019
  •  | 
  •  

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

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top