Skip to content

영역 지정 추출 — 페이지의 특정 영역에서 내용 가져오기

청구서, 은행 명세서, 세무 양식 또는 템플릿 기반 레이아웃을 처리할 때는 보통 필드가 어디에 있는지 미리 알고 있습니다. 전체 페이지를 추출해서 값을 탐색하는 대신, 정확한 사각형을 PDF Oxide에 지정하고 그 안의 내용만 받아올 수 있습니다.

플루언트 within(page, rect) API는 추출 메서드를 체이닝할 수 있는 범위 지정 영역을 반환합니다: extract_text(), extract_words(), extract_chars(), extract_tables().

바인딩 지원 현황. within(page, rect)Python, Rust, WASM에서 사용할 수 있습니다. Go와 C#은 동등한 저수준 헬퍼(ExtractTextInRect, ExtractWordsInRect, ExtractImagesInRect)를 제공합니다 — 아래를 참조하세요.

빠른 예제

rect는 PDF 포인트 단위의 (x, y, width, height)이며, 원점은 페이지의 왼쪽 아래에 있습니다. Letter 크기 페이지는 612 × 792 포인트입니다.

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("invoice.pdf")

# 페이지 0의 상단 92 포인트 — 전형적인 헤더 영역
header = doc.within(0, (0, 700, 612, 92)).extract_text()
print(header)

Rust

use pdf_oxide::PdfDocument;
use pdf_oxide::geometry::Rect;

let mut doc = PdfDocument::open("invoice.pdf")?;
let header = doc.within(0, Rect::new(0.0, 700.0, 612.0, 92.0)).extract_text()?;
println!("{}", header);

JavaScript (WASM)

import { WasmPdfDocument } from "pdf-oxide-wasm";

const doc = new WasmPdfDocument(bytes);
const headerRegion = doc.within(0, [0, 700, 612, 92]);
console.log(headerRegion.extractText());
doc.free();

Go (저수준 헬퍼, 동일한 효과)

package main

import (
    "fmt"
    "log"
    pdfoxide "github.com/yfedoseev/pdf_oxide/go"
)

func main() {
    doc, err := pdfoxide.Open("invoice.pdf")
    if err != nil { log.Fatal(err) }
    defer doc.Close()

    // ExtractTextInRect(pageIndex, x, y, width, height)
    header, _ := doc.ExtractTextInRect(0, 0, 700, 612, 92)
    fmt.Println(header)
}

C# (저수준 헬퍼)

using PdfOxide;

using var doc = PdfDocument.Open("invoice.pdf");
string header = doc.ExtractTextInRect(0, 0, 700, 612, 92);
Console.WriteLine(header);

영역에서 체이닝 추출

Python / Rust / WASM의 within() 플루언트 형태를 사용하면 같은 영역에 대해 사각형을 다시 지정하지 않고 원하는 추출 메서드를 호출할 수 있습니다.

Python

doc = PdfDocument("invoice.pdf")
region = doc.within(0, (400, 100, 200, 200))   # 오른쪽 아래 200×200 박스

total_text = region.extract_text()              # 일반 텍스트
words      = region.extract_words()             # 단어 단위 레코드
chars      = region.extract_chars()             # 문자 단위 레코드

Rust

let region = doc.within(0, Rect::new(400.0, 100.0, 200.0, 200.0));
let text  = region.extract_text()?;
let words = region.extract_words()?;

일반적인 사용 사례

청구서 필드 추출

청구서는 보통 공급자 주소, 청구서 번호, 품목 테이블이 고정된 위치에 있습니다. 템플릿별로 사각형을 한 번만 정의하세요.

from pdf_oxide import PdfDocument

TEMPLATES = {
    "acme_v1": {
        "invoice_no":  (450, 720,  120,  20),
        "issue_date":  (450, 700,  120,  20),
        "vendor_name": ( 50, 740,  300,  40),
        "total":       (450, 100,  120,  24),
    },
}

def parse_invoice(path, template):
    doc = PdfDocument(path)
    out = {}
    for field, rect in template.items():
        out[field] = doc.within(0, rect).extract_text().strip()
    return out

print(parse_invoice("invoice-2025-04.pdf", TEMPLATES["acme_v1"]))

은행 명세서 거래 내역

대부분의 명세서에는 좁은 “거래” 영역이 있습니다. 그 영역으로 잘라내고 extract_words()를 호출하면 각 행을 읽기 순서대로 bbox와 함께 얻을 수 있습니다.

doc = PdfDocument("statement.pdf")
for page in range(doc.page_count()):
    txn_region = doc.within(page, (36, 72, 540, 650))   # 머리말과 바닥글 건너뛰기
    for w in txn_region.extract_words():
        print(f"page {page}: {w.text} at ({w.x0:.0f},{w.y0:.0f})")

머리말 / 바닥글 제거

본문 내용만 색인한다면 각 페이지의 위아래를 잘라내세요.

Rust

let mut doc = PdfDocument::open("book.pdf")?;
for i in 0..doc.page_count()? {
    let body = doc.within(i, Rect::new(0.0, 100.0, 612.0, 600.0))
                  .extract_text()?;
    // `body`를 색인 …
}

테이블 영역 탐지

페이지에 표가 있고 위치를 이미 안다면, 표의 사각형으로 범위를 좁혀 extract_tables()가 해당 영역에만 집중하도록 합니다.

Python

tables = doc.within(0, (50, 200, 500, 400)).extract_tables()
for t in tables:
    for row in t["rows"]:
        print([c["text"] for c in row["cells"]])

좌표 참고

PDF는 왼쪽 아래 원점을 사용하며 단위는 포인트(1 pt = 1/72 인치)입니다. Letter 크기 페이지는 (0, 0, 612, 792)입니다. 상단 1인치 영역을 지정하려면 다음과 같이 작성합니다.

(x, y, w, h) = (0, 792 - 72, 612, 72)
             = (0, 720,      612, 72)

이미지 좌표계(왼쪽 위 원점)에서 넘어왔다면 y를 뒤집어 주세요.

계산 전에 페이지의 실제 MediaBox를 가져오려면:

Python

doc = PdfDocument("doc.pdf")
mb = doc.page_media_box(0)       # (llx, lly, urx, ury)

Rust

let mb = editor.get_page_media_box(0)?;   // [f32; 4]

Go / C# — 사각형 헬퍼

Go와 C#은 아직 플루언트 within() 체인을 제공하지 않지만, 기반이 되는 저수준 메서드는 동일합니다.

메서드 Go C#
사각형 내 텍스트 doc.ExtractTextInRect(page, x, y, w, h) doc.ExtractTextInRect(page, x, y, w, h)
사각형 내 단어 doc.ExtractWordsInRect(page, x, y, w, h) (아직 래핑되지 않음)
사각형 내 이미지 doc.ExtractImagesInRect(page, x, y, w, h) (아직 래핑되지 않음)

Go나 C#에서 같은 사각형에 대해 여러 추출을 수행해야 한다면 사각형을 변수에 저장하고 헬퍼를 순차적으로 호출하세요. 플루언트 인터페이스는 에디터 API가 안정화되면 뒤따라 제공됩니다.

관련 페이지