Alle innlegg
|Også tilgjengelig på:DEENFRESITPL

Innbygge bilder som dokumenter i PDF-er på A4-sider

Plasser bilder eller PDF-sider med MaraDocs API på en tom A4- (eller egendefinert) side. Sentrere, skalere, standardformater.

Martin Kurtz
APIPDFBildeDokumentbehandlingUtvikler
Innbygge bilder som dokumenter i PDF-er på A4-sider

Bilder eller små dokumenter må ofte plasseres på en standardside – A4, Letter eller en egendefinert størrelse – sentrert og riktig skalert. Reportlab eller lignende verktøy kan gjøre dette, men krever layout-matematikk og formatbehandling. Et API for plassering av bilder på tomme sider, som innbygger innhold på en konfigurerbar side, ville forenkle denne arbeidsflyten.

Hvorfor en egenutviklet løsning for plassering av bilder på tomme sider tar uker

De som vil bygge dette selv oppdager raskt at man må beregne skaleringen for å tilpasse innholdet innenfor siden, sentrere det og ta hensyn til ulike bildeformater. Reportlab, PyMuPDF eller PIL kan gjøre dette – men man må håndtere DPI, marger og koordinatsystemer. For PDF-er: først rendre hver side som et bilde, deretter bygge inn. Å bygge et robust API for innbygging av bilder på sider krever layout-logikk og testing.

Hvordan MaraDocs API for plassering av bilder på tomme sider løser dette på minutter

MaraDocs API støtter embed_in_blank_page i img.toPdf og img.ocrToPdf. Spesifiser sidestørrelse (f.eks. 210×297 mm for A4, eller Letter, eller en egendefinert størrelse) og posisjon (f.eks. midten). API-et tar seg av skalering, bildeformat og marger. For PDF-er: bruk pdf.toImg for å rendre til bilder, deretter img.toPdf med embed_in_blank_page. Ingen layout-matematikk, ingen DPI-konverteringer, ingen formatbehandling på egen hånd. Ett eller to API-kall og du får en korrekt formatert PDF.

Arbeidsflyt: Valider, innbygg, last ned

For bilder: valider, deretter img.toPdf med options.embed_in_blank_page – spesifiser sidestørrelse (f.eks. 210×297 mm for A4) og posisjon (f.eks. midten). For PDF-er: valider, bruk pdf.toImg for å rendre sider som bilder, deretter img.toPdf med innbyggingsalternativer. Resultatet er en PDF-handle som kan lastes ned eller sendes videre til OCR, komposisjon eller optimalisering. API-et håndterer skalering, sentrering og formatkonvertering; layout-matematikk og koordinatsystemer faller bort.

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, webvisning og tysk personvernlovgivning

De fleste dokument-API-er tvinger deg til å laste opp, behandle, laste ned og laste opp på nytt for neste steg. Med MaraDocs blir filene i workspace. Kjed sammen med OCR, komposisjon eller komprimering – PDF-handle flyter direkte til neste operasjon. Ingen ny opplasting, færre rundturer.

Hvis layout eller skalering må justeres manuelt – marger, posisjonering eller sidestørrelse – kan app.maradocs.io åpnes for manuell kontroll og justering. 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 personvernfølsomme dokumentarbeidsflyter er dette relevant.

TypeScript-kode for innbygging av bilder i PDF-sider

API-referanse: data/upload, img/validate, img/to/pdf, pdf/to/img, pdf/validate, 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 });

// Bilde: last opp, valider, bygg inn på A4, last ned
const upImg = await client.data.upload(imageFile);
const valImg = await client.img.validate({ unvalidated_file_handle: upImg.unvalidated_file_handle });
const imgHandle = okImg(valImg);

const pdf = await client.img.toPdf({
  img_handle: imgHandle,
  options: {
    embed_in_blank_page: { size: { width: 210, height: 297 }, position: "center" },
  },
});
const blob = await client.data.downloadPdf({ pdf_handle: pdf.pdf_handle });

// PDF: last opp, valider, rendre side som bilde, bygg inn, last ned
const upPdf = await client.data.upload(pdfFile);
const valPdf = await client.pdf.validate({ unvalidated_file_handle: upPdf.unvalidated_file_handle });
const imgResult = await client.pdf.toImg({
  pdf_handle: okPdf(valPdf),
  pages: [0],
});
const pdfPage = await client.img.toPdf({
  img_handle: imgResult.img_handles[0],
  options: { embed_in_blank_page: { size: { width: 210, height: 297 }, position: "center" } },
});
const blob2 = await client.data.downloadPdf({ pdf_handle: pdfPage.pdf_handle });

Python-kode for innbygging av bilder i PDF-sider

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

# pip install python-decouple requests
"""Convert an image to a PDF on A4 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"]
    result = run_job(
        "img/to/pdf",
        {
            "img_handle": img_handle,
            "options": {
                "embed_in_blank_page": {
                    "size": {"width": 210, "height": 297},
                    "position": "center",
                }
            },
        },
        auth,
    )
    pdf_handle = result.get("response", result).get("pdf_handle")
    Path("on_a4.pdf").write_bytes(download_pdf(pdf_handle, auth))
    print("on_a4.pdf created")


if __name__ == "__main__":
    main()

Oppsummering og neste steg

Et API for plassering av bilder på tomme sider for A4 og egendefinerte størrelser er tilgjengelig. MaraDocs støtter bilder direkte; for PDF-er, rendre først til bilder. Flere relaterte arbeidsflyter: Dokumentskanner, PDF-behandling, Tekstgjenkjenning og PDF-komprimering.


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.