레이블이 JAVA인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAVA인 게시물을 표시합니다. 모든 게시물 표시

목요일, 8월 13, 2026

pdf parser 체험기

pdf파일을 텍스트로 변환하는 작업을 진행하다가 이런것도 있다는 것을 이제야 알았네요

python만 사용하다보니 pdfplumber를 사용해서 이리저리 헤매고 있었는데 opendataloader-pdf라는 무시무시한 녀석을 만나버렸네요


pdf파일을 다양한 포맷으로 저장해줘서 이리저리 사용해보고 있습니다.


perplexity에게 이거 어떻게 사용하는지 한번 물어보고 파이썬 코드도 작성해달라고 했는데, 역시 기대를 저버리지 않네요 :)

※ 물론 집에서 사용하는 PC 설치된 java 버전이 낮아서 java를 버전 업 해서 설치했다는 것 제외하고는 아무런 문제없이 작동하고 있습니다. 


---

기존의 `pdfplumber`, `PyMuPDF(fitz)`, `pdfminer.six`처럼 텍스트만 추출하는 것이 아니라, **PDF → AI(RAG)가 바로 사용할 수 있는 Markdown / JSON / HTML / Tagged PDF로 변환하는 것을 목표로 만든 프로젝트**입니다. 특히 논문, 보고서, 특허처럼 레이아웃이 복잡한 PDF를 LLM이 이해하기 좋은 형태로 변환하는 데 초점이 맞춰져 있습니다. ([GitHub][1])

---

전체 구조(동작 원리)

OpenDataLoader는 크게 두 가지 모드가 있습니다.

```
                                 PDF
                                  │
        ┌─────────┴─────────┐
        │                                                 │
        │         Local(Java)                     │
        │                                                 │
        └──────┬────────────┘
                          │
                   Layout Analysis
                          │
                   Reading Order(XY-Cut++)
                          │
                   Semantic Detection
                          │
               Heading/Table/Image/List
                          │
                 Markdown / JSON / HTML
```

또는

```

                         PDF
                          │
                Local Java Parser
                          │
              복잡한 페이지인가?
          │                                 │
         NO                                YES
          │                                 │
          │                          AI Backend
          │                                  │
          └──────┬──────┘
                            │
                 최종 결과 생성
```

이것을 **Hybrid Mode**라고 합니다. ([GitHub][2])


기본모드은 Local Mode는 AI를 사용하지 않고 Java엔진이 알아서 처리합니다. 두번째 언급한 Hybrid Mode에서는 java가 처리할 수 있는 페이지는 기본모드처럼 java가 처리하기 어려운 복잡한 페이지는 AI가 처리한다고 하네요 ㅎㅎ (아직 Hybrid는 사용하지 못해봐서... API key를 요청하는지는 모르겠네요. 설치할때 에러났어요 Orz)

---


설치 방법

## 기본 설치

필수 조건

```

Python >=3.10

Java >=11

```

먼저 Java 확인

```bash

java -version

```

설치

```bash

pip install -U opendataloader-pdf

```

CLI 설치도 같이 됩니다. ([OpenDataLoader][3])

---

## Hybrid 설치

```bash

pip install "opendataloader-pdf[hybrid]"

```

AI Backend 포함 설치입니다. ([GitHub][2])


Java는 설치할 때 확인하지 않습니다. java11이 설치되지 않았다면 opendataloader-pdf 라이브러리를 사용해서 pdf 파일을 파싱할때 에러가 납니다. 그 후에 java 11 버전 설치해도 괜찮습니다. 


---


Python 사용법

```python

import opendataloader_pdf


opendataloader_pdf.convert(

    input_path="paper.pdf",

    output_dir="output",

    format="markdown"

)

```

---


다른 PDF라이브러리와의 차이점

| 라이브러리                          | 텍스트 추출 | 레이아웃 유지 | 표 추출 | Bounding Box | OCR       | RAG 적합성 |
| ----------------------------------- | -------------- | ------------------ | --------- | ------------------- | ----------- | ---------------- |
| pdfminer                             | ✔               | ✖                    | ✖        | ✖                     | ✖            | 낮음             |
| PyMuPDF                           | ✔               | 일부                | 일부    | ✔                     | ✖            | 보통             |
| pdfplumber                         | ✔               | 일부                | ✔        | ✔                     | ✖            | 보통             |
| Docling                               | ✔               | ✔                    | ✔        | ✔                     | ✔            | 높음             |
| **OpenDataLoader PDF**  | ✔               | ✔                    | ✔        | ✔                     | ✔§          | 매우 높음     |

§Hybrid

