Справочник Page API
Начиная с v0.3.34, каждый биндинг предоставляет объект Page. Можно перебирать документ и вызывать методы извлечения прямо на странице, а не протаскивать page_index через каждый вызов. Тип называется Page во всех языках — Python, Node.js, C#, Go; Rust экспонирует ту же форму под именем PdfPage.
Быстрый пример
Python
from pdf_oxide import PdfDocument
with PdfDocument("paper.pdf") as doc:
for page in doc: # len(doc), doc[i], doc[-1] тоже работают
print(page.text[:80])
md = page.markdown(detect_headings=True)
Rust
use pdf_oxide::api::Pdf;
let mut doc = Pdf::open("paper.pdf")?;
for i in 0..doc.page_count()? {
let page = doc.page(i)?;
println!("{}", &page.text()?[..80]);
}
JavaScript / TypeScript (Node)
const { PdfDocument } = require("pdf-oxide");
const doc = new PdfDocument("paper.pdf");
for (const page of doc) {
console.log(page.extractText().slice(0, 80));
}
doc.close();
Go
package main
import (
"fmt"
"log"
pdfoxide "github.com/yfedoseev/pdf_oxide/go"
)
func main() {
doc, err := pdfoxide.Open("paper.pdf")
if err != nil { log.Fatal(err) }
defer doc.Close()
pages, _ := doc.Pages()
for _, page := range pages {
text, _ := page.ExtractText()
fmt.Println(text[:80])
}
}
C#
using PdfOxide;
using var doc = PdfDocument.Open("paper.pdf");
foreach (var page in doc.Pages)
{
Console.WriteLine(page.ExtractText()[..Math.Min(80, page.ExtractText().Length)]);
}
Python — Page
Поверхность из ленивых свойств: содержимое парсится при первом обращении и кэшируется на Page.
| Член | Возвращает | Описание |
|---|---|---|
page.text |
str |
Извлечённый текст (с учётом колонок) |
page.chars |
list[Char] |
Записи по символам с bbox и шрифтом |
page.words |
list[Word] |
Записи по словам с bbox |
page.lines |
list[TextLine] |
Строки текста с bbox |
page.spans |
list[Span] |
Стилизованные фрагменты (шрифт, размер, начертание) |
page.tables |
list[Table] |
Структурированные строки таблиц и bbox ячеек |
page.images |
list[Image] |
Метаданные изображений |
page.paths |
list[Path] |
Записи векторных путей |
page.annotations |
list[Annotation] |
Аннотации на этой странице |
page.markdown(detect_headings=True) |
str |
Преобразование в Markdown |
page.plain_text() |
str |
Простой текст (без подсказок раскладки) |
page.html() |
str |
Преобразование в HTML |
page.render(format="png") |
bytes |
Отрисовка страницы в PNG / JPEG |
page.search(term, case_sensitive=False) |
list[SearchResult] |
Поиск текста на этой странице |
page.region(rect) |
PageRegion |
Извлечение в пределах прямоугольника |
with PdfDocument("paper.pdf") as doc:
page = doc[0] # или doc.page(0)
for word in page.words: # первое обращение парсит, последующие берут из кэша
print(word.text, word.bbox)
# Извлечение в границах области
header = page.region((0, 700, 612, 92)).extract_text()
Существовавший ранее класс-редактор PdfPage (для записи) не изменился; новый Page строго предназначен только для чтения.
Rust — PdfPage
use pdf_oxide::api::Pdf;
let mut doc = Pdf::open("paper.pdf")?;
let page = doc.page(0)?;
let text = page.text()?;
let words = page.extract_words()?;
let tables = page.extract_tables()?;
let md = page.to_markdown(true)?;
Методы, доступные на PdfPage:
text(),plain_text(),to_markdown(detect_headings),to_html()extract_chars(),extract_words(),extract_lines(),extract_spans()extract_tables(),extract_paths(),extract_images()annotations(),render(format)search(term)— поиск в пределах страницыfind_text_containing(substring)— список попаданий на уровне DOM с идентификаторами
Node.js — Page
const { PdfDocument } = require("pdf-oxide");
const doc = new PdfDocument("paper.pdf");
const page = doc.page(0);
console.log(page.width, page.height, page.rotation); // закэшировано
console.log(page.extractText());
const words = page.extractWords();
const tables = page.extractTables();
const md = page.toMarkdown();
PdfDocument поддерживает for..of через Symbol.iterator, плюс doc.page(i) и doc.pageCount().
Шесть методов, которые раньше были доступны только в нативном слое, теперь работают и на Page, и на PdfDocument через TS-слой:
extractWordsextractTextLinesextractTablesextractPathsgetEmbeddedImagesocrExtractText
У каждого метода есть async-собрат — extractTextAsync, toMarkdownAsync и т. д.
Go — Page
doc, _ := pdfoxide.Open("paper.pdf")
defer doc.Close()
page, _ := doc.Page(0)
text, _ := page.ExtractText()
md, _ := page.ToMarkdown()
tables, _ := page.ExtractTables()
// Перебор всех страниц
all, _ := doc.Pages()
for i, p := range all {
t, _ := p.ExtractText()
fmt.Printf("страница %d: %d символов\n", i, len(t))
}
Структура Page в Go содержит полный набор методов: ExtractText, ToMarkdown, ToHtml, ToPlainText, ExtractWords, ExtractTextLines, ExtractTables, ExtractChars, ExtractPaths, Annotations, Images, Fonts, RenderPage, Search.
C# — Page
using PdfOxide;
using var doc = PdfDocument.Open("paper.pdf");
Page page = doc[0]; // или doc.Pages[0], либо doc.Page(0)
string text = page.ExtractText();
string md = page.ToMarkdown();
Table[] tables = page.ExtractTables();
// Async-варианты
string textAsync = await page.ExtractTextAsync();
string mdAsync = await page.ToMarkdownAsync();
doc.Pages имеет тип IReadOnlyList<Page>. Каждому синхронному методу соответствует async Task<T> с поддержкой CancellationToken.
Структура типа Table
extract_tables() (доступен и на PdfDocument, и на Page) возвращает единый тип Table во всех языках:
| Язык | Тип | Доступ к ячейкам |
|---|---|---|
| Rust | Table |
перебор rows[i].cells[j] |
| Python | dict |
row["cells"][i]["text"] |
| Go | Table |
table.CellText(row, col) |
| C# | Table |
table.CellText(row, col) |
| Node.js | интерфейс Table |
table.cells[row][col] |
Каждая ячейка несёт текст плюс bounding box — это позволяет соотнести результат извлечения с координатами на странице.
Миграция с doc.extract_*(page_index)
Старый способ (по-прежнему поддерживается):
doc = PdfDocument("paper.pdf")
for i in range(doc.page_count()):
print(doc.extract_text(i))
print(doc.to_markdown(i, detect_headings=True))
print(doc.extract_tables(i))
Новый способ (начиная с v0.3.34):
with PdfDocument("paper.pdf") as doc:
for page in doc:
print(page.text)
print(page.markdown(detect_headings=True))
print(page.tables)
Оба стиля остаются рабочими. Стиль Page читается лучше в постраничных пайплайнах и избавляет от постоянного учёта индексов.
Смежные страницы
- Справочник Python API
- Справочник Rust API
- Справочник Node.js API
- Справочник Go API
- Справочник C# API
- Извлечение текста — базовые методы извлечения
- История изменений — появление Page API в v0.3.34