Видобування за областю — отримайте вміст із конкретної ділянки
Коли ви обробляєте рахунки, банківські виписки, податкові форми чи будь-які шаблонні макети, зазвичай заздалегідь відомо, де розташовані поля. Замість того щоб видобувати всю сторінку й шукати значення, наведіть PDF Oxide на точний прямокутник — і отримаєте саме те, що там знаходиться.
Fluent-API within(page, rect) повертає обмежену область, до якої можна прив’язувати методи видобування: extract_text(), extract_words(), extract_chars(), extract_tables().
Покриття біндингами.
within(page, rect)доступний у Python, Rust і WASM. Go та C# надають еквівалентні низькорівневі помічники (ExtractTextInRect,ExtractWordsInRect,ExtractImagesInRect) — див. нижче.
Швидкий приклад
rect — це (x, y, width, height) у пунктах PDF, з початком координат у лівому нижньому куті сторінки. Сторінки формату Letter мають 612 × 792 пункти.
Python
from pdf_oxide import PdfDocument
doc = PdfDocument("invoice.pdf")
# Верхні 92 пункти сторінки 0 — типова смуга заголовка
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);
Ланцюжок видобувань з однієї області
Fluent-форма within() у Python / Rust / WASM дає змогу викликати будь-який метод видобування для тієї самої області без повторного задання прямокутника:
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# поки не надають fluent-ланцюжок 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# потрібно кілька типів видобування для того самого прямокутника, збережіть його у змінних і викликайте помічники послідовно. Fluent-інтерфейс з’явиться, щойно API редактора стабілізується.
Пов’язані сторінки
- Видобування тексту — видобування з усієї сторінки
- Видобування таблиць з PDF — структуровані таблиці
- Профілі видобування — налаштування видобування для окремого документа
- Довідник Page API — ітерація й обмеження області через об’єкт
Page(page.region(rect))