OpenDataLoader의 가장 큰 장점은 **Markdown(LLM 입력용), JSON(정밀 제어용), Bounding Box(출처 추적용), OCR 및 AI 기반 복잡한 표/수식 처리(Hybrid 모드)**를 하나의 도구에서 제공한다는 점입니다. 그래서 특히 **논문, 특허, 매뉴얼, 기술 문서**를 RAG 파이프라인에 넣기 위한 전처리 도구로 설계되어 있습니다. ([GitHub][1])


금요일, 10월 18, 2019

Trimmomatic 설치 및 사용

Trimmomatic Site

Trimmomatic Manual

Trimmomatic은 cutadapt와 함께 Illumina 시퀀서들의 adapter들을 제거하고 trimming하는데 널리사용되는 tool되겠습니다.

설치방법은..
>wget http://www.usadellab.org/cms/uploads/supplementary/Trimmomatic/Trimmomatic-0.36.zip
>unzip Trimmomatic-0.36.zip
Trimmomatic-0.36폴더 밑에 파일 생성
>cd Trimmomatic-0.36
>java -jar trimmomatic-0.36.jar -h

참 쉽죠!!
물론 java가 설치되어 있어야한다는게 함정


Quick Start

Paired End일때
java -jar trimmomatic-0.35.jar PE -phred33 input_forward.fq.gz input_reverse.fq.gz output_forward_paired.fq.gz output_forward_unpaired.fq.gz output_reverse_paired.fq.gz output_reverse_unpaired.fq.gz ILLUMINACLIP:TruSeq3-PE.fa:2:30:10 LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36


Single End일때
java -jar trimmomatic-0.35.jar SE -phred33 input.fq.gz output.fq.gz ILLUMINACLIP:TruSeq3-SE:2:30:10 LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36

위의 Quick Start에서 사용한 내용은 paired와 single 차이일뿐 옵션은 동일합니다.
찬찬히 뜯어보면 다음과 같다고 하네요

ILLUMINACLIP:TruSeq3-PE.fa:2:30:10
- 일루미나 아답타 서열을 제거하는 옵션입니다. 자세한 내용은 하단에..
LEADING:3
- 서열의 앞쪽을 기준으로 quality (여기서는 3) 이하의 N개 서열을 제거합니다.
TRAILING:3
- 서열의 뒤쪽을 기준으로 설정한 quality (여기도 3) 이하의 N개 서열을 제거합니다.
SLIDINGWINDOW:4:15
- 4base씩 확인하면서 평균 quality가 설정된 기준 quality (여기서는 15)보다 이하일 경우 제거합니다.
MINLEN:36
- 위의 단계들을 거치면서도 살아 남은 서열 길이가 기준 길이 (여기서는 36bp)보다 짧으면 (이하) 아예 read를 삭제합니다.



사용 가능한 옵션

ILLUMINACLIP:<fastaWithAdaptersEtc>:<seed mismatches>:<palindrome clip threshold>:<simple clip threshold>
- fastaWithAdaptersEtc: trimmomatics에서 TruSeq2와 TruSeq3서열은 제공하고 있고 그외에 아답터 서열을 사용하고 싶으면 fa파일을 넣어주면 됨
- seed mismatches: 허용가능한seed 서열의 mismatch 개수
- palindrome clip threshold: palindrome trimming방법은 Paired End로 시퀀싱을 했을 때 적용할 수 있는 방법으로 아답타 서열이 traget read 앞뒤에 존재해서 첫번째 read와 두번째 read에서 역 상보적으로 동일한 read들이 발견되는 경우 해당 서열들을 삭제하는 방법입니다. (참고 palindrome란? )
- simple clip threshold: 설정된 기준 값에 부합하는 충분히 정확한 match가 확인되면 적절히 clipping함

SLIDINGWINDOW:<windowSize>:<requiredQuality>
설정된 windowSize 서열들의 평균 qaulity가 requiredQuality 값보다 작아지면 작아진 서열들 이후를 제거합니다.

LEADING:<quality>
read 앞쪽을 기준으로 설정된 quality보다 낮은 quality를 가진 서열들을 제거합니다.

TRAILING:<quality>
read 뒤쪽을 기준으로 설정된 quality보다 낮은 quality를 가진 서열들을 제거합니다.

CROP:<length>
read 앞쪽을 기준으로 설정된 length만큼 서열들을 보존한다.

HEADCROP:<length>
read 앞쪽을 기준으로 설정된 length만큼 서열을 삭제한다.

MINLEN:<length>

TOPHRED33 quality를 phread 33으로 변환

TOPHRED64 quality를 phread 64으로 변환


그리고 중요한 점 하나! trimmomatic는 옵션에 순서가 있다는 사실! 저도 아직 테스트 해보지는 못했는데 옵션이 순서대로 적용 된다고 합니다. 설명서에 그렇게 써 있으니 맞겠죠. 그래서 일단 어답터 서열을 먼저 제거하라고 합니다. :)

그럼 즐거운 trimming 작업 되시길..





@sana_twice.09