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] 带样式的 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 层在 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>。每个同步方法都有配套的 async Task<T> 版本,支持 CancellationToken

结构化 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]

每个单元格都带有文本和 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 风格更易读,也不用再手动维护索引。

相关页面