Skip to content

Page API リファレンス

v0.3.34 から、すべてのバインディングが Page オブジェクトを公開します。抽出呼び出しごとに page_index を引き回す必要はなく、ドキュメントを反復してページ上で直接抽出メソッドを呼び出せます。型名は Python、Node.js、C#、Go で一貫して Page、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) — ID 付き 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();

PdfDocumentSymbol.iterator により for..of に対応し、doc.page(i)doc.pageCount() も使えます。

これまでネイティブ側だけだった 6 メソッドが、TS 層を通じて PagePdfDocument の両方で使えるようになりました:

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

各メソッドには async 版があります — extractTextAsynctoMarkdownAsync など。

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))
}

Go の Page 構造体はフルセットを備えます: ExtractTextToMarkdownToHtmlToPlainTextExtractWordsExtractTextLinesExtractTablesExtractCharsExtractPathsAnnotationsImagesFontsRenderPageSearch

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>。すべての同期メソッドに CancellationToken 対応の async Task<T> 版があります。

構造化 Table の形

extract_tables()PdfDocumentPage の両方で利用可能)は、言語をまたいで一貫した 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]

各セルはテキストに加えてバウンディングボックスを持つので、抽出結果をページ上の座標に紐づけられます。

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 スタイルの方が読みやすく、インデックス管理の手間が省けます。

関連ページ