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] |
带样式的 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();
PdfDocument 通过 Symbol.iterator 支持 for..of,同时提供 doc.page(i) 和 doc.pageCount()。
此前仅在原生层可用的六个方法,现在通过 TS 层在 Page 和 PdfDocument 上都能使用:
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))
}
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]; // 或 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 参考
- 文本提取 — 底层提取方法
- 更新日志 — v0.3.34 引入 Page API