Извлечение по области — получите содержимое из заданного участка
Когда вы обрабатываете счета, банковские выписки, налоговые формы или любые другие шаблонные макеты, обычно уже известно, где именно находятся поля. Вместо того чтобы извлекать всю страницу и потом искать нужное значение, укажите 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))