Alle innlegg
|Også tilgjengelig på:DEENFRESITPL

OCR-API – Opprett søkbare PDF-er fra bilder og skanninger

MaraDocs OCR-API oppretter søkbare PDF-er med tekstlag. Originaldokumentet bevares – tekst er valgbar og søkbar. Ikke bare ekstrahert tekst.

Martin Kurtz
APIOCRPDFTekstgjenkjenningUtviklere
OCR-API – Opprett søkbare PDF-er fra bilder og skanninger

Skannede dokumenter og bilder inneholder tekst som verken er valgbar eller søkbar. Mange OCR-API-er returnerer bare ekstrahert tekst, ikke originaldokumentet med et usynlig tekstlag. Man ønsker samme PDF – samme layout og samme visning – men med valgbart, søkbart innhold. Det er dette en ordentlig OCR-API for søkbare PDF-er bør levere.

Hvorfor en egen søkbar PDF-OCR-løsning tar uker

De som ønsker å bygge dette selv, oppdager raskt at Tesseract, EasyOCR eller Cloud-OCR bare returnerer ren tekst og avgrensningsbokser. For å opprette en søkbar PDF må teksten vises usynlig over originalbildet eller den opprinnelige PDF-en. Dette krever koordinering av koordinatsystemer, fonter, kodinger og PDF-struktur. Ulike språk, fonter og layout øker kompleksiteten. En robust OCR-API som holder det egne dokumentet intakt krever betydelig utviklingsinnsats.

Hvordan MaraDocs OCR-API løser dette på minutter

MaraDocs API utfører OCR og returnerer en PDF med usynlig innlagt tekstlag. Man får originaldokumentet – layout, bilder, visning – med valgbar og søkbar tekst. Ingen separat tekstfil. Ingen nedstrippet versjon. Samme dokument, forbedret.

OCR-arbeidsflyt: Valider, OCR, Optimaliser

For bilder: valider, deretter img.ocrToPdf. For PDF-er: valider, deretter pdf.ocrToPdf (valgfritt etter pdf.orientation for å korrigere roterte sider på forhånd). High-level flow.ocrImg og flow.ocrPdf kombinerer orientering, OCR og optimalisering i ett kall. Output er alltid et PDF-håndtak – samme dokument med et usynlig tekstlag – som kan lastes ned eller sendes videre til komposisjon, komprimering eller e-postarbeidsflyter. Pipeline forblir på serversiden; ingen ny opplasting mellom stegene.

Get your API key in under a minute

Register for a free account and get your API key in under a minute. Of course we'll provide you with some developer credits.

Try MaraDocs API now →

Hva som skiller MaraDocs: Workspaces, Webview og tysk personvernlovgivning

De fleste dokument-API-er tvinger til opplasting, behandling, nedlasting og ny opplasting for neste steg. Med MaraDocs kjører OCR i eget workspace. Kjed sammen med dokumentekstraksjon, komposisjon eller komprimering – send PDF-håndtaket direkte til neste operasjon. Ingen ny opplasting, færre rundturer.

Når OCR-resultater må korrigeres manuelt – feilgjenkjente tegn, komplekse layout eller dårlig kvalitet på skanninger – kan app.maradocs.io åpnes for manuell gjennomgang og redigering. Brukere får full manuell kontroll når automatiseringen når sine grenser.

All behandling skjer i Tyskland (Maramia GmbH), kryptert i hvile og under overføring. Workspaces utløper etter 7 dager. Ingen data forlater EU. For personvernsensitive OCR-arbeidsbelastninger er dette relevant.

TypeScript-kode for å opprette søkbare PDF-er med OCR

API-referanse: data/upload, img/validate, pdf/validate, img/ocr/to/pdf, pdf/ocr/pdf, data/download/pdf

import { MaraDocsClient } from "@maramia/maradocs-sdk-ts";
import { okImg } from "@maramia/maradocs-sdk-ts/models/img";
import { okPdf } from "@maramia/maradocs-sdk-ts/models/pdf";

const client = new MaraDocsClient({ workspaceSecret: workspace_secret });

// High-Level: last opp, valider, fullstendig pipeline, last ned
const pdfHandle = await client.flow.ocrImg(imageFile);
const blob = await client.data.downloadPdf({ pdf_handle: pdfHandle });

