# Charger des données PDF

> [!WARNING]
> La prise en charge des PDF est expérimentale et peut évoluer.

Les jeux de données Pdf ont des colonnes de type [Pdf](/docs/datasets/v5.2.0/fr/package_reference/main_classes#datasets.Pdf), qui contiennent des objets `pdfplumber`.

> [!TIP]
> Pour travailler avec des jeux de données PDF, vous devez avoir le package `pdfplumber` installé. Consultez le guide [installation](https://github.com/jsvine/pdfplumber#installation) pour apprendre comment l'installer.

Lorsque vous chargez un jeu de données pdf et appelez la colonne pdf, les pdf sont décodés en Pdf `pdfplumber` :

```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]
> Accédez à un jeu de données PDF en utilisant d'abord l'index de la ligne, puis la colonne `pdf` - `dataset[0]["pdf"]` - afin d'éviter de créer tous les objets PDF du jeu de données. Sinon, cela peut être un processus lent et chronophage si vous disposez d'un jeu de données volumineux.

Pour un guide sur la façon de charger n'importe quel type de jeu de données, consultez le guide de chargement général.

## Lire les pages

Accédez directement aux pages d'un PDF à l'aide de l'attribut `.pages`.

Vous pouvez ensuite utiliser les fonctions de `pdfplumber` pour lire des textes, des tableaux et des images, par exemple :

```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()
[]
```

Vous pouvez également charger chaque page en tant que `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>
```

Notez que vous pouvez passer `resolution=` à `.to_image()` pour afficher l'image dans une résolution supérieure à la valeur par défaut (72 ppi).

## Fichiers locaux

Vous pouvez charger un jeu de données à partir du chemin d'accès au pdf. Utilisez la fonction [cast_column()](/docs/datasets/v5.2.0/fr/package_reference/main_classes#datasets.Dataset.cast_column) pour accepter une colonne de chemins d'accès aux fichiers pdf, puis décodez-la en pdf `pdfplumber` avec la fonctionnalité [Pdf](/docs/datasets/v5.2.0/fr/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>
```

Si vous souhaitez uniquement charger le chemin sous-jacent du jeu de données pdf sans décoder l'objet pdf, définissez `decode=False` dans la fonctionnalité [Pdf](/docs/datasets/v5.2.0/fr/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

Vous pouvez également charger un jeu de données avec le constructeur de jeu de données `PdfFolder`, qui ne nécessite pas d'écrire un chargeur de données personnalisé. Cela rend `PdfFolder` idéal pour créer et charger rapidement des jeux de données PDF contenant plusieurs milliers de PDF pour différentes tâches de vision. La structure de votre jeu de données PDF doit ressembler à ceci :

```
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
```

Si le jeu de données suit la structure `PdfFolder`, vous pouvez le charger directement avec [load_dataset()](/docs/datasets/v5.2.0/fr/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")
```

Pour les jeux de données locaux, cela équivaut à passer manuellement `pdffolder` dans [load_dataset()](/docs/datasets/v5.2.0/fr/package_reference/loading_methods#datasets.load_dataset) et le répertoire dans `data_dir` :

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

Vous pouvez ensuite accéder aux PDF en tant qu'objets `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}
```

Pour ignorer les informations du fichier de métadonnées, définissez `drop_metadata=True` dans [load_dataset()](/docs/datasets/v5.2.0/fr/package_reference/loading_methods#datasets.load_dataset) :

```py
>>> from datasets import load_dataset

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

Si vous n'avez pas de fichier de métadonnées, `PdfFolder` infère automatiquement le nom de l'étiquette à partir du nom du répertoire. Si vous souhaitez supprimer les étiquettes créées automatiquement, définissez `drop_labels=True`. Dans ce cas, votre jeu de données ne contiendra qu'une colonne pdf :

```py
>>> from datasets import load_dataset

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

Enfin, l'argument `filters` permet de charger uniquement un sous-ensemble du jeu de données, en fonction d'une condition sur l'étiquette ou les métadonnées. C'est particulièrement utile si les métadonnées sont au format Parquet, car ce format permet un filtrage rapide. Il est également recommandé d'utiliser cet argument avec `streaming=True`, car par défaut le jeu de données est entièrement téléchargé avant le filtrage.

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

> [!TIP]
> Pour plus d'informations sur la création de votre propre jeu de données `PdfFolder`, consultez le guide [Créer un jeu de données pdf](./document_dataset).

## Décodage de PDF

Par défaut, les PDF sont décodés séquentiellement en tant que `PDFs` pdfplumber lorsque vous itérez sur un jeu de données. Le métadonnées des PDF sont décodées séquentiellement, et les pages du PDF ne sont lues que lorsque vous y accédez.

Cependant, il est possible d'accélérer considérablement le jeu de données en utilisant un décodage multithreadé :

```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 !
...     ...
```

Vous pouvez activer le multithreading à l'aide de `num_threads`. Cela est particulièrement utile pour accélérer le streaming de données distantes. Cependant, cela peut être plus lent que `num_threads=0` pour des données locales sur des disques rapides.

Si vous n’êtes pas intéressé par les documents décodés en `PDFs` par pdfplumber et souhaitez plutôt accéder au chemin/aux octets, vous pouvez désactiver le décodage :

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

Remarque : [IterableDataset.decode()](/docs/datasets/v5.2.0/fr/package_reference/main_classes#datasets.IterableDataset.decode) n'est actuellement disponible que pour les jeux de données en flux.

