يقوم PHP بتشغيل أمر Linux "أقل" عبر exec - تحذير من الملف الثنائي

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

  •  13-12-2019
  •  | 
  •  

سؤال

لا بد لي من تحويل بعض ملفات 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top