Skip to content

Asynchrone PDF-Verarbeitung

PDF Oxide bietet erstklassige Async-APIs in Python, C# und Node.js, sodass die Extraktion niemals Ihre Event-Loop oder Ihren HTTP-Request-Handler blockiert. Dieselben PdfDocument-Methoden werden als Async-Wrapper bereitgestellt, die an einen Hintergrund-Thread bzw. Thread-Pool delegieren.

Python — AsyncPdfDocument

Jede Methode von PdfDocument hat ein awaitable-Gegenstück auf AsyncPdfDocument. Jeder Aufruf umschließt die synchrone Methode mit asyncio.to_thread().

Python

import asyncio
from pdf_oxide import AsyncPdfDocument

async def extract(path):
    doc = await AsyncPdfDocument.open(path)
    text = await doc.extract_text(0)
    return text

asyncio.run(extract("report.pdf"))

Fan-out über mehrere Seiten

Python

import asyncio
from pdf_oxide import AsyncPdfDocument

async def extract_all(path):
    doc = await AsyncPdfDocument.open(path)
    page_count = await doc.page_count()
    pages = await asyncio.gather(*[doc.extract_text(i) for i in range(page_count)])
    return pages

Erstellung

AsyncPdf spiegelt die Pdf-Klasse für Erstellungsabläufe:

Python

from pdf_oxide import AsyncPdf

pdf = await AsyncPdf.from_markdown("# Hello")
await pdf.save_async("out.pdf")

Office-Konvertierung

AsyncOfficeConverter übernimmt die asynchrone Konvertierung DOCX / XLSX / PPTX → PDF.

Python

from pdf_oxide import AsyncOfficeConverter

converter = AsyncOfficeConverter()
pdf_bytes = await converter.docx_to_pdf_bytes("input.docx")

Free-threaded Python (cp314t)

Das Erweiterungsmodul pdf_oxide deklariert gil_used = false und kann dadurch gefahrlos unter cp314t (free-threaded Builds von Python 3.14) verwendet werden. Mehrere Threads können PdfDocument-Methoden parallel aufrufen, ohne durch den GIL serialisiert zu werden.

Python

from concurrent.futures import ThreadPoolExecutor
from pdf_oxide import PdfDocument

doc = PdfDocument("large.pdf")

with ThreadPoolExecutor(max_workers=8) as pool:
    pages = list(pool.map(doc.extract_text, range(doc.page_count())))

C# — async Task<T> mit CancellationToken

Jede Extraktions- und Speichermethode hat eine *Async-Variante, die Task<T> zurückgibt und einen optionalen CancellationToken akzeptiert.

C#

using PdfOxide.Core;

using var doc = PdfDocument.Open("report.pdf");

string text = await doc.ExtractTextAsync(0);

using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
var tasks = Enumerable.Range(0, doc.PageCount)
    .Select(i => doc.ExtractTextAsync(i, cts.Token));
string[] pages = await Task.WhenAll(tasks);

Editor

C#

using var editor = DocumentEditor.Open("form.pdf");
editor.SetFormFieldValue("name", "Jane Doe");
await editor.SaveAsync("filled.pdf");

Node.js — *Async-Methoden

Jede synchrone Methode hat ein asynchrones Gegenstück — extractTextextractTextAsync, savesaveAsync usw. Async-Aufrufe laufen im libuv-Thread-Pool.

Node.js

const { PdfDocument } = require("pdf-oxide");

async function extractAll(path) {
  const doc = new PdfDocument(path);
  try {
    const pageCount = doc.getPageCount();
    const pages = await Promise.all(
      Array.from({ length: pageCount }, (_, i) => doc.extractTextAsync(i))
    );
    return pages;
  } finally {
    doc.close();
  }
}

Beispiel für einen HTTP-Handler

Node.js

import express from "express";
import { PdfDocument } from "pdf-oxide";

const app = express();

app.post("/extract", express.raw({ type: "application/pdf", limit: "50mb" }), async (req, res) => {
  const doc = PdfDocument.openFromBytes(req.body);
  try {
    const text = await doc.extractTextAsync(0);
    res.json({ text });
  } finally {
    doc.close();
  }
});

Nebenläufigkeitsmodell

Sprache Mechanismus
Python asyncio.to_thread delegiert den synchronen Aufruf an den Standard-Executor
Python (cp314t) Echte Thread-Parallelität — der GIL ist optional
C# Task-based Asynchronous Pattern, an den ThreadPool delegiert
Node.js libuv-Worker-Threads (Napi::AsyncWorker)
Go Nicht erforderlich — Goroutinen rufen die synchronen Methoden direkt auf
Rust Nicht bereitgestellt — verwenden Sie tokio::task::spawn_blocking oder den Executor Ihrer Wahl

Im Nebenläufigkeitsleitfaden erfahren Sie, wie Sie ein einzelnes PdfDocument über mehrere Threads hinweg gemeinsam nutzen.

Verwandte Themen