يقوم PHP بتشغيل أمر Linux "أقل" عبر exec - تحذير من الملف الثنائي
سؤال
لا بد لي من تحويل بعض ملفات PDF إلى TXT.انتهى بي الأمر بأمر "أقل"، لأنه على سبيل المثال، يعاني pdftotext من بعض المشاكل مع الجداول في PDF.المشكلة هي أنه عندما قمت بتشغيل الأمر من وظيفة exec (أو shell_exec/system)، ناهيك عن عرض المعلومات لي، فإن ملف PDF المحدد هو ملف ثنائي والملف الناتج هو مجرد TXT يحتوي على بيانات PDF فيه.ولكن عندما أفعل نفس الشيء عادة في المحطة، كل شيء على ما يرام.لقد حاولت أيضًا تسجيل الدخول كمستخدم www_data وقمت بتشغيل الأمر باسم هذا المستخدم، ولكن لا توجد مشكلة أيضًا.
يأمر:
$ less /var/www/original.pdf > /var/www/new.txt
كود PHP:
exec("less -f /var/www/original.pdf > /var/www/new.txt 2>&1");
النتيجة من PHP exec:
"/var/www/original.pdf" may be a binary file. See it anyway?
الخيار "-f" في أمر exec موجود لأنه لن تحتاج بعد ذلك إلى الضغط على "y" للإجابة على "نعم، أريد رؤيته على أي حال".
set | grep less
عائدات:
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 ()
المحلول
من ما قرأته، وحدة التحكم الخاصة بك قادرة على عرض ملف PDF مع less
لأن لديك معالج إدخال مثبتًا، مثل lesspipe
أو lessfile
.طريقة صنع less
استخدام تلك المعالجات المسبقة يكون عن طريق قراءة متغير بيئة يسمى LESSOPEN، والذي يشير إلى lesspipe
و lessfile
النصي.
قد تكون هناك طريقة قد يتمكن بها خادم الويب الخاص بك، من خلال متغيرات البيئة وأوامر shell، من تكرار هذا السلوك حتى تتمكن مكالماتك إلى less
تحليل ملفات PDF بشكل صحيح.
ما أقترحه هو استدعاء برنامج نصي bash لإجراء التحويل نيابةً عنك بدلاً من الاتصال less
مباشرة.بهذه الطريقة، سيكون برنامج bash النصي الخاص بك قادرًا على تعيين متغيرات البيئة المناسبة وتنفيذ الأوامر المناسبة لتحويل ملفات PDF الخاصة بك إلى مخرجات قابلة للقراءة.
فيما يلي مثال لكيفية القيام بذلك:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
ثم، من PHP، استدعاء هذا البرنامج النصي مثل هذا:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
إذا لم ينجح الأمر، حاول التغيير eval $(lesspipe)
ل eval $(lessfile)
.
نصائح أخرى
بادئ ذي بدء، أقل هو برنامج تفاعلي لقراءة تدفقات النص.في هذا السياق يجب عليك استخدام cat
بدلاً من.لن تعمل هذه الدورة أيضًا نظرًا لأن PDF عبارة عن تنسيق ثنائي بدلاً من التنسيق المستند إلى النص.
لماذا لا تستخدم PDF لتحويل النص مثل pdftotext
?
كيف تم تنفيذ كود PHP؟على سطر الأوامر، عبر php file.php
أو عن طريق خادم الويب عندما تضغط عليه باستخدام المتصفح http://servername/something/file.php
?
أحد التخمينات هو أن less
يتم تنفيذه عند القيام بذلك على سطر الأوامر ليس هو نفسه less
كما هو الحال عند تشغيل كود PHP.