PHP führt den Linux-Befehl „less“ über exec aus – Binärdateiwarnung
Frage
Ich muss einige PDF-Dateien in TXT konvertieren.Am Ende habe ich den Befehl „less“, weil pdftotext beispielsweise einige Probleme mit Tabellen in PDF hat.Das Problem besteht darin, dass die ausgewählte PDF-Datei eine Binärdatei und die Ergebnisdatei nur eine TXT-Datei mit PDF-Daten ist, wenn ich den Befehl über die Exec-Funktion (oder Shell_exec/system) ausführte, und nicht nur, um mir Informationen anzuzeigen.Aber wenn ich das Gleiche normal im Terminal mache, ist alles in Ordnung.Ich habe auch versucht, mich als www_data-Benutzer anzumelden und den Befehl als dieser Benutzer auszuführen, aber es gibt auch kein Problem.
Befehl:
$ less /var/www/original.pdf > /var/www/new.txt
PHP-Code:
exec("less -f /var/www/original.pdf > /var/www/new.txt 2>&1");
Ergebnis von PHP exec:
"/var/www/original.pdf" may be a binary file. See it anyway?
Die Option „-f“ im Befehl exec ist vorhanden, da Sie dann nicht „y“ für „Ja, ich möchte es trotzdem sehen“ drücken müssen.
set | grep less
Erträge:
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 ()
Lösung
Nach dem, was ich gelesen habe, kann Ihre Konsole eine PDF-Datei mit anzeigen less
weil Sie einen Eingabepräprozessor installiert haben, z lesspipe
oder lessfile
.Der Weg zum Machen less
Verwenden Sie diesen Präprozessor, indem Sie eine Umgebungsvariable namens LESSOPEN lesen, die auf zeigt lesspipe
Und lessfile
Skript.
Möglicherweise kann Ihr Webserver mithilfe von Umgebungsvariablen und Shell-Befehlen dieses Verhalten reproduzieren, sodass Ihre Aufrufe zu less
PDFs richtig analysieren.
Was ich vorschlagen würde, wäre, ein Bash-Skript aufzurufen, um die Konvertierung für Sie durchzuführen, anstatt es aufzurufen less
direkt.Auf diese Weise wäre Ihr Bash-Skript in der Lage, die entsprechenden Umgebungsvariablen festzulegen und die entsprechenden Befehle auszuführen, um Ihre PDF-Dateien in eine lesbare Ausgabe zu konvertieren.
Hier ist ein Beispiel dafür:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
Rufen Sie dann in PHP das Skript wie folgt auf:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
Wenn es nicht funktioniert, versuchen Sie es zu ändern eval $(lesspipe)
Zu eval $(lessfile)
.
Andere Tipps
Zunächst einmal ist weniger ein interaktives Programm, um Textströme zu lesen.In diesem Zusammenhang sollten Sie stattdessen generasAdicetagcode verwenden.Dieser oder der Kurs funktioniert auch nicht, da PDF ein binäres Format ist, im Gegensatz zu Text basierend.
Warum verwenden Sie nicht ein PDF-Text-Konverter wie cat
?
Wie wurde der PHP-Code ausgeführt?Auf der Befehlszeile über php file.php
oder von einem Webserver, wenn Sie mit einem Browser darauf zugreifen http://servername/something/file.php
?
Eine Vermutung ist, dass die less
Sie ausführen, wenn Sie es in der Befehlszeile ausführen, ist nicht dasselbe less
B. wenn der PHP-Code ausgeführt wird.