ما هي أفضل طريقة لاستيراد/قراءة البيانات من ملفات pdf؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

نحصل على كمية كبيرة من البيانات من عملائنا في ملفات pdf بتنسيقات مختلفة [من حيث التخطيط]، وعادةً ما تكون هذه الملفات عبارة عن مخرجات تقرير، وعادة ما تكون مشروحة بشكل صحيح [لا تحتاج عادةً إلى التعرف الضوئي على الحروف]، ولكنها غير منسقة بشكل جيد بما فيه الكفاية إن مجرد نسخ عدة مئات من الصفحات من النص من البهلوان لن ينجح.

أفضل طريقة وجدتها حتى الآن هي كتابة برنامج نصي لتحليل مخرجات xml شبه الصالحة (التعليقات غير صالحة وتم تجاوز العديد من الأحرف بطرق مختلفة، é يصبح [[[e9]]]é، $ يصبح \ $, % يصبح \%...) من الأداة المساعدة pdftoipe لسطر الأوامر (لتحويل ملفات pdf لبرنامج يسمى ipe)، والذي يمنحني عناصر نصية مع مواضعها في كل صفحة [انظر النموذج أدناه]، والذي يعمل بشكل جيد بما يكفي للتقارير التي تكون فيها نفس القيم في نفس المكان في كل صفحة أهتم بها، ولكنها تتطلب جهدًا إضافيًا في البرمجة النصية لاستيراد المصفوفة [علامة التبويب المتقاطعة] ملفات pdf.pdftoipe ليس مخصصًا لهذا الغرض على الإطلاق، وفي أفضل الأحوال يمكن تجميعه يدويًا باستخدام cygwin لنظام التشغيل windows.

هل هناك مكتبات تجعل هذا الأمر سهلاً من خلال بعض لغات البرمجة النصية التي يمكنني تحملها؟ستكون الأداة الرسومية رائعة أيضًا.ومهر.

pdftoipe الناتج هذه العينة يشبه هذا:

<ipe creator="pdftoipe 2006/10/09"><info media="0 0 612 792"/>
<-- Page: 1 1 -->
<page gridsize="8">
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<path fill="1 1 1" fillrule="wind">
64.8 144 m
486 144 l
486 727.2 l
64.8 727.2 l
64.8 144 l
h
</path>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 181.8 707.88">This is a sample PDF fil</text>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 356.28 707.88">e.</text>
<text stroke="1 0 0" pos="0 0" size="18" transformable="yes" matrix="1 0 0 1 368.76 707.88"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 692.4"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 677.88"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 663.36"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 648.84"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 634.32"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 619.8"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 605.28"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 590.76"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 576.24"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 561.72"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 547.2"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 532.68"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 518.16"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 503.64"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 489.12"> </text>
<text stroke="0 0 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 67.32 474.6"> </text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 67.32 456.24">If you can read this</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 214.92 456.24">,</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 219.48 456.24"> you already have A</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 370.8 456.24">dobe Acrobat </text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 67.32 437.64">Reader i</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 131.28 437.64">n</text>
<text stroke="0 0 1" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 141.12 437.64">stalled on your computer.</text>
<text stroke="0 0 0" pos="0 0" size="16.2" transformable="yes" matrix="1 0 0 1 337.92 437.64"> </text>
<text stroke="0 0.502 0" pos="0 0" size="12.6" transformable="yes" matrix="1 0 0 1 342.48 437.64"> </text>
<image width="800" height="600" rect="-92.04 800.64 374.4 449.76" ColorSpace="DeviceRGB" BitsPerComponent="8" Filter="DCTDecode" length="369925">
feedcafebabe...
</image>
</page>
</ipe>
هل كانت مفيدة؟

المحلول

نحن نستخدم إكس بي دي إف في أحد تطبيقاتنا.إنها مكتبة C++ تُستخدم بشكل أساسي لعرض ملفات PDF، على الرغم من أنها تحتوي على مستخرج نصوص قد يكون مفيدًا لهذا المشروع.

نصائح أخرى

إذا كنت لا بأس في الاتصال بشيء خارجي، فيمكنك استخدام Ghostscript - انظر إلى البرنامج النصي ps2ascii المتضمن في التوزيع.لست متأكدًا مما تريده من الأداة الرسومية - زر كبير تضغط عليه لاختيار ملفات الإدخال والإخراج؟معاينة؟قد تتمكن من استخدام GSView، اعتمادًا على ما تريد.

pdftohtml -xml

على الرغم من أن pdftoipe يبدو أكثر تفصيلاً!!

هل نظرت إلى Aspose؟نحن نستخدمه لتطبيق ASP.net وقد رأيت بعض الأمثلة على استخدام vbscript أيضًا.إنها ليست باهظة الثمن أيضًا.

http://www.aspose.com/

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