كيف يمكنني إجراء بحث عن النص الكامل لملفات PDF من Perl؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

لدي مجموعة من ملفات PDF ويحتاج برنامج Perl الخاص بي إلى إجراء بحث عن النص الكامل لها لإرجاع الملفات التي تحتوي على سلسلة محددة.حتى الآن كنت أستخدم هذا:

my @search_results = `grep -i -l \"$string\" *.pdf`;

حيث $string هو النص الذي يجب البحث عنه.لكن هذا يفشل بالنسبة لمعظم ملفات pdf لأن تنسيق الملف ليس ASCII.

ما الذي يمكنني فعله بشكل أسهل؟

إيضاح:هناك حوالي 300 ملف pdf لا أعرف اسمها مسبقًا.PDF::Core ربما يكون مبالغة.أحاول أن أجعل pdftotext و grep يلعبان بشكل جيد مع بعضهما البعض نظرًا لأنني لا أعرف أسماء ملفات pdf، ولا يمكنني العثور على بناء الجملة الصحيح حتى الآن.

الحل النهائي باستخدام اقتراح آدم بيلير أدناه:

@search_results = `for i in \$( ls ); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`;
هل كانت مفيدة؟

المحلول

موضوع بيرلمونكس هنا يتحدث عن هذه المشكلة.

يبدو أنه بالنسبة لموقفك، قد يكون من الأسهل الحصول عليه pdftotext (أداة سطر الأوامر)، فيمكنك القيام بشيء مثل:

my @search_results = `pdftotext myfile.pdf - | grep -i -l \"$string\"`;

نصائح أخرى

أنا الحل الثاني لآدم بيلير.لقد استخدمت الأداة المساعدة pdftotext لإنشاء فهرس النص الكامل لمكتبة الكتب الإلكترونية الخاصة بي.إنها بطيئة إلى حد ما ولكنها تقوم بعملها.أما بالنسبة للنص الكامل، فجرّب PLucene أو KinoSearch لتخزين فهرس النص الكامل.

مكتبتي، الكاميرا::PDF, ، لديه دعم لاستخراج النص، ولكنها مشكلة صعبة بطبيعتها نظرًا للتوجه الرسومي لبناء جملة PDF.لذلك، يكون الإخراج في بعض الأحيان رطانة.CAM::حزم PDF أ getpdftext.pl البرنامج، أو يمكنك استدعاء الوظيفة مثل ذلك:

my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n";
for my $pagenum (1 .. $doc->numPages()) {
   my $text = $doc->getPageText($pagenum);
   print $text;
}

قد ترغب في إلقاء نظرة على قوات الدفاع الشعبي::الأساسية.

أسهل فهرس/بحث للنص الكامل استخدمته هو mysql.ما عليك سوى إدراجه في الجدول مع الفهرس المناسب عليه.تحتاج إلى قضاء بعض الوقت في تحديد الأوزان النسبية للحقول (قد يكون هناك تطابق في العنوان أعلى من التطابق في النص)، ولكن كل هذا ممكن، وإن كان مع بعض SQL المشعرة.

تم إهمال Plucene (لم يكن هناك أي عمل نشط عليه في العامين الماضيين) لصالح KinoSearch.نما KinoSearch جزئيًا بسبب فهم القيود المعمارية لبلوسيني.

إذا كان لديك ما يقرب من 300 ملف pdf، فبمجرد استخراج النص من ملف PDF (بافتراض أن ملف PDF يحتوي على نص وليس مجرد صور للنص؛) واعتمادًا على أحجام استعلامك، قد تجد أن grep كافٍ.

ومع ذلك، أقترح بشدة مسار mysql/kinosearch نظرًا لأنه يغطي الكثير من الأمور (الجذع، وكلمات التوقف، وترجيح المصطلح، وتحليل الرمز المميز) التي لا تستفيد من التورط فيها.

من المحتمل أن يكون KinoSearch أسرع من مسار mysql، لكن مسار mysql يمنحك برامج/أدوات/خبرة مطورين قياسية أكثر استخدامًا.وستحصل على القدرة على استخدام قوة SQL لزيادة استعلامات البحث عن النص الحر.

لذلك، ما لم تكن تتحدث عن مجموعات بيانات ضخمة وأحجام استعلامات هائلة، فإن أموالي ستكون على mysql.

يمكنك تجربة Lucene (يُسمى منفذ Perl Plucene).عمليات البحث سريعة بشكل لا يصدق وأنا أعلم أن PDFBox يعرف بالفعل كيفية فهرسة ملفات PDF باستخدام Lucene.PDFBox هو Java، ولكن من المحتمل أن يكون هناك شيء مشابه جدًا في مكان ما في CPAN.حتى إذا لم تتمكن من العثور على شيء يضيف بالفعل ملفات PDF إلى فهرس Lucene، فلا ينبغي أن تحتاج إلى أكثر من بضعة أسطر من التعليمات البرمجية للقيام بذلك بنفسك.سيمنحك Lucene عددًا لا بأس به من خيارات البحث أكثر من مجرد البحث عن سلسلة في ملف.

هناك أيضًا طريقة سريعة جدًا وقذرة.يتم تخزين النص الموجود في ملف PDF كنص عادي.إذا قمت بفتح ملف PDF في محرر نصوص أو استخدمت "السلاسل"، فيمكنك رؤية النص الموجود هناك.عادة ما تكون الملفات الثنائية غير المرغوب فيها عبارة عن خطوط وصور وما إلى ذلك.

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