OpenDataLoader PDF 소개
OpenDataLoader PDF는 PDF 문서를 JSON, Markdown, HTML로 변환하여 최신 AI 스택(LLM, 벡터 검색, RAG 등)에 바로 활용할 수 있도록 설계된 오픈소스 프로젝트입니다. 단순히 텍스트 추출에 그치지 않고, 문서의 레이아웃을 재구성하여 제목, 리스트, 표, 이미지, 읽기 순서까지 보존해줍니다. 이는 대규모 문서 처리와 검색, AI 모델 입력 최적화에 매우 중요한 역할을 합니다.
특히 이 프로젝트는 GPU 없이도 빠르고 가벼운 규칙 기반 추론(heuristic rule-based inference)으로 동작하며, 로컬 환경에서 실행되기 때문에 개인정보나 민감한 문서도 안전하게 처리할 수 있습니다. 또한, AI 안전성(AI-Safety) 기능이 기본 활성화되어 있어 PDF 내부에 숨겨진 잠재적 프롬프트 인젝션(prompt injection) 위험 요소를 자동으로 걸러냅니다. 이는 최근 LLM 기반 시스템에서 보안 위협으로 주목받는 부분을 실질적으로 대응할 수 있는 중요한 기능입니다.
OpenDataLoader PDF는 Python, Node.js, Java 환경을 모두 지원하고 있으며, Docker 이미지로도 제공되어 다양한 환경에서 쉽게 사용할 수 있습니다. 따라서 연구자, 기업, 개발자가 문서를 정제해 AI 학습이나 검색 시스템에 활용하려는 경우 매우 유용하게 적용할 수 있습니다.
일반적으로 PDF를 처리하기 위해서는 PyPDF2, pdfplumber, Apache PDFBox 같은 라이브러리가 널리 사용됩니다. 하지만 이러한 툴들은 텍스트 추출에 중점을 두어 문서 구조(표, 리스트, 이미지, 레이아웃 등)를 온전히 보존하지 못하는 경우가 많습니다. 반면 OpenDataLoader PDF는 문서의 레이아웃 복원을 핵심 기능으로 제공하며, JSON 형태의 구조화된 데이터를 출력해 이후 AI 모델 처리나 벡터 데이터베이스 인덱싱에 바로 사용할 수 있습니다.
또한 AI-Safety 필터링 기능은 기존 PDF 처리 라이브러리에는 없는 독창적인 기능으로, 특히 LLM 기반 RAG 시스템을 구축하는 사용자에게는 보안상 중요한 이점이 됩니다. 이 점에서 단순 텍스트 추출 라이브러리를 넘어, “AI 친화적 PDF 처리 엔진”이라고 할 수 있습니다.
OpenDataLoader PDF의 주요 기능
-
문서 레이아웃 복원: OpenDataLoader PDF는 단순 텍스트가 아닌 문서의 구조를 재구성합니다. 제목, 본문, 리스트, 표, 이미지, 캡션, 헤더/푸터 등을 JSON에 명확히 구분하여 담습니다. 이는 검색 엔진이나 LLM이 문맥을 이해하는 데 큰 도움이 됩니다.
-
다양한 출력 형식: PDF를 JSON, Markdown, HTML로 변환할 수 있습니다. 또한 원본 PDF 위에 추출된 레이아웃 정보를 시각화한 “Annotated PDF”를 생성할 수도 있어 결과를 직접 확인하기 쉽습니다.
-
AI-Safety: PDF에 숨겨진 악의적 콘텐츠(숨겨진 텍스트, 너무 작은 글자, off-page 요소, prompt injection 가능성이 있는 요소 등)를 자동으로 필터링합니다. 이 기능은 기본적으로 활성화되어 있으며 필요 시 특정 필터를 해제할 수도 있습니다. 더 자세한 내용은 GitHub 저장소의 AI Safety 문서를 참고해주세요.
-
고속, 경량, 로컬 우선: GPU 없이도 규칙 기반 추론만으로 빠른 속도를 보장하며, 모든 처리가 로컬에서 실행됩니다. 따라서 민감한 데이터를 안전하게 다룰 수 있습니다.
OpenDataLoader PDF 설치 및 사용 예시
Python에서 OpenDataLoader PDF 설치 및 사용하기
OpenDataLoader PDF는 PyPI에 배포되어 있어 간단히 설치할 수 있습니다:
pip install -U opendataloader-pdf
이렇게 설치하면 최신 버전의 패키지가 환경에 추가됩니다. 설치 후에는 run() 함수를 사용해 PDF 파일을 손쉽게 처리할 수 있습니다. 입력으로는 개별 PDF 파일뿐 아니라 폴더 단위로도 지정할 수 있습니다. 또한, output_folder를 지정하지 않으면 입력 파일이 위치한 동일한 디렉토리에 결과가 저장됩니다.
다음은 Python에서 OpenDataLoader PDF 예시 코드입니다:
import opendataloader_pdf
opendataloader_pdf.run(
input_path="path/to/document.pdf",
output_folder="path/to/output",
generate_markdown=True,
generate_html=True,
generate_annotated_pdf=True,
)
위 예시는 지정된 PDF 문서를 읽어 JSON 외에도 Markdown, HTML, Annotated PDF(레이아웃 분석이 시각적으로 표시된 PDF)를 함께 생성합니다. 아래 표는 run() 함수에서 사용할 수 있는 주요 파라미터를 정리한 것입니다:
| 파라미터 | 타입 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
| input_path | str | — | 입력 PDF 파일 경로나 폴더 경로 | |
| output_folder | str | 선택 | 입력 폴더 | 출력 파일이 저장될 경로 |
| password | str | 선택 | None | 암호화된 PDF의 비밀번호 |
| replace_invalid_chars | str | 선택 | " " | 인식 불가능한 문자를 대체할 문자 (예: �, \u0000) |
| content_safety_off | str | 선택 | None | AI-Safety 필터를 비활성화 (예: all, hidden-text, off-page, tiny, hidden-ocg) |
| generate_markdown | bool | 선택 | False | Markdown 출력 파일 생성 여부 |
| generate_html | bool | 선택 | False | HTML 출력 파일 생성 여부 |
| generate_annotated_pdf | bool | 선택 | False | 분석된 레이아웃이 표시된 Annotated PDF 생성 여부 |
| keep_line_breaks | bool | 선택 | False | 원본의 줄바꿈을 유지할지 여부 |
| html_in_markdown | bool | 선택 | False | Markdown 내에서 HTML 태그를 허용할지 여부 |
| add_image_to_markdown | bool | 선택 | False | Markdown 출력 시 이미지 포함 여부 |
| no_json | bool | 선택 | False | JSON 출력 생성을 비활성화 |
| debug | bool | 선택 | False | 실행 중 디버그 메시지를 출력할지 여부 |
이러한 기능들은 단순히 PDF를 텍스트로 변환하는 수준이 아니라, 문서의 구조를 인식하고 다양한 출력 형식으로 가공할 수 있도록 도와줍니다. 특히 RAG(Retrieval-Augmented Generation) 시스템을 구축하거나 사내 문서 검색 엔진을 만들 때 유용하게 활용할 수 있습니다.
Node.js / NPM에서 OpenDataLoader PDF 설치 및 사용하기
Node.js / NPM에서 사용하는 OpenDataLoader PDF 패키지는 Java CLI를 감싸는(Node.js wrapper) 형태로 제공되기 때문에, 사용 전 반드시 Java 11 이상이 시스템에 설치되어 있어야 하며, 해당 경로가 PATH 환경변수에 등록되어 있어야 합니다. 또한 이 라이브러리는 브라우저 환경에서는 동작하지 않으며, Node.js 기반의 백엔드 환경 전용임을 유의해야 합니다.
설치는 NPM을 통해 간단하게 할 수 있습니다:
npm install @opendataloader/pdf
설치 후에는 Python과 마찬가지로 run() 함수를 호출하여 PDF 문서를 처리할 수 있습니다. 입력(inputPath)으로는 PDF 파일 하나 또는 폴더 전체를 지정할 수 있습니다. 출력 폴더(outputFolder)를 지정하지 않으면, 결과 파일은 기본적으로 입력 PDF가 있는 디렉토리에 저장됩니다.
import { run } from '@opendataloader/pdf';
async function main() {
try {
const output = await run("path/to/document.pdf", {
outputFolder: "path/to/output",
generateMarkdown: true,
generateHtml: true,
generateAnnotatedPdf: true,
debug: true,
});
console.log("PDF processing complete.", output);
} catch (error) {
console.error("Error processing PDF:", error);
}
}
main();
위 Node.js 예제는 지정된 PDF를 JSON으로 파싱할 뿐만 아니라, Markdown, HTML, Annotated PDF까지 함께 생성하는 방식입니다.
Node.js에서 PDF를 처리하는 메인 함수는 run()으로, Promise를 반환하므로 await 또는 .then()을 활용할 수 있습니다:
run(inputPath: string, options?: RunOptions): Promise<string>
run() 함수에서 사용 가능한 파라매터들은 다음과 같습니다:
| 파라미터 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| inputPath | string | 입력 PDF 파일 경로나 폴더 경로 | |
| options | RunOptions | 선택 | 실행을 위한 세부 옵션 설정 객체 |
이 때, 파라매터로 입력하는 RunOptions의 상세 옵션을 통해 세밀한 설정이 가능합니다:
| 속성 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| outputFolder | string | undefined | 출력 파일이 저장될 경로. 지정하지 않으면 입력 파일 경로 옆에 저장 |
| password | string | undefined | 암호화된 PDF의 비밀번호 |
| replaceInvalidChars | string | " " | 인식 불가능한 문자를 대체할 문자 |
| contentSafetyOff | string | undefined | AI-Safety 필터 비활성화 옵션. 여러 값을 콤마로 구분하여 지정 (예: all, hidden-text, off-page, tiny, hidden-ocg) |
| generateMarkdown | boolean | false | Markdown 출력 파일 생성 여부 |
| generateHtml | boolean | false | HTML 출력 파일 생성 여부 |
| generateAnnotatedPdf | boolean | false | 분석된 레이아웃이 표시된 Annotated PDF 생성 여부 |
| keepLineBreaks | boolean | false | 원본의 줄바꿈을 유지할지 여부 |
| htmlInMarkdown | boolean | false | Markdown 내에서 HTML 태그 사용 여부 |
| addImageToMarkdown | boolean | false | Markdown 출력 시 이미지 포함 여부 |
| noJson | boolean | false | JSON 출력 비활성화 |
| debug | boolean | false | 실행 중 디버깅 메시지 출력 여부 |
Node.js 환경에서는 특히 대량의 PDF를 자동 처리하는 서버 애플리케이션 이나, RAG(Retrieval-Augmented Generation) 기반의 백엔드 서비스 에서 이 패키지를 활용하면 좋습니다. 예를 들어 사내 문서를 일괄적으로 구조화해 JSON + Markdown으로 변환한 뒤, 이를 벡터 데이터베이스에 인덱싱하여 검색 가능한 AI 지식 베이스로 만드는 식의 활용이 가능합니다.
Java 및 Docker에서의 사용
그 외 Java 및 Docker 기반으로 OpenDataLoader PDF를 사용할 수 있습니다. 자세한 사용 방법은 OpenDataLoader PDF 프로젝트의 GItHub 저장소를 확인해주세요.
JSON 출력 구조
OpenDataLoader PDF는 PDF를 단순 텍스트가 아닌 구조화된 JSON 데이터로 변환합니다. 이 JSON은 문서 전체의 메타데이터와, 각 페이지의 요소들(제목, 본문, 표, 이미지 등)을 계층적으로 표현합니다. 즉, PDF 문서를 마치 DOM(Document Object Model) 처럼 트리 구조로 바꿔줍니다. 이 덕분에 AI 모델이나 검색 시스템에서 문서를 더욱 정교하게 활용할 수 있습니다.
OpenDataLoader PDF의 JSON 출력은 다음과 같이 문서의 구조를 상세하게 담습니다:
- 문서 정보(제목, 저자, 생성일, 수정일 등)
- 페이지별 요소(heading, paragraph, list, table, image 등)
- 표의 행/열 구조 및 셀 내용
- 리스트 항목 및 번호 스타일
- 텍스트 속성(폰트, 색상, 크기 등)
이를 통해 단순히 텍스트가 아닌 “문서 구조”를 데이터베이스나 LLM 입력에 활용할 수 있습니다. 상세한 문서 및 스타일별 노드 정보 및 필드들은 다음과 같습니다:
루트 노드 (Root JSON Node)
루트에는 PDF 전체에 대한 기본 정보가 담깁니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| file name | string | 필수 | 처리된 PDF 파일 이름 |
| number of pages | integer | 필수 | PDF 페이지 수 |
| author | string | 필수 | 문서 저자 |
| title | string | 필수 | 문서 제목 |
| creation date | string | 필수 | 생성일 |
| modification date | string | 필수 | 수정일 |
| kids | array | 필수 | 문서 내 요소 배열 (본문, 표, 이미지 등) |
공통 필드 (모든 Content Node에 공통 적용)
문서의 각 요소(제목, 본문, 표 등)에는 공통적으로 다음 정보가 포함됩니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| id | integer | 선택 | 요소 고유 ID |
| level | string | 선택 | 계층 수준(heading 레벨 등) |
| type | string | 필수 | 요소 타입 (예: heading, paragraph, table, list, image 등) |
| page number | integer | 필수 | 해당 요소가 위치한 페이지 번호 |
| bounding box | array | 필수 | 요소의 위치를 나타내는 좌표 정보 |
텍스트 요소 (Caption, Heading, Paragraph)
문자 정보가 있는 노드에는 다음 속성이 포함됩니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| font | string | 필수 | 폰트 이름 |
| font size | double | 필수 | 폰트 크기 |
| text color | array | 필수 | 텍스트 색상 |
| content | string | 필수 | 텍스트 내용 |
표 (Table) 관련 노드
Table 노드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| number of rows | integer | 필수 | 행 개수 |
| number of columns | integer | 필수 | 열 개수 |
| rows | array | 필수 | 행 데이터 배열 |
| previous table id | integer | 선택 | 연결된 이전 표 ID |
| next table id | integer | 선택 | 연결된 다음 표 ID |
Table Row 노드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| row number | integer | 필수 | 행 번호 |
| cells | array | 필수 | 셀 데이터 배열 |
Table Cell 노드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| row number | integer | 필수 | 셀의 행 번호 |
| column number | integer | 필수 | 셀의 열 번호 |
| row span | integer | 필수 | 병합된 행 수 |
| column span | integer | 필수 | 병합된 열 수 |
| kids | array | 필수 | 셀 안에 포함된 요소들 |
Heading 노드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| heading level | integer | 필수 | 제목 레벨(h1, h2 등) |
리스트 (List & List Item)
List 노드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| number of list items | integer | 필수 | 리스트 항목 개수 |
| numbering style | string | 필수 | 번호 스타일(숫자, 불릿 등) |
| previous list id | integer | 선택 | 연결된 이전 리스트 ID |
| next list id | integer | 선택 | 연결된 다음 리스트 ID |
| list items | array | 필수 | 리스트 항목 배열 |
List Item 노드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| kids | array | 필수 | 리스트 항목 내부 요소 |
Header & Footer 노드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| kids | array | 필수 | 헤더/푸터 내부 요소 |
Text Block 노드
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| kids | array | 필수 | 텍스트 블록 내부 요소 |
활용 예시
이러한 JSON 구조를 이용하면 다음과 같은 활용이 가능합니다:
- 문서의 목차(heading level 기반) 자동 생성
- 표(table) 구조를 그대로 재현해 데이터베이스에 저장
- 리스트를 항목 단위로 검색 가능하게 구성
- 벡터 DB에 넣기 전에 문서 단락 단위로 chunking 최적화
즉, 단순히 PDF를 “텍스트로 뽑아내는” 것이 아니라, 문서의 논리적 구조를 유지한 채 AI/검색 시스템에서 활용할 수 있다는 점이 OpenDataLoader PDF의 큰 강점입니다.
라이선스
이 프로젝트는 Mozilla Public License 2.0로 공개 및 배포되고 있습니다. 상업적 활용이 가능하지만, 수정된 코드 배포 시 소스 공개 의무가 있을 수 있습니다. 상세한 조건은 LICENSE 문서 문서를 참고하시기 바랍니다. 추가로 서드파티 라이브러리 및 컴포넌트들에 대한 정보는 다음 링크들을 참고해주세요:
OpenDataLoader PDF 프로젝트 GitHub 저장소
더 읽어보기
-
MarkItDown, Microsoft가 공개한 PDF, 이미지 및 오피스 문서 👉 Markdown 변환 도구
-
MinerU, PDF를 JSON/Markdown 변환 및 OCR 등을 지원하는 데이터 추출 도구 (feat. 한국어 지원)
-
NVIDIA-Ingest: PDF, Word, Powerpoint 등으로부터 텍스트, 이미지, 표 등을 추출하는 마이크로서비스
-
MegaParse, PDF 및 오피스 문서 파싱이 가능한, 멀티모달 모델과의 통합을 지원하는 오픈소스 프로젝트
-
Oh One Pro: PDF 등의 문서를 OpenAI o1, o3-mini 등의 모델에서 사용할 수 있도록 변환하는 macOS App (feat. BoltAI)
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()

