Convert PDFs to PDF/A or PDF/UA
curl -H "X-Api-Key: $KEY" -F files=@a.pdf -F pdfa=PDF/A-2b \ http://localhost:9027/v1/pdf/convert -o archive.pdfimport { openAsBlob } from 'node:fs';import { writeFile } from 'node:fs/promises';
const form = new FormData();form.append('files', await openAsBlob('a.pdf'), 'a.pdf');form.append('pdfa', 'PDF/A-2b');
const response = await fetch('http://localhost:9027/v1/pdf/convert', { method: 'POST', headers: { 'X-Api-Key': process.env.KEY }, body: form,});if (!response.ok) throw new Error(await response.text());await writeFile('archive.pdf', Buffer.from(await response.arrayBuffer()));import osfrom pathlib import Path
import requests
response = requests.post( "http://localhost:9027/v1/pdf/convert", headers={"X-Api-Key": os.environ["KEY"]}, files=[("files", open("a.pdf", "rb"))], data={"pdfa": "PDF/A-2b"},)response.raise_for_status()Path("archive.pdf").write_bytes(response.content)package main
import ( "bytes" "io" "log" "mime/multipart" "net/http" "os" "path/filepath")
func main() { var body bytes.Buffer form := multipart.NewWriter(&body) attach(form, "files", "a.pdf") form.WriteField("pdfa", "PDF/A-2b") form.Close()
request, err := http.NewRequest("POST", "http://localhost:9027/v1/pdf/convert", &body) if err != nil { log.Fatal(err) } request.Header.Set("X-Api-Key", os.Getenv("KEY")) request.Header.Set("Content-Type", form.FormDataContentType())
response, err := http.DefaultClient.Do(request) if err != nil { log.Fatal(err) } defer response.Body.Close() if response.StatusCode >= 300 { message, _ := io.ReadAll(response.Body) log.Fatalf("%s: %s", response.Status, message) }
out, err := os.Create("archive.pdf") if err != nil { log.Fatal(err) } defer out.Close() if _, err := io.Copy(out, response.Body); err != nil { log.Fatal(err) }}
// attach adds the file at path to the form as the named field.func attach(form *multipart.Writer, field, path string) { file, err := os.Open(path) if err != nil { log.Fatal(err) } defer file.Close() part, err := form.CreateFormFile(field, filepath.Base(path)) if err != nil { log.Fatal(err) } if _, err := io.Copy(part, file); err != nil { log.Fatal(err) }}PDFs to PDF/A or PDF/UA through LibreOffice, with the same
post-processing fields as /v1/convert.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”The multipart form /v1/convert and /v1/pdf/convert accept.
LibreOffice options (landscape, nativePageRanges,
exportFormFields, singlePageSheets, password, …) and
post-processing fields (merge, splitMode, watermarkSource,
stampSource, rotateAngle, flatten, metadata, bookmarks,
embeds, facturxXml, userPassword, …) are accepted as well.
object
Images (PNG, JPEG, GIF, SVG), stylesheets and fonts an HTML page names
by file name, as in <img src="logo.png">. Every stylesheet applies to
the whole page. Nothing is fetched from anywhere else.
One or more documents.
What turns HTML into PDF: fulgur (default), a layout engine with
no browser and no network, or libreoffice.
Example
fulgurMerge several inputs into one PDF instead of returning a ZIP.
Example
1-3,5Opens a protected input.
PDF/A level: PDF/A-1b, PDF/A-2b, PDF/A-3b, PDF/A-4.
Export as PDF/UA.
Output format. Default pdf.
Responses
Section titled “Responses”The converted PDF, or a ZIP of them
The file, as bytes.
Accepted; the result goes to the webhook
The request is wrong
The JSON body of every error response.
object
A stable, machine-readable kind.
What went wrong, for a person.
Example
{ "error": "invalid_request", "message": "unknown step 'teleport'"}An engine is unavailable or the request timed out
The JSON body of every error response.
object
A stable, machine-readable kind.
What went wrong, for a person.
Example
{ "error": "invalid_request", "message": "unknown step 'teleport'"}