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] also work
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)]);
}
Java
import fyi.oxide.pdf.PdfDocument;
import java.nio.file.Path;
try (PdfDocument doc = PdfDocument.open(Path.of("paper.pdf"))) {
for (int i = 0; i < doc.pageCount(); i++) {
String text = doc.extractText(i);
System.out.println(text.substring(0, Math.min(80, text.length())));
String md = doc.toMarkdown(i);
}
}
Kotlin
import fyi.oxide.pdf.PdfDocument
PdfDocument.open(java.nio.file.Path.of("paper.pdf")).use { doc ->
for (i in 0 until doc.pageCount()) {
val text = doc.extractText(i)
println(text.substring(0, minOf(80, text.length)))
val md = doc.toMarkdown(i)
}
}
Scala
import fyi.oxide.pdf.PdfDocument
import scala.util.Using
Using.resource(PdfDocument.open("paper.pdf")) { doc =>
for (i <- 0 until doc.pageCount()) {
val text = doc.extractText(i)
println(text.substring(0, math.min(80, text.length)))
val md = doc.toMarkdown(i)
}
}
Clojure
(require '[pdf-oxide.core :as pdf])
(with-open [doc (pdf/open "paper.pdf")]
(doseq [i (range (pdf/page-count doc))]
(let [text (pdf/extract-text doc i)]
(println (subs text 0 (min 80 (count text))))
(pdf/to-markdown doc i))))
Ruby
require 'pdf_oxide'
PdfOxide::PdfDocument.open('paper.pdf') do |doc|
(0...doc.page_count).each do |i|
text = doc.extract_text(i)
puts text[0, 80]
md = doc.to_markdown(i)
end
end
PHP
use PdfOxide\PdfDocument;
$doc = PdfDocument::open('paper.pdf');
for ($i = 0; $i < $doc->pageCount(); $i++) {
$text = $doc->extractText($i);
echo substr($text, 0, 80), "\n";
$md = $doc->toMarkdown($i);
}
$doc->close();
C++
#include <pdf_oxide/pdf_oxide.hpp>
auto doc = pdf_oxide::Document::open("paper.pdf");
for (int i = 0; i < doc.page_count(); i++) {
auto text = doc.extract_text(i);
std::cout << text.substr(0, 80) << "\n";
auto md = doc.to_markdown(i);
}
Swift
import PdfOxide
let doc = try Document.open("paper.pdf")
for i in 0..<(try doc.pageCount()) {
let text = try doc.extractText(i)
print(text.prefix(80))
let md = try doc.toMarkdown(i)
}
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
final doc = PdfDocument.open('paper.pdf');
for (var i = 0; i < doc.pageCount; i++) {
final text = doc.extractText(i);
print(text.substring(0, text.length < 80 ? text.length : 80));
final md = doc.toMarkdown(i);
}
doc.close();
R
library(pdfoxide)
doc <- pdf_open("paper.pdf")
for (i in 0:(pdf_page_count(doc) - 1)) {
text <- pdf_extract_text(doc, i)
cat(substr(text, 1, 80), "\n")
md <- pdf_to_markdown(doc, i)
}
Julia
using PdfOxide
doc = open_document("paper.pdf")
for i in 0:(page_count(doc) - 1)
text = extract_text(doc, i)
println(first(text, 80))
md = to_markdown(doc, i)
end
Zig
const pdf_oxide = @import("pdf_oxide");
const a = std.heap.page_allocator;
var doc = try pdf_oxide.Document.open("paper.pdf");
var i: usize = 0;
while (i < try doc.pageCount()) : (i += 1) {
const text = try doc.extractText(a, i);
std.debug.print("{s}\n", .{text[0..@min(80, text.len)]});
const md = try doc.toMarkdown(a, i);
}
Objective-C
#import "POXPdfOxide.h"
NSError *err = nil;
POXDocument *doc = [POXDocument openPath:@"paper.pdf" error:&err];
for (NSInteger i = 0; i < [doc pageCountError:&err]; i++) {
NSString *text = [doc extractText:i error:&err];
NSLog(@"%@", [text substringToIndex:MIN(80, text.length)]);
NSString *md = [doc toMarkdown:i error:&err];
}
Elixir
{:ok, doc} = PdfOxide.open("paper.pdf")
{:ok, n} = PdfOxide.page_count(doc)
for i <- 0..(n - 1) do
{:ok, text} = PdfOxide.extract_text(doc, i)
IO.puts(String.slice(text, 0, 80))
{:ok, md} = PdfOxide.to_markdown(doc, i)
end
Python — Page
遅延プロパティ方式 — コンテンツは初回アクセス時に解析され、Page にキャッシュされます。
| メンバー | 戻り値 | 説明 |
|---|---|---|
page.text |
str |
抽出テキスト(カラム認識) |
page.chars |
list[Char] |
バウンディングボックス・フォント付き文字レベルのレコード |
page.words |
list[Word] |
バウンディングボックス付き単語レベルのレコード |
page.lines |
list[TextLine] |
バウンディングボックス付きテキスト行 |
page.spans |
list[Span] |
スタイル付きスパン(フォント、サイズ、太さ) |
page.tables |
list[Table] |
構造化テーブルの行とセルのバウンディングボックス |
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] # or doc.page(0)
for word in page.words: # first access parses; subsequent calls cached
print(word.text, word.bbox)
# Scoped extraction
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); // cached
console.log(page.extractText());
const words = page.extractWords();
const tables = page.extractTables();
const md = page.toMarkdown();
PdfDocument は Symbol.iterator による for..of に対応しており、doc.page(i) と doc.pageCount() も利用できます。
以前はネイティブのみだった 6 つのメソッドが、TS レイヤーを通じて Page と PdfDocument の両方で使えるようになりました:
extractWordsextractTextLinesextractTablesextractPathsgetEmbeddedImagesocrExtractText
各メソッドには非同期バージョン(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()
// Iterate every page
all, _ := doc.Pages()
for i, p := range all {
t, _ := p.ExtractText()
fmt.Printf("page %d: %d chars\n", i, len(t))
}
Go の Page 構造体はすべてのメソッドを備えています: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]; // or doc.Pages[0] or doc.Page(0)
string text = page.ExtractText();
string md = page.ToMarkdown();
Table[] tables = page.ExtractTables();
// Async variants
string textAsync = await page.ExtractTextAsync();
string mdAsync = await page.ToMarkdownAsync();
doc.Pages は IReadOnlyList<Page> です。すべての同期メソッドには CancellationToken をサポートした async Task<T> の対応バージョンがあります。
テーブルの構造
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] |
各セルにはテキストとバウンディングボックスが含まれており、抽出結果をページ上の座標と照合できます。
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 リファレンス
- テキスト抽出 — 基盤となる抽出メソッド
- 変更履歴 — v0.3.34 Page API の導入