# تحميل بيانات pdf

> [!WARNING]
> دعم ملفات Pdf تجريبي وقد يخضع للتغيير.

تحتوي مجموعات بيانات Pdf على أعمدة من نوع [Pdf](/docs/datasets/main/ar/package_reference/main_classes#datasets.Pdf)، والتي تتضمن كائنات `pdfplumber`.

> [!TIP]
> للتعامل مع مجموعات بيانات pdf، يجب أن يكون حزمة `pdfplumber` مثبّتة. اطّلع على دليل [التثبيت](https://github.com/jsvine/pdfplumber#installation) لمعرفة كيفية تثبيتها.

عند تحميل مجموعة بيانات pdf واستدعاء عمود pdf، يتم فك ترميز ملفات pdf كـ `pdfplumber` Pdfs:

```py
>>> from datasets import load_dataset, Pdf

>>> dataset = load_dataset("path/to/pdf/folder", split="train")
>>> dataset[0]["pdf"]
<pdfplumber.pdf.PDF at 0x1075bc320>
```

> [!WARNING]
> استخدم فهرس الصف أولاً ثم عمود `pdf` للوصول إلى مجموعة بيانات pdf - `dataset[0]["pdf"]` - لتجنب إنشاء جميع كائنات pdf في مجموعة البيانات. وإلا، فقد يكون هذا الأمر بطيئاً ومستهلكاً للوقت إذا كانت لديك مجموعة بيانات كبيرة.

للاطلاع على دليل حول كيفية تحميل أي نوع من مجموعات البيانات، راجع دليل التحميل العام.

## قراءة الصفحات

يمكنك الوصول إلى الصفحات مباشرةً من ملف pdf باستخدام خاصية `.pages`.

ثم يمكنك استخدام دوال `pdfplumber` لقراءة النصوص والجداول والصور، على سبيل المثال:

```python
>>> pdf = dataset[0]["pdf"]
>>> first_page = pdf.pages[0]
>>> first_page
<Page:1>
>>> first_page.extract_text()
Docling Technical Report
Version1.0
ChristophAuer MaksymLysak AhmedNassar MicheleDolfi NikolaosLivathinos
PanosVagenas CesarBerrospiRamis MatteoOmenetti FabianLindlbauer
KasperDinkla LokeshMishra YusikKim ShubhamGupta RafaelTeixeiradeLima
ValeryWeber LucasMorin IngmarMeijer ViktorKuropiatnyk PeterW.J.Staar
AI4KGroup,IBMResearch
Ru¨schlikon,Switzerland
Abstract
This technical report introduces Docling, an easy to use, self-contained, MIT-
licensed open-source package for PDF document conversion.
...
>>> first_page.images
In [24]: first_page.images
Out[24]: 
[{'x0': 256.5,
  'y0': 621.0,
  'x1': 355.49519999999995,
  'y1': 719.9952,
  'width': 98.99519999999995,
  'height': 98.99519999999995,
  'name': 'Im1',
  'stream': <PDFStream(44): raw=88980, {'Type': /'XObject', 'Subtype': /'Image', 'BitsPerComponent': 8, 'ColorSpace': /'DeviceRGB', 'Filter': /'DCTDecode', 'Height': 1024, 'Length': 88980, 'Width': 1024}>,
  'srcsize': (1024, 1024),
  'imagemask': None,
  'bits': 8,
  'colorspace': [/'DeviceRGB'],
  'mcid': None,
  'tag': None,
  'object_type': 'image',
  'page_number': 1,
  'top': 72.00480000000005,
  'bottom': 171.0,
  'doctop': 72.00480000000005}]
>>> first_page.extract_tables()
[]
```

يمكنك أيضًا تحميل كل صفحة كـ`PIL.Image`:

```python
>>> import PIL.Image
>>> import io
>>> first_page.to_image()
<pdfplumber.display.PageImage at 0x107d68dd0>
>>> buffer = io.BytesIO()
>>> first_page.to_image().save(buffer)
>>> img = PIL.Image.open(buffer)
>>> img
<PIL.PngImagePlugin.PngImageFile image mode=P size=612x792>
```

لاحظ أنه يمكنك تمرير `resolution=` إلى `.to_image()` لعرض الصورة بدقة أعلى من القيمة الافتراضية (72 ppi).

## الملفات المحلية

يمكنك تحميل مجموعة بيانات من مسار ملف pdf. استخدم دالة [cast_column()](/docs/datasets/main/ar/package_reference/main_classes#datasets.Dataset.cast_column) لقبول عمود يحتوي على مسارات ملفات pdf، وفكّ تشفيره إلى pdf باستخدام `pdfplumber` مع ميزة [Pdf](/docs/datasets/main/ar/package_reference/main_classes#datasets.Pdf):
```py
>>> from datasets import Dataset, Pdf

>>> dataset = Dataset.from_dict({"pdf": ["path/to/pdf_1", "path/to/pdf_2", ..., "path/to/pdf_n"]}).cast_column("pdf", Pdf())
>>> dataset[0]["pdf"]
<pdfplumber.pdf.PDF at 0x1657d0280>
```

إذا كنت ترغب فقط في تحميل المسار الأساسي لبيانات pdf دون فك ترميز كائن pdf، فاضبط `decode=False` في ميزة [Pdf](/docs/datasets/main/ar/package_reference/main_classes#datasets.Pdf):

```py
>>> dataset = dataset.cast_column("pdf", Pdf(decode=False))
>>> dataset[0]["pdf"]
{'bytes': None,
 'path': 'path/to/pdf/folder/pdf0.pdf'}
```

## PdfFolder

يمكنك أيضًا تحميل مجموعة بيانات باستخدام منشئ مجموعات البيانات `PdfFolder` الذي لا يتطلب كتابة مُحمِّل بيانات مخصص. وهذا يجعل `PdfFolder` مثاليًا لإنشاء وتحميل مجموعات بيانات pdf بسرعة تحتوي على آلاف ملفات pdf لمهام الرؤية المختلفة. يجب أن يبدو هيكل مجموعة بيانات pdf الخاصة بك على النحو التالي:

```
folder/train/resume/0001.pdf
folder/train/resume/0002.pdf
folder/train/resume/0003.pdf

folder/train/invoice/0001.pdf
folder/train/invoice/0002.pdf
folder/train/invoice/0003.pdf
```

إذا اتبع مجموعة البيانات بنية `PdfFolder`، فيمكنك تحميلها مباشرةً باستخدام [load_dataset()](/docs/datasets/main/ar/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")
```

بالنسبة إلى مجموعات البيانات المحلية، يعادل هذا تمرير `pdffolder` يدويًا في [load_dataset()](/docs/datasets/main/ar/package_reference/loading_methods#datasets.load_dataset) والمجلد في `data_dir`:

```py
>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder")
```

ثم يمكنك الوصول إلى ملفات PDF ككائنات `pdfplumber.pdf.PDF`:

```
>>> dataset["train"][0]
{"pdf": <pdfplumber.pdf.PDF at 0x161715e50>, "label": 0}

>>> dataset["train"][-1]
{"pdf": <pdfplumber.pdf.PDF at 0x16170bd90>, "label": 1}
```

لتجاهل المعلومات في ملف البيانات الوصفية، اضبط `drop_metadata=True` في [load_dataset()](/docs/datasets/main/ar/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)
```

إذا لم يكن لديك ملف بيانات وصفية، يستنتج `PdfFolder` تلقائيًا اسم التسمية من اسم المجلد. إذا كنت ترغب في إسقاط التسميات المُنشأة تلقائيًا، اضبط `drop_labels=True`. في هذه الحالة، لن يحتوي مجموعة البيانات الخاصة بك إلا على عمود pdf:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)
```

وأخيرًا، يتيح لك الحجة `filters` تحميل مجموعة فرعية فقط من مجموعة البيانات، بناءً على شرط يتعلق بالتسمية أو البيانات الوصفية. وهذا مفيد بشكل خاص إذا كانت البيانات الوصفية بصيغة Parquet، لأن هذه الصيغة تتيح التصفية السريعة. كما يُنصح باستخدام هذه الحجة مع `streaming=True`، لأن مجموعة البيانات تُحمَّل بالكامل قبل التصفية افتراضيًا.

```python
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)
```

> [!TIP]
> لمزيد من المعلومات حول إنشاء مجموعة بيانات `PdfFolder` خاصة بك، راجع دليل [إنشاء مجموعة بيانات pdf](./document_dataset).

## فك ترميز ملفات PDF

بشكل افتراضي، يتم فك ترميز ملفات pdf بشكل تسلسلي كـ `PDFs` من pdfplumber عند تكرار مجموعة بيانات. يقوم بفك ترميز البيانات الوصفية لملفات pdf بشكل تسلسلي، ولا يقرأ صفحات pdf حتى تقوم بالوصول إليها.

ومع ذلك، من الممكن تسريع مجموعة البيانات بشكل كبير باستخدام فك الترميز متعدد الخيوط:

```python
>>> import os
>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4)
>>> dataset = dataset.decode(num_threads=num_threads)
>>> for example in dataset:  # up to 20 times faster !
...     ...
```

يمكنك تفعيل تعدد الخيوط باستخدام `num_threads`. وهذا مفيد بشكل خاص لتسريع بث البيانات عن بُعد. ومع ذلك، قد يكون أبطأ من `num_threads=0` للبيانات المحلية على الأقراص سريعة.

إذا لم تكن مهتمًا بالوثائق المُفكَّكة بصيغة `PDFs` باستخدام pdfplumber، وأردت الوصول إلى المسار/البايتات بدلاً من ذلك، يمكنك تعطيل فك الترميز:

```python
>>> dataset = dataset.decode(False)
```

ملاحظة: [IterableDataset.decode()](/docs/datasets/main/ar/package_reference/main_classes#datasets.IterableDataset.decode) متاح حاليًا فقط لمجموعات البيانات التي يتم بثها.

