# PDF 데이터 로드

> [!WARNING]
> Pdf 지원은 실험적이며 변경될 수 있습니다.

Pdf 데이터셋에는 `pdfplumber` 객체를 포함하는 [Pdf](/docs/datasets/main/ko/package_reference/main_classes#datasets.Pdf) 타입의 컬럼이 있습니다.

> [!TIP]
> pdf 데이터셋을 다루려면 `pdfplumber` 패키지가 설치되어 있어야 합니다. 설치 방법은 [설치](https://github.com/jsvine/pdfplumber#installation) 가이드를 참고하세요.

pdf 데이터셋을 로드하고 pdf 컬럼을 호출하면 pdf는 `pdfplumber` Pdf로 디코딩됩니다:

```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]
> `dataset[0]["pdf"]`와 같이 먼저 행 인덱스를 사용하고 이어서 `pdf` 컬럼을 인덱싱하여 데이터셋의 모든 pdf 객체를 생성하지 않도록 하세요. 그렇지 않으면 데이터셋이 크면 느리고 시간이 많이 걸리는 과정이 될 수 있습니다.

모든 유형의 데이터를 로드하는 방법에 대한 가이드는 일반적인 로드 가이드를 참고하세요.

## 페이지 읽기

`.pages` 속성을 사용하여 pdf에서 페이지에 직접 액세스할 수 있습니다.

이후 `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/ko/package_reference/main_classes#datasets.Dataset.cast_column) 함수를 사용해 pdf 파일 경로 컬럼을 받아 [Pdf](/docs/datasets/main/ko/package_reference/main_classes#datasets.Pdf) 기능으로 `pdfplumber` 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 데이터셋의 기본 경로만 로드하려면 [Pdf](/docs/datasets/main/ko/package_reference/main_classes#datasets.Pdf) 기능에서 `decode=False`를 설정하세요:

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

## PdfFolder

`PdfFolder` dataset builder를 사용하여 커스텀 dataloader를 작성하지 않고도 dataset을 로드할 수 있습니다. 이를 통해 `PdfFolder`은 다양한 vision task에 대해 수천 개의 pdf로 구성된 pdf dataset을 빠르게 생성하고 로드하는 데 이상적입니다. pdf dataset 구조는 다음과 같아야 합니다:

```
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/ko/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")
```

로컬 데이터셋의 경우, 이는 [load_dataset()](/docs/datasets/main/ko/package_reference/loading_methods#datasets.load_dataset)에서 `pdffolder`를 수동으로 전달하고 `data_dir`에 해당 디렉터리를 지정하는 것과 동일합니다:

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

이후 `pdfplumber.pdf.PDF` 객체로 PDF에 액세스할 수 있습니다:

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

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

메타데이터 파일의 정보를 무시하려면 [load_dataset()](/docs/datasets/main/ko/package_reference/loading_methods#datasets.load_dataset)에서 `drop_metadata=True`를 설정하세요:

```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는 pdfplumber `PDFs`로 순차적으로 디코딩됩니다. 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`보다 느릴 수 있습니다.

If you are not interested in the documents decoded as pdfplumber `PDFs` and would like to access the path/bytes instead, you can disable decoding:

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

참고: [IterableDataset.decode()](/docs/datasets/main/ko/package_reference/main_classes#datasets.IterableDataset.decode)는 현재 스트리밍 데이터셋에서만 사용할 수 있습니다.

