Skip to content

Довідник 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-шар:

  • extractWords
  • extractTextLines
  • extractTables
  • extractPaths
  • getEmbeddedImages
  • ocrExtractText

У кожного методу є 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 читається зручніше у посторінкових пайплайнах і звільняє від ручного обліку індексу.

Пов’язані сторінки