// Low-Level: Bilde – last opp, valider, OCR, last ned
const uploaded = await client.data.upload(imageFile);
const validated = await client.img.validate({ unvalidated_file_handle: uploaded.unvalidated_file_handle });
const imgHandle = okImg(validated);
const ocrPdf = await client.img.ocrToPdf({
  img_handle: imgHandle,
  options: { embed_in_blank_page: { size: { width: 210, height: 297 }, position: "center" } },
});
const blob2 = await client.data.downloadPdf({ pdf_handle: ocrPdf.pdf_handle });

// PDF: last opp, valider, ocrToPdf, last ned
const pdfUploaded = await client.data.upload(pdfFile);
const pdfValidated = await client.pdf.validate({ unvalidated_file_handle: pdfUploaded.unvalidated_file_handle });
const pdfOcr = await client.pdf.ocrToPdf({ pdf_handle: okPdf(pdfValidated) });
const blob3 = await client.data.downloadPdf({ pdf_handle: pdfOcr.pdf_handle });

Python-kode for OCR til søkbar PDF

API-referanse: data/upload, img/validate, img/ocr/to/pdf, pdf/ocr/pdf, data/download/pdf

# pip install python-decouple requests
"""OCR an image to a searchable PDF using MaraDocs. Set ACCOUNT_SECRET in .env or environment."""

import sys
import time
from pathlib import Path

import requests
from decouple import config

API_URL = "https://api.maradocs.io/v1"


def create_workspace() -> dict:
    """Create a workspace and return auth headers."""
    r = requests.post(
        f"{API_URL}/workspace",
        headers={"Authorization": f"Bearer {config('ACCOUNT_SECRET')}"},
        json={"subaccount": None},
    )
    ws = r.json()
    return {"Authorization": f"Bearer {ws['workspace_secret']}"}


def upload_file(path: Path, auth: dict) -> dict:
    """Upload a file via two-step flow (signed URL + S3 POST). Returns unvalidated_file_handle."""
    data = path.read_bytes()
    resp = requests.post(
        f"{API_URL}/data/upload",
        headers={**auth, "Content-Type": "application/json"},
        json={"name": path.name, "size": len(data)},
    ).json()
    requests.post(
        resp["post_url"],
        data=resp.get("post_header", {}),
        files={"file": (path.name, data, "image/png")},
    )
    return resp["unvalidated_file_handle"]


def run_job(path: str, payload: dict, auth: dict, timeout: int = 60) -> dict:
    """Run a job and poll until complete. Returns the result (unwraps response if present)."""
    url = f"{API_URL}/{path}"
    r = requests.post(url, headers=auth, json=payload).json()
    job_id = r["job_id"]
    start = time.time()
    while time.time() - start < timeout:
        poll_r = requests.get(f"{url}/{job_id}", headers=auth)
        if poll_r.status_code == 200:
            return poll_r.json()
    raise TimeoutError(f"Job {path} timed out")


def download_pdf(pdf_handle: str, auth: dict) -> bytes:
    """Request signed URL and fetch PDF bytes."""
    r = requests.post(
        f"{API_URL}/data/download/pdf",
        headers=auth,
        json={"pdf_handle": pdf_handle},
    )
    info = r.json()
    dl = requests.get(info["url"], headers=info.get("headers", {}))
    return dl.content


def main() -> None:
    img_path = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("photo.png")
    auth = create_workspace()
    handle = upload_file(img_path, auth)
    validate = run_job("img/validate", {"unvalidated_file_handle": handle}, auth)
    img_handle = validate["response"]["img_handle"]
    ocr_result = run_job("img/ocr/to/pdf", {"img_handle": img_handle}, auth)
    pdf_handle = ocr_result.get("pdf_handle") or ocr_result.get("response", {}).get("pdf_handle")
    Path("searchable.pdf").write_bytes(download_pdf(pdf_handle, auth))
    print("searchable.pdf created")


if __name__ == "__main__":
    main()

Oppsummering og neste steg

En OCR-API som oppretter søkbare PDF-er – originaldokumentet med usynlig tekstlag – er tilgjengelig. MaraDocs bevarer det opprinnelige layout og legger til valgbar, søkbar tekst. Flere relaterte arbeidsflyter: Dokumentskanner, PDF-behandling og Bilde på blank side.


Prøv nå: MaraDocs API | TypeScript SDK


Abonner på nyhetsbrevet nå

Hold deg oppdatert og motta de siste nyhetene, artikler og ressurser via e-post.