قم بتركيب ملف PDF للحصول على معلومات تفصيلية حول كل حرف نصي ومستطيل وسطر. بالإضافة إلى: استخراج الجدول وتصحيح الأخطاء البصرية.
يعمل بشكل أفضل مع ملفات PDF التي يتم إنشاؤها آليًا، بدلاً من ملفات PDF الممسوحة ضوئيًا. مبني على pdfminer.six
.
تم اختباره حاليًا على Python 3.8، 3.9، 3.10، 3.11.
تتوفر ترجمات هذه الوثيقة باللغة: الصينية (بواسطة @hbh112233abc).
للإبلاغ عن خطأ أو طلب ميزة، يرجى تقديم مشكلة. لطرح سؤال أو طلب المساعدة بشأن ملف PDF محدد، يرجى استخدام منتدى المناقشات.
pip install pdfplumber
curl " https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf " > background-checks.pdf
pdfplumber < background-checks.pdf > background-checks.csv
سيكون الناتج عبارة عن ملف CSV يحتوي على معلومات حول كل حرف وسطر ومستطيل في ملف PDF.
دعوى | وصف |
---|---|
--format [format] | csv أو json . يقوم تنسيق json بإرجاع المزيد من المعلومات؛ فهو يتضمن بيانات تعريفية على مستوى PDF وعلى مستوى الصفحة، بالإضافة إلى السمات المتداخلة في القاموس. |
--pages [list of pages] | قائمة صفحات مفهرسة بمسافات 1 أو نطاقات صفحات موصولة. على سبيل المثال، 1, 11-15 ، والتي ستعرض بيانات للصفحات 1، 11، 12، 13، 14، و15. |
--types [list of object types to extract] | الاختيارات هي char ، rect ، line ، curve ، image ، annot ، وما إلى ذلك. الإعدادات الافتراضية لجميع المتاحة. |
--laparams | سلسلة بتنسيق JSON (على سبيل المثال، '{"detect_vertical": true}' ) لتمريرها إلى pdfplumber.open(..., laparams=...) . |
--precision [integer] | عدد المنازل العشرية لتقريب أرقام الفاصلة العائمة. الإعدادات الافتراضية لعدم التقريب. |
import pdfplumber
with pdfplumber . open ( "path/to/file.pdf" ) as pdf :
first_page = pdf . pages [ 0 ]
print ( first_page . chars [ 0 ])
لبدء العمل باستخدام ملف PDF، اتصل بـ pdfplumber.open(x)
، حيث يمكن أن يكون x
عبارة عن:
تقوم الطريقة open
بإرجاع مثيل للفئة pdfplumber.PDF
.
لتحميل ملف PDF محمي بكلمة مرور، قم بتمرير وسيطة الكلمة الأساسية password
، على سبيل المثال، pdfplumber.open("file.pdf", password = "test")
.
لتعيين معلمات تحليل التخطيط لمحرك تخطيط pdfminer.six
، قم بتمرير وسيطة الكلمة الرئيسية laparams
، على سبيل المثال، pdfplumber.open("file.pdf", laparams = { "line_overlap": 0.7 })
.
لتسوية نص Unicode مسبقًا، قم بتمرير unicode_norm=...
حيث ...
هو أحد نماذج تسوية Unicode الأربعة: "NFC"
أو "NFD"
أو "NFKC"
أو "NFKD"
.
يتم التعامل مع قيم بيانات التعريف غير الصالحة كتحذير بشكل افتراضي. إذا لم يكن ذلك مقصودًا، فقم بتمرير strict_metadata=True
إلى الطريقة open
وسيقوم pdfplumber.open
بإصدار استثناء إذا كان غير قادر على تحليل البيانات التعريفية.
pdfplumber.PDF
تمثل فئة pdfplumber.PDF
ذات المستوى الأعلى ملف PDF واحدًا ولها خاصيتين رئيسيتين:
ملكية | وصف |
---|---|
.metadata | قاموس لأزواج مفاتيح/قيمة البيانات الوصفية، مأخوذة من مقطورات Info ملف PDF. يتضمن عادةً "CreationDate" و"ModDate" و"Producer" وما إلى ذلك. |
.pages | قائمة تحتوي على مثيل pdfplumber.Page واحد لكل صفحة تم تحميلها. |
... وله أيضًا الطريقة التالية:
طريقة | وصف |
---|---|
.close() | استدعاء هذا الأسلوب يستدعي Page.close() في كل صفحة، ويغلق أيضًا تدفق الملف (باستثناء الحالات التي يكون فيها التدفق خارجيًا، أي أنه تم فتحه بالفعل وتمريره مباشرةً إلى pdfplumber ). |
pdfplumber.Page
تقع فئة pdfplumber.Page
في قلب pdfplumber
. معظم الأشياء التي ستفعلها باستخدام pdfplumber
ستتمحور حول هذا الفصل. لديها هذه الخصائص الرئيسية:
ملكية | وصف |
---|---|
.page_number | رقم الصفحة المتسلسل، يبدأ بـ 1 للصفحة الأولى، 2 للصفحة الثانية، وهكذا. |
.width | عرض الصفحة. |
.height | ارتفاع الصفحة. |
.objects / .chars / .lines / .rects / .curves / .images | كل من هذه الخصائص عبارة عن قائمة، وتحتوي كل قائمة على قاموس واحد لكل كائن مضمن في الصفحة. لمزيد من التفاصيل، راجع "الكائنات" أدناه. |
...وهذه الطرق الرئيسية:
طريقة | وصف |
---|---|
.crop(bounding_box, relative=False, strict=True) | تقوم بإرجاع نسخة من الصفحة التي تم اقتصاصها إلى المربع المحيط، والتي يجب التعبير عنها كـ 4-tuple مع القيم (x0, top, x1, bottom) . تحتفظ الصفحات المقصوصة بالكائنات التي تقع جزئيًا على الأقل داخل المربع المحيط. إذا كان الكائن يقع جزئيًا فقط داخل الصندوق، فسيتم تقطيع أبعاده لتلائم المربع المحيط. إذا كان relative=True ، فسيتم حساب المربع المحيط باعتباره إزاحة من أعلى يسار المربع المحيط بالصفحة، بدلاً من تحديد الموضع المطلق. (راجع الإصدار رقم 245 للحصول على مثال مرئي وشرح.) عندما يكون strict=True (الافتراضي)، يجب أن يقع المربع المحيط بالاقتصاص بالكامل داخل المربع المحيط بالصفحة. |
.within_bbox(bounding_box, relative=False, strict=True) | يشبه .crop ، ولكنه يحتفظ فقط بالكائنات التي تقع بالكامل داخل المربع المحيط. |
.outside_bbox(bounding_box, relative=False, strict=True) | يشبه .crop و .within_bbox ، لكنه يحتفظ فقط بالكائنات التي تقع بالكامل خارج المربع المحيط. |
.filter(test_function) | تقوم بإرجاع نسخة من الصفحة تحتوي فقط على كائنات .objects التي يُرجع test_function(obj) لها True . |
... وله أيضًا الطريقة التالية:
طريقة | وصف |
---|---|
.close() | افتراضيًا، تقوم كائنات Page بتخزين التخطيط ومعلومات الكائن الخاصة بها لتجنب الاضطرار إلى إعادة معالجتها. ومع ذلك، عند تحليل ملفات PDF كبيرة الحجم، قد تتطلب هذه الخصائص المخزنة مؤقتًا قدرًا كبيرًا من الذاكرة. يمكنك استخدام هذه الطريقة لمسح ذاكرة التخزين المؤقت وتحرير الذاكرة. |
يتم وصف الطرق الإضافية في الأقسام أدناه:
يوفر كل مثيل لـ pdfplumber.PDF
و pdfplumber.Page
إمكانية الوصول إلى عدة أنواع من كائنات PDF، وكلها مستمدة من تحليل pdfminer.six
PDF. تُرجع الخصائص التالية قائمة Python بالكائنات المطابقة:
.chars
، يمثل كل منها حرفًا نصيًا واحدًا..lines
، يمثل كل منها خطًا واحدًا أحادي البعد..rects
يمثل كل منها مستطيلاً واحدًا ثنائي الأبعاد..curves
، يمثل كل منها سلسلة من النقاط المتصلة التي لا يتعرف عليها pdfminer.six
كخط أو مستطيل..images
، كل منها يمثل صورة..annots
، يمثل كل منها تعليقًا توضيحيًا واحدًا بتنسيق PDF (راجع القسم 8.4 من مواصفات PDF الرسمية للحصول على التفاصيل).hyperlinks
، يمثل كل منها تعليقًا توضيحيًا واحدًا بتنسيق PDF للنوع الفرعي Link
وله سمة إجراء URI
يتم تمثيل كل كائن على شكل dict
بايثون بسيط، مع الخصائص التالية:
char
ملكية | وصف |
---|---|
page_number | رقم الصفحة التي تم العثور على هذا الحرف فيها. |
text | على سبيل المثال، "z" أو "Z" أو " ". |
fontname | اسم وجه الخط الحرف. |
size | حجم الخط. |
adv | يساوي عرض النص * حجم الخط * عامل القياس. |
upright | ما إذا كانت الشخصية تستقيم. |
height | ارتفاع الشخصية. |
width | عرض الحرف. |
x0 | مسافة الجانب الأيسر من الحرف من الجانب الأيسر من الصفحة. |
x1 | مسافة الجانب الأيمن من الحرف من الجانب الأيسر من الصفحة. |
y0 | مسافة أسفل الحرف من أسفل الصفحة. |
y1 | المسافة بين أعلى الحرف وأسفل الصفحة. |
top | المسافة بين أعلى الحرف وأعلى الصفحة. |
bottom | المسافة بين أسفل الحرف وأعلى الصفحة. |
doctop | المسافة بين أعلى الحرف وأعلى المستند. |
matrix | "مصفوفة التحويل الحالية" لهذه الشخصية. (انظر أدناه للحصول على التفاصيل.) |
mcid | معرف قسم المحتوى المحدد لهذا الحرف إن وجد (وإلا None ). السمة التجريبية. |
tag | علامة قسم المحتوى المحدد لهذا الحرف إن وجدت (وإلا None ). السمة التجريبية. |
ncs | تكتك |
stroking_pattern | تكتك |
non_stroking_pattern | تكتك |
stroking_color | لون المخطط التفصيلي للشخصية (أي الحد). راجع docs/colors.md للحصول على التفاصيل. |
non_stroking_color | اللون الداخلي للشخصية. راجع docs/colors.md للحصول على التفاصيل. |
object_type | "شار" |
ملاحظة : تمثل خاصية matrix
الحرف "مصفوفة التحويل الحالية"، كما هو موضح في القسم 4.2.2 من مرجع PDF (الإصدار السادس). تتحكم المصفوفة في حجم الحرف وانحرافه وترجمته الموضعية. التدوير عبارة عن مزيج من المقياس والانحراف، ولكن في معظم الحالات يمكن اعتباره مساويًا لانحراف المحور السيني. تحدد الوحدة الفرعية pdfplumber.ctm
فئة CTM
التي تساعد في هذه الحسابات. على سبيل المثال:
from pdfplumber . ctm import CTM
my_char = pdf . pages [ 0 ]. chars [ 3 ]
my_char_ctm = CTM ( * my_char [ "matrix" ])
my_char_rotation = my_char_ctm . skew_x
line
ملكية | وصف |
---|---|
page_number | رقم الصفحة التي تم العثور على هذا السطر فيها. |
height | ارتفاع الخط. |
width | عرض الخط. |
x0 | مسافة الطرف الأيسر من الجانب الأيسر للصفحة. |
x1 | مسافة الطرف الأيمن من الجانب الأيسر للصفحة. |
y0 | مسافة الطرف السفلي من أسفل الصفحة. |
y1 | المسافة من الطرف العلوي إلى أسفل الصفحة. |
top | مسافة أعلى السطر من أعلى الصفحة. |
bottom | مسافة أسفل السطر من أعلى الصفحة. |
doctop | مسافة أعلى السطر من أعلى المستند. |
linewidth | سمك الخط. |
stroking_color | لون الخط. راجع docs/colors.md للحصول على التفاصيل. |
non_stroking_color | اللون غير المحدود المحدد لمسار الخط. راجع docs/colors.md للحصول على التفاصيل. |
mcid | معرف قسم المحتوى المحدد لهذا السطر إن وجد (وإلا None ). السمة التجريبية. |
tag | علامة قسم المحتوى المحدد لهذا السطر إن وجدت (وإلا None ). السمة التجريبية. |
object_type | "خط" |
rect
ملكية | وصف |
---|---|
page_number | رقم الصفحة التي تم العثور على هذا المستطيل فيها. |
height | ارتفاع المستطيل. |
width | عرض المستطيل. |
x0 | مسافة الجانب الأيسر من المستطيل من الجانب الأيسر للصفحة. |
x1 | مسافة الجانب الأيمن من المستطيل من الجانب الأيسر للصفحة. |
y0 | مسافة أسفل المستطيل من أسفل الصفحة. |
y1 | المسافة من أعلى المستطيل إلى أسفل الصفحة. |
top | المسافة من أعلى المستطيل إلى أعلى الصفحة. |
bottom | مسافة أسفل المستطيل من أعلى الصفحة. |
doctop | المسافة بين أعلى المستطيل وأعلى المستند. |
linewidth | سمك الخط. |
stroking_color | لون المخطط التفصيلي للمستطيل. راجع docs/colors.md للحصول على التفاصيل. |
non_stroking_color | لون تعبئة المستطيل. راجع docs/colors.md للحصول على التفاصيل. |
mcid | معرف قسم المحتوى المحدد لهذا المستقيم إن وجد (وإلا None ). السمة التجريبية. |
tag | علامة قسم المحتوى المحدد لهذا المستقيم إن وجدت (وإلا None ). السمة التجريبية. |
object_type | "المستقيم" |
curve
ملكية | وصف |
---|---|
page_number | رقم الصفحة التي تم العثور على هذا المنحنى عليها. |
pts | قائمة من الصفوف (x, top) تشير إلى النقاط الموجودة على المنحنى . |
path | قائمة من الصفوف (cmd, *(x, top)) تصف وصف المسار الكامل ، بما في ذلك (على سبيل المثال) نقاط التحكم المستخدمة في منحنيات Bezier. |
height | ارتفاع المربع المحيط بالمنحنى. |
width | عرض المربع المحيط بالمنحنى. |
x0 | مسافة أقصى نقطة في المنحنى من الجانب الأيسر للصفحة. |
x1 | مسافة أقصى نقطة في المنحنى من الجانب الأيسر من الصفحة. |
y0 | مسافة أدنى نقطة في المنحنى من أسفل الصفحة. |
y1 | مسافة أعلى نقطة في المنحنى من أسفل الصفحة. |
top | مسافة أعلى نقطة في المنحنى من أعلى الصفحة. |
bottom | مسافة أدنى نقطة في المنحنى من أعلى الصفحة. |
doctop | مسافة أعلى نقطة في المنحنى من أعلى المستند. |
linewidth | سمك الخط. |
fill | ما إذا كان الشكل المحدد بواسطة مسار المنحنى ممتلئًا أم لا. |
stroking_color | لون الخطوط العريضة للمنحنى. راجع docs/colors.md للحصول على التفاصيل. |
non_stroking_color | لون تعبئة المنحنى. راجع docs/colors.md للحصول على التفاصيل. |
dash | صف ([dash_array], dash_phase) يصف نمط شرطة المنحنى. انظر الجدول 4.6 من مواصفات PDF للحصول على التفاصيل. |
mcid | معرف قسم المحتوى المحدد لهذا المنحنى إن وجد (وإلا None ). السمة التجريبية. |
tag | علامة قسم المحتوى المحدد لهذا المنحنى إن وجدت (وإلا None ). السمة التجريبية. |
object_type | "منحنى" |
بالإضافة إلى ذلك، يوفر كل من pdfplumber.PDF
و pdfplumber.Page
إمكانية الوصول إلى عدة قوائم مشتقة من الكائنات: .rect_edges
(التي تحلل كل مستطيل إلى خطوطه الأربعة)، .curve_edges
(الذي يفعل الشيء نفسه بالنسبة للكائنات curve
)، و .edges
(الذي يجمع بين .rect_edges
و .curve_edges
و .lines
).
image
ملحوظة: على الرغم من توفر تحديد موضع كائنات image
وخصائصها عبر pdfplumber
، إلا أن هذه المكتبة لا توفر دعمًا مباشرًا لإعادة بناء محتوى الصورة. لذلك، يرجى الاطلاع على هذا الاقتراح.
ملكية | وصف |
---|---|
page_number | رقم الصفحة التي تم العثور على الصورة فيها. |
height | ارتفاع الصورة. |
width | عرض الصورة. |
x0 | مسافة الجانب الأيسر من الصورة من الجانب الأيسر من الصفحة. |
x1 | مسافة الجانب الأيمن من الصورة من الجانب الأيسر من الصفحة. |
y0 | المسافة من أسفل الصورة إلى أسفل الصفحة. |
y1 | المسافة من أعلى الصورة إلى أسفل الصفحة. |
top | المسافة بين أعلى الصورة وأعلى الصفحة. |
bottom | مسافة أسفل الصورة من أعلى الصفحة. |
doctop | المسافة بين أعلى المستطيل وأعلى المستند. |
srcsize | أبعاد الصورة الأصلية، مثل صف (width, height) . |
colorspace | مجال اللون للصورة (على سبيل المثال، RGB). |
bits | عدد البتات لكل مكون لون؛ على سبيل المثال، 8 يتوافق مع 255 قيمة محتملة لكل مكون لون (R وG وB في مساحة ألوان RGB). |
stream | قيم البكسل للصورة، ككائن pdfminer.pdftypes.PDFStream . |
imagemask | قيمة منطقية لاغية؛ إذا كان True ، "يحدد أن بيانات الصورة سيتم استخدامها كقناع استنسل للطلاء باللون الحالي." |
mcid | معرف قسم المحتوى المحدد لهذه الصورة إن وجد (وإلا None ). السمة التجريبية. |
tag | علامة قسم المحتوى المميز لهذه الصورة إن وجدت (وإلا None ). السمة التجريبية. |
object_type | "صورة" |
pdfminer.six
إذا قمت بتمرير معلمة pdfminer.six
-handling laparams
إلى pdfplumber.open(...)
، فسيحتوي قاموس .objects
لكل صفحة أيضًا على كائنات التخطيط ذات المستوى الأعلى لـ pdfminer.six
، مثل "textboxhorizontal"
.
يمكن أن تكون أدوات تصحيح الأخطاء المرئية الخاصة بـ pdfplumber
مفيدة في فهم بنية ملف PDF والكائنات التي تم استخراجها منه.
PageImage
باستخدام .to_image()
لتحويل أي صفحة (بما في ذلك الصفحات المقصوصة) إلى كائن PageImage
، اتصل بـ my_page.to_image()
. يمكنك اختياريًا تمرير إحدى وسيطات الكلمات الرئيسية التالية:
resolution
: العدد المطلوب من البكسل في البوصة. الافتراضي: 72
. النوع: int
.width
: عرض الصورة المطلوب بالبكسل. الافتراضي: غير محدد، يتم تحديده بواسطة resolution
. النوع: int
.height
: عرض الصورة المطلوب بالبكسل. الافتراضي: غير محدد، يتم تحديده بواسطة resolution
. النوع: int
.antialias
: ما إذا كان سيتم استخدام الحواف عند إنشاء الصورة. يؤدي الإعداد إلى True
إلى إنشاء صور تحتوي على نصوص ورسومات أقل خشونة، ولكن بأحجام ملفات أكبر. الافتراضي: False
. النوع : bool
.force_mediabox
: استخدم أبعاد .mediabox
للصفحة، بدلاً من أبعاد .cropbox
. الافتراضي: False
. النوع : bool
.على سبيل المثال:
im = my_pdf . pages [ 0 ]. to_image ( resolution = 150 )
من خلال برنامج نصي أو REPL، سيفتح im.show()
الصورة في عارض الصور المحلي لديك. لكن كائنات PageImage
تعمل أيضًا بشكل جيد مع دفاتر Jupyter؛ يتم عرضها تلقائيًا كمخرجات خلية. على سبيل المثال:
ملاحظة : يعمل .to_image(...)
كما هو متوقع مع مثيلات Page.crop(...)
/ CroppedPage
، لكنه غير قادر على دمج التغييرات التي تم إجراؤها عبر مثيلات Page.filter(...)
/ FilteredPage
.
PageImage
الأساسيةطريقة | وصف |
---|---|
im.reset() | يمسح أي شيء قمت برسمه حتى الآن. |
im.copy() | نسخ الصورة إلى كائن PageImage جديد. |
im.show() | يفتح الصورة في عارض الصور المحلي لديك. |
im.save(path_or_fileobject, format="PNG", quantize=True, colors=256, bits=8) | يحفظ الصورة المشروحة كملف PNG. تعمل الوسيطات الافتراضية على تكميم الصورة إلى لوحة مكونة من 256 لونًا، مع حفظ PNG بعمق ألوان 8 بت. يمكنك تعطيل التكميم عن طريق تمرير quantize=False أو ضبط حجم لوحة الألوان عن طريق تمرير colors=N . |
يمكنك تمرير إحداثيات صريحة أو أي كائن pdfplumber
PDF (على سبيل المثال، char، line، rect) إلى هذه الطرق.
طريقة كائن واحد | طريقة السائبة | وصف |
---|---|---|
im.draw_line(line, stroke={color}, stroke_width=1) | im.draw_lines(list_of_lines, **kwargs) | يرسم خطًا من line أو curve أو صفين من صفين (على سبيل المثال، ((x, y), (x, y)) ). |
im.draw_vline(location, stroke={color}, stroke_width=1) | im.draw_vlines(list_of_locations, **kwargs) | يرسم خطًا رأسيًا عند إحداثي x المشار إليه حسب location . |
im.draw_hline(location, stroke={color}, stroke_width=1) | im.draw_hlines(list_of_locations, **kwargs) | يرسم خطًا أفقيًا عند إحداثي y المشار إليه حسب location . |
im.draw_rect(bbox_or_obj, fill={color}, stroke={color}, stroke_width=1) | im.draw_rects(list_of_rects, **kwargs) | يرسم مستطيلاً من مربع rect ، char ، أو ما إلى ذلك، أو من 4 صفوف. |
im.draw_circle(center_or_obj, radius=5, fill={color}, stroke={color}) | im.draw_circles(list_of_circles, **kwargs) | يرسم دائرة عند الإحداثيات (x, y) أو في مركز char أو rect وما إلى ذلك. |
ملحوظة: الطرق المذكورة أعلاه مبنية على أساليب ImageDraw
الخاصة بـ Pillow، ولكن تم تعديل المعلمات لتحقيق الاتساق مع تسمية SVG fill
/ stroke
/ stroke_width
.
سيُرجع im.debug_tablefinder(table_settings={})
نسخة من PageImage مع الخطوط المكتشفة (باللون الأحمر)، والتقاطعات (الدوائر)، والجداول (باللون الأزرق الفاتح) المتراكبة.
يستطيع pdfplumber
استخراج النص من أي صفحة معينة (بما في ذلك الصفحات المقصوصة والمشتقة). ويمكنه أيضًا محاولة الحفاظ على تخطيط هذا النص، بالإضافة إلى تحديد إحداثيات الكلمات واستعلامات البحث. يمكن لكائنات Page
استدعاء طرق استخراج النص التالية:
طريقة | وصف |
---|---|
.extract_text(x_tolerance=3, x_tolerance_ratio=None, y_tolerance=3, layout=False, x_density=7.25, y_density=13, line_dir_render=None, char_dir_render=None, **kwargs) | يجمع كل كائنات أحرف الصفحة في سلسلة واحدة.
|
.extract_text_simple(x_tolerance=3, y_tolerance=3) | إصدار أسرع قليلاً ولكن أقل مرونة من .extract_text(...) باستخدام منطق أبسط. |
.extract_words(x_tolerance=3, x_tolerance_ratio=None, y_tolerance=3, keep_blank_chars=False, use_text_flow=False, line_dir="ttb", char_dir="ltr", line_dir_rotated="ttb", char_dir_rotated="ltr", extra_attrs=[], split_at_punctuation=False, expand_ligatures=True, return_chars=False) | إرجاع قائمة بجميع الأشياء التي تبدو وكأنها كلمات والمربعات المحيطة بها. تعتبر الكلمات عبارة عن تسلسلات من الأحرف حيث (بالنسبة للأحرف "المستقيمة") يكون الفرق بين x1 لحرف واحد و x0 للحرف التالي أقل من أو يساوي x_tolerance وحيث يكون doctop لحرف واحد و doctop للحرف التالي أقل من أو يساوي y_tolerance . (إذا كانت x_tolerance_ratio ليست None ، فإن المستخرج يستخدم x_tolerance ديناميكي يساوي x_tolerance_ratio * previous_character["size"] .) يتم اتباع نهج مماثل للأحرف غير المستقيمة، ولكن بدلاً من ذلك يتم قياس المسافات الرأسية، وليس الأفقية، بينها. تغيير keep_blank_chars إلى True سيعني أن الأحرف الفارغة يتم التعامل معها كجزء من الكلمة، وليس كمسافة بين الكلمات. سيؤدي تغيير use_text_flow إلى True إلى استخدام تدفق الأحرف الأساسي في ملف PDF كدليل لترتيب الكلمات وتقسيمها، بدلاً من فرز الأحرف مسبقًا حسب موضع x/y. (يحاكي هذا كيفية تمييز النص في ملف PDF عن طريق سحب المؤشر؛ كما هو الحال مع ذلك، لا يبدو الترتيب منطقيًا دائمًا.) تخبر الوسيطات line_dir و char_dir هذه الطريقة بالاتجاه الذي من المتوقع أن تتم قراءة الأسطر/الأحرف فيه؛ الخيارات الصالحة هي "ttb" (من الأعلى إلى الأسفل)، و"btt" (من الأسفل إلى الأعلى)، و"ltr" (من اليسار إلى اليمين)، و"rtl" (من اليمين إلى اليسار). تتشابه الوسيطتان line_dir_rotated و char_dir_rotated ، لكن بالنسبة للنص الذي تم تدويره. سيؤدي تمرير قائمة extra_attrs (على سبيل المثال، ["fontname", "size"] إلى تقييد كل كلمة على أحرف تشترك تمامًا في نفس القيمة لكل من تلك السمات، وستشير إملاءات الكلمات الناتجة إلى تلك السمات. سيؤدي تعيين split_at_punctuation إلى True إلى فرض رموز الفصل عند علامات الترقيم المحددة بواسطة string.punctuation أو يمكنك تحديد قائمة علامات الترقيم المنفصلة عن طريق تمرير سلسلة، على سبيل المثال، split_at_punctuation='!"&'()*+,.:;<=>?@[]^`{|}~' . ما لم تقم بتعيين expand_ligatures=False ، فإن الحروف المركبة مثل fi سيتم توسيعها إلى الحروف المكونة لها (على سبيل المثال , fi ). سيؤدي تمرير return_chars=True إلى إضافة قائمة بالأحرف المكونة لها إلى كل قاموس كلمة، كقائمة في حقل "chars" . |
.extract_text_lines(layout=False, strip=True, return_chars=True, **kwargs) | ميزة تجريبية تقوم بإرجاع قائمة القواميس التي تمثل أسطر النص في الصفحة. تعمل المعلمة strip بشكل مشابه لطريقة str.strip() في Python، وتقوم بإرجاع سمات text دون المسافة البيضاء المحيطة بها. (لا ينطبق إلا عندما يكون layout = True .) سيؤدي تعيين return_chars إلى False إلى استبعاد كائنات الأحرف الفردية من إملاءات أسطر النص التي تم إرجاعها. أما **kwargs المتبقية فهي تلك التي يمكنك تمريرها إلى .extract_text(layout=True, ...) . |
.search(pattern, regex=True, case=True, main_group=0, return_groups=True, return_chars=True, layout=False, **kwargs) | ميزة تجريبية تسمح لك بالبحث في نص الصفحة، وإرجاع قائمة بجميع المثيلات التي تطابق الاستعلام. بالنسبة لكل مثيل، يحتوي كائن قاموس الاستجابة على النص المطابق، وأي تطابقات لمجموعة regex، وإحداثيات المربع المحيط، وكائنات char نفسها. يمكن أن يكون pattern تعبيرًا عاديًا مترجمًا، أو تعبيرًا عاديًا غير مترجم، أو سلسلة غير regex. إذا كان regex False ، فسيتم التعامل مع النمط على أنه سلسلة غير عادية. إذا كانت case False ، فسيتم إجراء البحث بطريقة غير حساسة لحالة الأحرف. يؤدي إعداد main_group إلى تقييد النتائج على مجموعة regex محددة ضمن pattern (الافتراضي 0 يعني المطابقة بأكملها). سيؤدي تعيين return_groups و/أو return_chars إلى False إلى استبعاد قوائم مجموعات regex المتطابقة و/أو الأحرف من إضافتها (مثل "groups" و "chars" إلى إملاءات الإرجاع). تعمل معلمة layout كما تعمل مع .extract_text(...) . أما **kwargs المتبقية فهي تلك التي يمكنك تمريرها إلى .extract_text(layout=True, ...) . ملاحظة : يتم تجاهل تطابقات العرض الصفري والمسافات البيضاء بالكامل، لأنها (بشكل عام) ليس لها موضع واضح في الصفحة. |
.dedupe_chars(tolerance=1, extra_attrs=("fontname", "size")) | إرجاع نسخة من الصفحة تحتوي على أحرف مكررة - تلك التي تتشارك نفس النص، والموضع (ضمن tolerance x/y)، و extra_attrs كأحرف أخرى - تمت إزالتها. (راجع العدد رقم 71 لفهم الدافع.) |
أسلوب pdfplumber
في الكشف عن الجدول يستعير بشكل كبير من أطروحة الماجستير الخاصة بـ Anssi Nurminen، وهو مستوحى من Tabula. يعمل مثل هذا:
يمكن لكائنات pdfplumber.Page
استدعاء أساليب الجدول التالية:
طريقة | وصف |
---|---|
.find_tables(table_settings={}) | إرجاع قائمة بكائنات Table . يوفر كائن Table إمكانية الوصول إلى خصائص .cells و .rows و .columns و .bbox ، بالإضافة إلى الأسلوب .extract(x_tolerance=3, y_tolerance=3) . |
.find_table(table_settings={}) | يشبه .find_tables(...) ، ولكنه يُرجع أكبر جدول في الصفحة، ككائن Table . إذا كانت هناك جداول متعددة بنفس الحجم - كما تم قياسه بعدد الخلايا - تقوم هذه الطريقة بإرجاع الجدول الأقرب إلى أعلى الصفحة. |
.extract_tables(table_settings={}) | إرجاع النص المستخرج من جميع الجداول الموجودة في الصفحة، ممثلة كقائمة من قوائم القوائم، مع هيكل table -> row -> cell . |
.extract_table(table_settings={}) | إرجاع النص المستخرج من أكبر جدول في الصفحة (انظر .find_table(...) أعلاه)، ممثلاً كقائمة من القوائم، مع row -> cell . |
.debug_tablefinder(table_settings={}) | تقوم بإرجاع مثيل لفئة TableFinder ، مع إمكانية الوصول إلى خصائص .edges و .intersections و .cells و .tables . |
على سبيل المثال:
pdf = pdfplumber . open ( "path/to/my.pdf" )
page = pdf . pages [ 0 ]
page . extract_table ()
انقر هنا للحصول على مثال أكثر تفصيلا.
افتراضيًا، يستخدم extract_tables
الخطوط الرأسية والأفقية للصفحة (أو الحواف المستطيلة) كفواصل للخلايا. لكن الطريقة قابلة للتخصيص بشكل كبير عبر الوسيطة table_settings
. الإعدادات الممكنة والإعدادات الافتراضية الخاصة بها:
{
"vertical_strategy" : "lines" ,
"horizontal_strategy" : "lines" ,
"explicit_vertical_lines" : [],
"explicit_horizontal_lines" : [],
"snap_tolerance" : 3 ,
"snap_x_tolerance" : 3 ,
"snap_y_tolerance" : 3 ,
"join_tolerance" : 3 ,
"join_x_tolerance" : 3 ,
"join_y_tolerance" : 3 ,
"edge_min_length" : 3 ,
"min_words_vertical" : 3 ,
"min_words_horizontal" : 1 ,
"intersection_tolerance" : 3 ,
"intersection_x_tolerance" : 3 ,
"intersection_y_tolerance" : 3 ,
"text_tolerance" : 3 ,
"text_x_tolerance" : 3 ,
"text_y_tolerance" : 3 ,
"text_*" : …, # See below
}
جلسة | وصف |
---|---|
"vertical_strategy" | إما "lines" أو "lines_strict" أو "text" أو "explicit" . انظر الشرح أدناه. |
"horizontal_strategy" | إما "lines" أو "lines_strict" أو "text" أو "explicit" . انظر الشرح أدناه. |
"explicit_vertical_lines" | قائمة بالخطوط الرأسية التي تحدد الخلايا بشكل واضح في الجدول. يمكن استخدامها مع أي من الاستراتيجيات المذكورة أعلاه. يجب أن تكون العناصر الموجودة في القائمة إما أرقامًا — تشير إلى الإحداثي x لخط الارتفاع الكامل للصفحة — أو كائنات line / rect / curve . |
"explicit_horizontal_lines" | قائمة بالخطوط الأفقية التي تحدد الخلايا في الجدول بشكل واضح. يمكن استخدامها مع أي من الاستراتيجيات المذكورة أعلاه. يجب أن تكون العناصر الموجودة في القائمة إما أرقامًا - تشير إلى إحداثي y لخط الارتفاع الكامل للصفحة - أو كائنات line / rect / curve . |
"snap_tolerance" ، "snap_x_tolerance" ، "snap_y_tolerance" | سيتم "انطباق" الخطوط المتوازية داخل نقاط snap_tolerance على نفس الموضع الأفقي أو الرأسي. |
"join_tolerance" , "join_x_tolerance" , "join_y_tolerance" | سيتم "ضم" الأجزاء الخطية الموجودة على نفس الخط اللانهائي، والتي تكون نهاياتها ضمن join_tolerance مع بعضها البعض، في قطعة خطية واحدة. |
"edge_min_length" | سيتم تجاهل الحواف الأقصر من edge_min_length قبل محاولة إعادة بناء الجدول. |
"min_words_vertical" | عند استخدام "vertical_strategy": "text" ، يجب أن تتشارك الكلمات min_words_vertical على الأقل في نفس المحاذاة. |
"min_words_horizontal" | عند استخدام "horizontal_strategy": "text" ، يجب أن تتشارك الكلمات min_words_horizontal على الأقل في نفس المحاذاة. |
"intersection_tolerance" ، "intersection_x_tolerance" ، "intersection_y_tolerance" | عند دمج الحواف في الخلايا، يجب أن تكون الحواف المتعامدة ضمن نقاط intersection_tolerance حتى تعتبر متقاطعة. |
"text_*" | يتم بعد ذلك استخدام جميع الإعدادات المسبوقة بـ text_ عند استخراج النص من كل جدول تم اكتشافه. كافة الوسائط الممكنة لـ Page.extract_text(...) صالحة هنا أيضًا. |
"text_x_tolerance" ، "text_y_tolerance" | تنطبق هذه الإعدادات ذات البادئة text_ أيضًا على خوارزمية تعريف الجدول عند استخدام إستراتيجية text . على سبيل المثال، عندما تبحث هذه الخوارزمية عن كلمات، فإنها تتوقع ألا تزيد المسافة بين الحروف الفردية في كل كلمة عن text_x_tolerance / text_y_tolerance . |
يقبل كل من vertical_strategy
و horizontal_strategy
الخيارات التالية:
الإستراتيجية | وصف |
---|---|
"lines" | استخدم الخطوط الرسومية للصفحة - بما في ذلك جوانب الكائنات المستطيلة - كحدود لخلايا الجدول المحتملة. |
"lines_strict" | استخدم الخطوط الرسومية للصفحة - ولكن ليس جوانب الكائنات المستطيلة - كحدود لخلايا الجدول المحتملة. |
"text" | بالنسبة vertical_strategy : استنتج الخطوط (الخيالية) التي تربط الكلمات اليسرى أو اليمنى أو المركزية على الصفحة، واستخدم تلك الخطوط كحدود لخلايا الجدول المحتملة. بالنسبة إلى horizontal_strategy ، نفس الشيء ولكن باستخدام أعلى الكلمات. |
"explicit" | استخدم فقط الخطوط المحددة بشكل صريح في explicit_vertical_lines / explicit_horizontal_lines . |
غالبًا ما يكون من المفيد قص الصفحة — Page.crop(bounding_box)
— قبل محاولة استخراج الجدول.
تمت إعادة تصميم استخراج الجدول لـ pdfplumber
بشكل جذري للإصدار v0.5.0
، وتم تقديم تغييرات جذرية.
في بعض الأحيان، يمكن أن تحتوي ملفات PDF على نماذج تتضمن مدخلات يمكن للأشخاص تعبئتها وحفظها. بينما تظهر القيم في حقول النموذج مثل النصوص الأخرى في ملف PDF، إلا أنه يتم التعامل مع بيانات النموذج بشكل مختلف. إذا كنت تريد التفاصيل الدموية، راجع الصفحة 671 من هذه المواصفات.
لا يحتوي pdfplumber
على واجهة للتعامل مع بيانات النموذج، ولكن يمكنك الوصول إليها باستخدام أغلفة pdfplumber
الموجودة حول pdfminer
.
على سبيل المثال، سيقوم هذا المقتطف باسترداد أسماء حقول النموذج وقيمها وتخزينها في القاموس.
import pdfplumber
from pdfplumber . utils . pdfinternals import resolve_and_decode , resolve
pdf = pdfplumber . open ( "document_with_form.pdf" )
def parse_field_helper ( form_data , field , prefix = None ):
""" appends any PDF AcroForm field/value pairs in `field` to provided `form_data` list
if `field` has child fields, those will be parsed recursively.
"""
resolved_field = field . resolve ()
field_name = '.' . join ( filter ( lambda x : x , [ prefix , resolve_and_decode ( resolved_field . get ( "T" ))]))
if "Kids" in resolved_field :
for kid_field in resolved_field [ "Kids" ]:
parse_field_helper ( form_data , kid_field , prefix = field_name )
if "T" in resolved_field or "TU" in resolved_field :
# "T" is a field-name, but it's sometimes absent.
# "TU" is the "alternate field name" and is often more human-readable
# your PDF may have one, the other, or both.
alternate_field_name = resolve_and_decode ( resolved_field . get ( "TU" )) if resolved_field . get ( "TU" ) else None
field_value = resolve_and_decode ( resolved_field [ "V" ]) if 'V' in resolved_field else None
form_data . append ([ field_name , alternate_field_name , field_value ])
form_data = []
fields = resolve ( resolve ( pdf . doc . catalog [ "AcroForm" ])[ "Fields" ])
for field in fields :
parse_field_helper ( form_data , field )
بمجرد تشغيل هذا البرنامج النصي، تكون form_data
عبارة عن قائمة تحتوي على صف مكون من ثلاثة عناصر لكل عنصر من عناصر النموذج. على سبيل المثال، قد يبدو نموذج PDF الذي يحتوي على حقل المدينة والولاية بهذا الشكل.
[
['STATE.0', 'enter STATE', 'CA'],
['section 2 accident infoRmation.1.0',
'enter city of accident',
'SAN FRANCISCO']
]
شكرًا لـjeremybmerrill للمساعدة في الحفاظ على رمز تحليل النموذج أعلاه.
extract_table
في تقرير إشعار تعديل العمال وإعادة تدريبهم (WARN) في كاليفورنيا. يوضح التصحيح البصري الأساسي واستخراج الجدول.extract_table
في ملفات PDF الخاصة بنظام فحص الخلفية الجنائية الوطني الفوري التابع لمكتب التحقيقات الفيدرالي. يوضح كيفية استخدام التصحيح المرئي للعثور على إعدادات استخراج الجدول الأمثل. يوضح أيضًا Page.crop(...)
و Page.extract_text(...).
curve
.Page.extract_text(...)
. تساعد العديد من مكتبات Python الأخرى المستخدمين على استخراج المعلومات من ملفات PDF. كنظرة عامة واسعة، يميز pdfplumber
نفسه عن مكتبات معالجة PDF الأخرى من خلال الجمع بين هذه الميزات:
من المفيد أيضًا معرفة الميزات التي لا يوفرها pdfplumber
:
يوفر pdfminer.six
الأساس لـ pdfplumber
. وهو يركز بشكل أساسي على تحليل ملفات PDF، وتحليل تخطيطات PDF وتحديد موضع الكائنات، واستخراج النص. ولا يوفر أدوات لاستخراج الجدول أو التصحيح المرئي.
PyPDF2
هي مكتبة بايثون خالصة "قادرة على تقسيم صفحات ملفات PDF ودمجها واقتصاصها وتحويلها. ويمكنها أيضًا إضافة بيانات مخصصة وخيارات عرض وكلمات مرور إلى ملفات PDF." يمكنه استخراج نص الصفحة، لكنه لا يوفر وصولاً سهلاً إلى كائنات الأشكال (المستطيلات والخطوط وما إلى ذلك)، أو استخراج الجدول، أو أدوات تصحيح الأخطاء بصريًا.
يعد pymupdf
أسرع بكثير من pdfminer.six
(وبالتالي pdfplumber
) ويمكنه إنشاء ملفات PDF وتعديلها، لكن المكتبة تتطلب تثبيت برنامج غير Python (MuPDF). كما أنه لا يتيح الوصول السهل إلى كائنات الأشكال (المستطيلات والخطوط وما إلى ذلك)، ولا يوفر أدوات استخراج الجدول أو تصحيح الأخطاء المرئية.
تركز كل من camelot
و tabula-py
و pdftables
بشكل أساسي على استخراج الجداول. في بعض الحالات، قد تكون أكثر ملاءمة للجداول المحددة التي تحاول استخراجها.
شكرًا جزيلاً للمستخدمين التاليين الذين ساهموا بالأفكار والميزات والإصلاحات:
نرحب بطلبات السحب، ولكن يرجى تقديم مشكلة الاقتراح أولاً، حيث أن المكتبة قيد التطوير النشط.
المشرفون الحاليون: