Media-Services

Alvine Juno Dokumentation

Sie können Alvine Juno einfach und schnell ausprobieren!

Risikofrei und ohne weitere Kosten. Nehmen Sie die URL einer HTML-Rechnung oder eines anderen HTML-Dokument. Falls Sie kein Dokument zur Hand haben, nehmen Sie einfach die URL aus unserem Beispiel.

Astronaut studiert

API

Funktionsweise

Juno bietet zum Erstellen von PDF-Dokumenten eine einfache REST-API. Alle Endpunkte (URLs) erwarten einen POST-Request mit einem JSON-Dokument im Body. In dem JSON-Dokument wird, je nach Endpunkt, die notwendigen Parameter übergeben.

Unten finden Sie zu den einzelnen Endpunkten eine Beschreibung und Beispiele für die Integration von Juno in bestimmte Umgebung. Falls Sie Ihre bevorzugte Entwicklungsumgebung vermissen, so finden Sie in unserer Postman-Dokumentation viele weitere Beispiele. Mithilfe von Postman können Sie unsere API auch ganz ohne Entwicklungsumgebung testen.

Authentifizierung

Die Authentifizierung unseres Dienstes erfolgt über einen kryptografischen Schlüssel, der im Header jeder Anfrage mitgesendet werden muss. Wir verwenden für die Übertragung den Authorization-Header. Der Aufbau des Headers ist Authorization: api-key <Schlüssel>.

Ihren persönlichen Zugangsschlüssel erhalten Sie nach Zustimmung der Nutzungsbedingungen von uns. Schreiben Sie uns eine E-Mail oder kontaktieren Sie uns über unseren Chat. Sie können danach im Rahmen Ihres Freikontigents unsere Services testen.

Endpunkte

Mit dem Capture-Endpunkt /capture kann man aus einer oder mehrerer Webseiten ein PDF-Dokument erstellen, mit dem Convert-Endpunkt /convert kann ein vorhandenes Office-Dokument (Word, Excel, Powerpoint, LibreOffice, OpenOffice) in ein PDF umgewandelt werden und mit dem Create-Endpunkt /create lassen sich PDF-Dokumente über eine JSON-Spezifikation erstellen.

Alle Endpunkte erwarten einen POST-Request mit einem JSON-Dokument im Body.

Unten finden Sie zu den einzelnen Endpunkten eine Beschreibung und Beispiele für die Integration von Juno in bestimmte Umgebung. Falls Sie Ihre bevorzugte Entwicklungsumgebung vermissen, so finden Sie in unserer Postman-Dokumentation viele weitere Beispiele. Mithilfe von Postman können Sie unsere API auch ganz ohne Entwicklungsumgebung testen.

Über den Capture-Endpunkt /capture lassen sich Webseiten in PDF-Dokumente umwandeln.

Aufruf

Alle Alvine-Cloud API Endpunkte sind in Postman dokumentiert.

Sie können die API direkt ausprobieren (externe Seite):

Environment

Die einzelnen API sind in Postman mit Platzhaltern angelegt. Die Platzhalter können über die Environment-Funktion gesetzt werden.

PlatzhalterWertBeschreibung
JUNO-URLhttps://juno.alvine.cloud/Die URL des Services
curl --location --request POST 'https://juno.alvine.cloud/api/v1/capture' \
--header 'Accept: application/json' \
--header 'Authorization: api-key EVALUATION' \
--header 'Content-Type: application/json' \
--data-raw '{
    "page-size": "A4",
    "dpi": 36,
    "orientation": "Portrait",
    "pages": [
        {
            "url": "https://www.schukai.com/",
            "zoom": 1.0,
            "print-media-type": true,
            "viewport-width": "1280x1024",
            "load-media-error-handling": "abort",
            "load-error-handling": "abort",
            "encoding": "utf-8",
            "auth": {
                "base-auth": {
                    "username": "name",
                    "password": "geheim"
                }
            }
        },
        {
            "url": "https://www.schukai.com/de/verkaufen/"
        }
    ],
    "margins": {
        "top": 5,
        "left": 5,
        "right": 5,
        "bottom": 5
    },
    "operators": {
        "smart-shrinking": true,
        "grayscale": true
    }
}'
        
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "https://juno.alvine.cloud/api/v1/capture"
  method := "POST"

  payload := strings.NewReader(`{
    "page-size": "A4",
    "dpi": 36,
    "orientation": "Portrait",
    "pages": [
        {
            "url": "https://www.schukai.com/",
            "zoom": 1.0,
            "print-media-type": true,
            "viewport-width": "1280x1024",
            "load-media-error-handling": "abort",
            "load-error-handling": "abort",
            "encoding": "utf-8",
            "auth": {
                "base-auth": {
                    "username": "name",
                    "password": "geheim"
                }
            }
        },
        {
            "url": "https://www.schukai.com/de/verkaufen/"
        }
    ],
    "margins": {
        "top": 5,
        "left": 5,
        "right": 5,
        "bottom": 5
    },
    "operators": {
        "smart-shrinking": true,
        "grayscale": true
    }
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Accept", "application/json")
  req.Header.Add("Authorization", "api-key EVALUATION")
  req.Header.Add("Content-Type", "application/json")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
        
var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("Authorization", "api-key EVALUATION");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
  "page-size": "A4",
  "dpi": 36,
  "orientation": "Portrait",
  "pages": [
    {
      "url": "https://www.schukai.com/",
      "zoom": 1,
      "print-media-type": true,
      "viewport-width": "1280x1024",
      "load-media-error-handling": "abort",
      "load-error-handling": "abort",
      "encoding": "utf-8",
      "auth": {
        "base-auth": {
          "username": "name",
          "password": "geheim"
        }
      }
    },
    {
      "url": "https://www.schukai.com/de/verkaufen/"
    }
  ],
  "margins": {
    "top": 5,
    "left": 5,
    "right": 5,
    "bottom": 5
  },
  "operators": {
    "smart-shrinking": true,
    "grayscale": true
  }
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://juno.alvine.cloud/api/v1/capture", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
        
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://juno.alvine.cloud/api/v1/capture',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "page-size": "A4",
    "dpi": 36,
    "orientation": "Portrait",
    "pages": [
        {
            "url": "https://www.schukai.com/",
            "zoom": 1.0,
            "print-media-type": true,
            "viewport-width": "1280x1024",
            "load-media-error-handling": "abort",
            "load-error-handling": "abort",
            "encoding": "utf-8",
            "auth": {
                "base-auth": {
                    "username": "name",
                    "password": "geheim"
                }
            }
        },
        {
            "url": "https://www.schukai.com/de/verkaufen/"
        }
    ],
    "margins": {
        "top": 5,
        "left": 5,
        "right": 5,
        "bottom": 5
    },
    "operators": {
        "smart-shrinking": true,
        "grayscale": true
    }
}',
  CURLOPT_HTTPHEADER => array(
    'Accept: application/json',
    'Authorization: api-key EVALUATION',
    'Content-Type: application/json'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

        
Antwort

Als Antwort auf eine Anfrage erhalten Sie im Erfolgsfall den Status-Code 200, den Header ContentType: application/pdf und im Body die Binärdaten des PDF-Dokuments.

Im Fehlerfall erhalten Sie einen Status-Code größer gleich 400, den Header ContentType: application/json und im Body ein JSON-Dokument mit weiteren Informationen zum Fehler.

Beispiel

In dem folgenden Beispiel werden die beiden HTML-Seiten https://www.schukai.com/ und https://www.schukai.com/de/verkaufen/ in ein DIN-A4 PDF gedruckt.

    
{
    "page-size": "A4",
    "dpi": 36,
    "orientation": "Portrait",
    "pages": [
        {
            "url": "https://www.schukai.com/",
            "zoom": 1.0,
            "print-media-type": true,
            "viewport-width": "1280x1024",
            "load-media-error-handling": "abort",
            "load-error-handling": "abort",
            "encoding": "utf-8",
            "auth": {
                "base-auth": {
                    "username": "name",
                    "password": "geheim"
                }
            }
        },
        {
            "url": "https://www.schukai.com/de/verkaufen/"
        }
    ],
    "margins": {
        "top": 5,
        "left": 5,
        "right": 5,
        "bottom": 5
    },
    "operators": {
        "smart-shrinking": true,
        "grayscale": true
    }
}    
    
Optionen

Nachfolgende finden Sie alle Optionen in der Übersicht.

FeldBeschreibungTypeGültige WertePflichtfeldStandard
pages.urlURL auf die gewünschte Webseite. Javascript wird während der Testphase nicht unterstützt.StringJa
page-size Größe der SeiteStringA4, A5, ...NeinA4
orientationAusrichtung auf Querformat (Landscape) oder Hochformat (Portrait)StringLandscape, PortraitNeinPortrait
dpiÄndert die DPIInteger1...Nein36
pages.zoomZoomfaktorFloat0.1...Nein1.0
pages.print-media-typeMediaquery @print anwendenBoolean true, falseNeintrue
pages.viewport-widthSetzt die Viewport-GrößeStringNein1280x1024
pages.load-media-error-handlingAbbruch (abort) oder ignorieren (ignore), wenn Bilder oder CSS fehlenStringabort, ignoreNeinabort
pages.load-error-handlingAbbruch (abort) oder ignorieren (ignore), wenn die Url nicht gefunden wirdString abort, ignoreNeinabort
pages.encodingStandard-EncodingStringutf-8, is-8859-1, ...Neinutf-8
pages.auth.header.type
pages.auth.header.credential
Anmeldung mit Authorization-Header
Typ ist meist basic oder baerer (weitere Typen siehe http-authschemes ) und Passwort
StringNein
pages.auth.base-auth.username
pages.auth.base-auth.password
Anmeldung mit Base-Auth
Benutzername und Passwort
StringNein
pages.auth.cookie.name
pages.auth.cookie.credential
Anmeldung mit Session-Cookie
Name des Cookies und SessionID
StringNein
margins.top
margins.bottom
margins.left
margins.right
Abstand zum RandIntegerNein5
operators.smart-shrinkingIntelligentes einpassen der Webseite in das PDF FormatBooleantrue, falseNeintrue
operators.grayscaleGraufilter anwendenBooleantrue, falseNeintrue

Über den Convert-Endpunkt /convert lassen sich Office-Dokumente (Word, Excel, Powerpoint, LibreOffice, OpenOffice) in PDF-Dokumente umwandeln.

Aufruf

Alle Alvine-Cloud API Endpunkte sind in Postman dokumentiert.

Sie können die API direkt ausprobieren (externe Seite):

Environment

Die einzelnen API sind in Postman mit Platzhaltern angelegt. Die Platzhalter können über die Environment-Funktion gesetzt werden.

PlatzhalterWertBeschreibung
JUNO-URLhttps://juno.alvine.cloud/Die URL des Services
curl --location --request POST 'https://juno.alvine.cloud/api/v1/convert' \
--header 'Accept: application/json' \
--header 'Authorization: api-key EVALUATION' \
--header 'Content-Type: application/json' \
--data-raw '{
    "url": "https://www.alvine.cloud/examples/welcome.docx"
}'
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "https://juno.alvine.cloud/api/v1/convert"
  method := "POST"

  payload := strings.NewReader(`{
    "url": "https://www.alvine.cloud/examples/welcome.docx"
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Accept", "application/json")
  req.Header.Add("Authorization", "api-key EVALUATION")
  req.Header.Add("Content-Type", "application/json")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
        
var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("Authorization", "api-key EVALUATION");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
  "url": "https://www.alvine.cloud/examples/welcome.docx"
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://juno.alvine.cloud/api/v1/convert", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
        

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://juno.alvine.cloud/api/v1/convert',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "url": "https://www.alvine.cloud/examples/welcome.docx"
}',
  CURLOPT_HTTPHEADER => array(
    'Accept: application/json',
    'Authorization: api-key EVALUATION',
    'Content-Type: application/json'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
            
            
        
Antwort

Als Antwort auf eine Anfrage erhalten Sie im Erfolgsfall den Status-Code 200, den Header ContentType: application/pdf und im Body die Binärdaten des neuen PDF-Dokuments.

Im Fehlerfall erhalten Sie einen Status-Code größer gleich 400 , den Header ContentType: application/json und im Body ein JSON-Dokument mit weiteren Informationen zum Fehler.

Beispiel

In dem folgenden Beispiel wird die URL https://www.alvine.cloud/examples/welcome.docx in ein PDF Dokument umgewandelt.

    
{
    "url": "https://www.alvine.cloud/examples/welcome.docx"
}
    
Optionen

Nachfolgende finden Sie alle Optionen in der Übersicht.

FeldBeschreibungTypeGültige WertePflichtfeldStandard
urlURL auf das umzuwandelnde Dokument.StringJa

Über den Create-Endpunkt /create lassen sich PDF-Dokumente anhand einer Spezifikation erstellen.

Aufruf

Alle Alvine-Cloud API Endpunkte sind in Postman dokumentiert.

Sie können die API direkt ausprobieren (externe Seite):

Environment

Die einzelnen API sind in Postman mit Platzhaltern angelegt. Die Platzhalter können über die Environment-Funktion gesetzt werden.

PlatzhalterWertBeschreibung
JUNO-URLhttps://juno.alvine.cloud/Die URL des Services
curl --location --request POST 'https://juno.alvine.cloud/api/v1/create' \
--header 'Accept: application/json' \
--header 'Authorization: api-key EVALUATION' \
--header 'Content-Type: application/json' \
--data-raw '{
"author": "schukai GmbH",
"title": "Demopaper",
"subject": "this is a example pdf",
"page-size": {
"unit": "mm",
"width": 291,
"height": 210
},
"fonts": [
{
"name": "RobotoX",
"url": "https://cdn.jsdelivr.net/npm/rubik-font@0.0.3/fonts/Rubik-Light.ttf",
"kerning": true
}
],
"templates": [
{
"url": "https://cdn.alvine.io/examples/alvine-cloud-website.pdf",
"page": 1,
"name": "website",
"box": "/MediaBox"
}
],
"pages": [
{
"outline": "This is a bookmark",
"objects": [
{
"type": "template",
"name": "website",
"x": 0,
"y": 0,
"width": 148
},
{
"type": "textbox",
"x1": 170,
"y1": 30,
"x2": 270,
"y2": 180,
"border": {
"color": {
"r": 255,
"g": 0,
"b": 0
}
},
"text": {
"text": "Text with Linefeed",
"valign": "top"
}
},
{
"type": "text",
"text": "Lorem ipsum dolor sit amet, consetetur\nsadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.",
"x": 180,
"y": 50,
"font": "RobotoX",
"width": 80
},
{
"type": "image",
"url": "https://alvine.io/alvine.png",
"x": 5,
"y": 5,
"width": 40,
"height": 10
}
]
}
]
}'
                
package main

import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)

func main() {

    url := "https://juno.alvine.cloud/api/v1/create"
    method := "POST"

    payload := strings.NewReader(`{
    "author": "schukai GmbH",
    "title": "Demopaper",
    "subject": "this is a example pdf",
    "page-size": {
        "unit": "mm",
        "width": 291,
        "height": 210
    },
    "fonts": [
        {
            "name": "RobotoX",
            "url": "https://cdn.jsdelivr.net/npm/rubik-font@0.0.3/fonts/Rubik-Light.ttf",
            "kerning": true
        }
    ],
    "templates": [
        {
            "url": "https://cdn.alvine.io/examples/alvine-cloud-website.pdf",
            "page": 1,
            "name": "website",
            "box": "/MediaBox"
        }
    ],
    "pages": [
        {
            "outline": "This is a bookmark",
            "objects": [
                {
                    "type": "template",
                    "name": "website",
                    "x": 0,
                    "y": 0,
                    "width": 148
                },
                {
                    "type": "textbox",
                    "x1": 170,
                    "y1": 30,
                    "x2": 270,
                    "y2": 180,
                    "border": {
                        "color": {
                            "r": 255,
                            "g": 0,
                            "b": 0
                        }
                    },
                    "text": {
                        "text": "Text with Linefeed",
                        "valign": "top"
                    }
                },
                {
                    "type": "text",
                    "text": "Lorem ipsum dolor sit amet, consetetur\nsadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.",
                    "x": 180,
                    "y": 50,
                    "font": "RobotoX",
                    "width": 80
                },
                {
                    "type": "image",
                    "url": "https://alvine.io/alvine.png",
                    "x": 5,
                    "y": 5,
                    "width": 40,
                    "height": 10
                }
            ]
        }
    ]
}`)

client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)

if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Accept", "application/json")
req.Header.Add("Authorization", "api-key EVALUATION")
req.Header.Add("Content-Type", "application/json")

res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
        
var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("Authorization", "api-key EVALUATION");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
"author": "schukai GmbH",
"title": "Demopaper",
"subject": "this is a example pdf",
"page-size": {
"unit": "mm",
"width": 291,
"height": 210
},
"fonts": [
{
"name": "RobotoX",
"url": "https://cdn.jsdelivr.net/npm/rubik-font@0.0.3/fonts/Rubik-Light.ttf",
"kerning": true
}
],
"templates": [
{
"url": "https://cdn.alvine.io/examples/alvine-cloud-website.pdf",
"page": 1,
"name": "website",
"box": "/MediaBox"
}
],
"pages": [
{
"outline": "This is a bookmark",
"objects": [
{
"type": "template",
"name": "website",
"x": 0,
"y": 0,
"width": 148
},
{
"type": "textbox",
"x1": 170,
"y1": 30,
"x2": 270,
"y2": 180,
"border": {
"color": {
"r": 255,
"g": 0,
"b": 0
}
},
"text": {
"text": "Text with Linefeed",
"valign": "top"
}
},
{
"type": "text",
"text": "Lorem ipsum dolor sit amet, consetetur\nsadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.",
"x": 180,
"y": 50,
"font": "RobotoX",
"width": 80
},
{
"type": "image",
"url": "https://alvine.io/alvine.png",
"x": 5,
"y": 5,
"width": 40,
"height": 10
}
]
}
]
});

var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};

fetch("https://juno.alvine.cloud/api/v1/create", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
        
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://juno.alvine.cloud/api/v1/create',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "author": "schukai GmbH",
    "title": "Demopaper",
    "subject": "this is a example pdf",
    "page-size": {
        "unit": "mm",
        "width": 291,
        "height": 210
    },
    "fonts": [
        {
            "name": "RobotoX",
            "url": "https://cdn.jsdelivr.net/npm/rubik-font@0.0.3/fonts/Rubik-Light.ttf",
            "kerning": true
        }
    ],
    "templates": [
        {
            "url": "https://cdn.alvine.io/examples/alvine-cloud-website.pdf",
            "page": 1,
            "name": "website",
            "box": "/MediaBox"
        }
    ],
    "pages": [
        {
            "outline": "This is a bookmark",
            "objects": [
                {
                    "type": "template",
                    "name": "website",
                    "x": 0,
                    "y": 0,
                    "width": 148
                },
                {
                    "type": "textbox",
                    "x1": 170,
                    "y1": 30,
                    "x2": 270,
                    "y2": 180,
                    "border": {
                        "color": {
                            "r": 255,
                            "g": 0,
                            "b": 0
                        }
                    },
                    "text": {
                        "text": "Text with Linefeed",
                        "valign": "top"
                    }
                },
                {
                    "type": "text",
                    "text": "Lorem ipsum dolor sit amet, consetetur\\nsadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.",
                    "x": 180,
                    "y": 50,
                    "font": "RobotoX",
                    "width": 80
                },
                {
                    "type": "image",
                    "url": "https://alvine.io/alvine.png",
                    "x": 5,
                    "y": 5,
                    "width": 40,
                    "height": 10
                }
            ]
        }
    ]
}',
  CURLOPT_HTTPHEADER => array(
    'Accept: application/json',
    'Authorization: api-key EVALUATION',
    'Content-Type: application/json'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

        
Antwort

Als Antwort auf eine Anfrage erhalten Sie im Erfolgsfall den Status-Code 200, den Header ContentType: application/pdf und im Body die Binärdaten des PDF-Dokuments.

Im Fehlerfall erhalten Sie einen Status-Code größer gleich 400 , den Header ContentType: application/json und im Body ein JSON-Dokument mit weiteren Informationen zum Fehler.

Beispiel

In dem folgenden Beispiel wird ein A4 PDF-Dokument mit dem Zeichensatz Rubik Light, einem Astronauten und dem Schriftzug Alvine Cloud erstellt.

{
    "author": "schukai GmbH",
    "title": "Demopaper",
    "subject": "this is a example pdf",
    "page-size": {
        "unit": "mm",
        "width": 210,
        "height": 291
    },
    "fonts": [
        {
            "name": "RubikLight",
            "url": "https://cdn.jsdelivr.net/npm/rubik-font@0.0.3/fonts/Rubik-Light.ttf",
            "kerning": true
        }
    ],
    "pages": [
        {
            "objects": [
                {
                    "type": "textbox",
                    "x1": 0,
                    "y1": 10,
                    "x2": 210,
                    "y2": 20,
                    "text": {
                        "text": "Alvine Cloud",
                        "valign": "top",
                        "size": 25,
                        "font": "RubikLight"
                    }
                },
                {
                    "type": "image",
                    "url": "https://cdn.alvine.io/examples/astronaut.png",
                    "x": 40,
                    "y": 25
                }
            ]
        }
    ]
}       
        
Passwortschutz

Ein Passwortschutz kann über folgende Struktur angelegt werden. In dem Beispiel kann nach der Eingabe des User-Passwortes 23456 das PDF geöffnet und bearbeitet, aber nicht gedruckt werden.

   
{
    "protection": {
        "permissions": {
            "print": false,
            "copy": true,
            "modify": true,
            "annotations-forms": true
        },
        "password": {
            "owner": "12345",
            "user": "23456"
        }
    }
}
    
Templates

Andere PDF-Dokumente können als Template in eine Seite integriert werden. So kann man zum Beispiel ein Rechnungsdokument mit Logo, Adresse und Footer erstellen und auf einer Seite importieren. Die Positionen werden dann über Textboxen ausgefüllt. Die PDF-Templates werden, wie andere Objekte auch, über den object -Schlüssel in die Seite integriert. Templates müssen aber auf oberster Ebene registriert werden.

   
{
    "templates": [
        {
            "url": "https://www.example.com/paper.pdf",
            "page": 1,
            "name": "mytemplate",
            "box": "/MediaBox"
        }
    ],
    

Dieses Template kann jetzt auf allen Seiten im Abschnitt objects über den Namen, hier im Beispiel mytemplate, eingebunden werden. Detail zum Einbinden auf einer Seite siehe im Abschnitt Template.

        
{
    "type": "template",
    "name": "mytemplate",
    "x": 200,
    "width": 400
}
    
Optionen

Nachfolgende finden Sie alle Optionen in der Übersicht.

FeldBeschreibungTypeGültige WertePflichtfeldStandard
pages.titleTitel des Dokumentsstringnein
pages.subjectThema des Dokumentsstring nein
pages.authorAutor des PDFstringnein
pages-size.inutEinheitstringmm, ptneinmm
pages-size.widthBreite des Dokuments in der angegebenen Einheitfloatnein210
pages-size.heightHöhe des Dokuments in der angegebenen Einheitfloatnein297
font.name Name des TTF-Fonts, über den Namen kann der Font einem Textblock zugeordnet werdenstringja
font.urlURL der Zeichensatzdateistringja
font.kerningKerning verwendenboolneintrue
protection.permissions.print
protection.permissions.copy
protection.permissions.modify
protection.permissions.annotations-forms
Erlaubnis für den Benutzerzugang das Dokument zu drucken, zu kopieren, zu ändern und Berechtigung für Formular und Anmerkungenbooltrue/falseneinfalse
protection.password.owner
protection.password.user
Haupt- und Benutzerpasswort. Das Dokument wird nur gesperrt, wenn ein Benutzerpasswort definiert wurde. Wird kein Benutzerpasswort definiert, so wird ein Zufallswert definiert.stringnein
pages.outlineBezeichnung des Lesezeichens der Seitestringnein
pages.template.urlURL eines PDF, dass als Template für die Seite verwendet werden kannstring nein
pages.template.pageSeite, die aus dem Template genommen werden sollintnein1
pages.template.nameName unter dem dieses Template registriert wirdstringja
pages.template.boxName der zu importierenden Boxstringnein/MediaBox
pages.objectsObjekte einer SeiteObjectnein
pages.objects.typeTyp eines Objektesstringoval, line, image, textnein
Objekt-Optionen

Nachfolgende werden die Optionen der einzelnen Objekte beschrieben. Angefangen mit einem einfachen Text.

    {
        "objects": [
            {
                "type": "text",
                "x": 10,
                "y": 10,
                "text": "Ein neues Buch, ein neues Jahr was werden die Tage bringen?",
                "color": {
                    "r": 0,
                    "g": 123,
                    "b": 145
                },
                "rotate": {
                    "angle": -25
                }
            }
        ]
    }

Das Ergebnis im PDF sieht folgendermaßen aus:

Text

Man kann mit dem Text-Objekt auch mehrzeiligen Text integrieren. Hierzu muss der Parameter width mitgegeben werden. Falls der Text nicht in die definierte Breite passt, so wird er umgebrochen. Im Text kann mit dem Zeichen \n ein Zeilenumbruch angegeben werden.

Die Zeilenhöhe kann mit dem Parameter line-height definiert werden.

    {
        "objects": [
            {
                "type": "text",
                "text": "Lorem ipsum dolor sit amet, consetetur\nsadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.",
                "width": 300
            }
        ]
    }

Das Ergebnis im PDF sieht folgendermaßen aus:

Text mit Zeilenumbruch
FeldBeschreibungTypeGültige WertePflichtfeldStandard
x1
y1
Koordinatenfloat ja
textAuszugebender Textstringnein
color.r
color.g
color.b
Farben der Schrift (rot, grün und blau)intnein0, 0, 0
fontName des zu Zeichensatzes, wie in der Seitendefinition festgelegt.stringnein
sizeGröße der Schriftintnein14
widthBreite des Textesfloat nein
line-heightZeilenhöhefloatnein
rotate.angleNeigung des Textes in Gradint-365 ... 365nein0

Nachfolgende werden die Optionen der einzelnen Objekte beschrieben. Angefangen mit einer einfachen Textbox.

    {
        "objects": [
            {
                "type": "textbox",
                "x1": 10,
                "y1": 10,
                "x2": 90,
                "y2": 90,
                "fill": {
                    "color": {
                        "r": 210,
                        "g": 210,
                        "b": 210
                    }
                },
                "text": {
                    "text": "Bonjour !",
                    "color": {
                        "r": 0,
                        "g": 0,
                        "b": 0
                    },
                    "align": "center",
                    "valign": "middle"
                },
                "border": {
                    "color": {
                        "r": 94,
                        "g": 0,
                        "b": 53
                    }
                }
            }
        ]
    }

Das Ergebnis im PDF sieht folgendermaßen aus:

Textbox
FeldBeschreibungTypeGültige WertePflichtfeldStandard
x1
y1
x2
y2
Koordinatenfloatja
border.widthStrichstärke des Rahmensfloatnein1
border.styleStrichtypstringsolid, dashed, dottednein1
border.color.r
border.color.g
border.color.b
Farben der Linie als RGB-Wert (rot, grün und blau)intnein0, 0, 0
fill.color.r
fill.color.g
fill.color.b
Farben der Füllung als RGB-Wert (rot, grün und blau)intnein0, 0, 0
text.textTextstringnein
text.fontZeichensatzstringnein
text.sizeSchriftgrößeintnein
text.alignAusrichtungstringleft, center, rightneincenter
text.valignAusrichtungstringtop, middle, bottom neinmiddle
text.color.r
text.color.g
text.color.b
Farben des Textes als RGB-Wert (rot, grün und blau)intnein0, 0, 0

Mit dem Typ Image kann man ein Bild in das PDF einfügen.

    {
        "objects": [
            {
                "type": "image",
                "url": "https://alvine.io/alvine.png",
                "x": 100,
                "y": 200
            }
        ]
    }

Das Ergebnis im PDF sieht folgendermaßen aus:

Alvine Logo
FeldBeschreibungTypeGültige WertePflichtfeldStandard
urlURL des Bildesurlja
x
y
Linke obere Ecke des Bildesfloatja
widthBreite des Bildesfloatnein
heightHöhe des Bildesfloatnein

Mit dem Typ Line kann man - wie der Name ja bereits verrät - eine Linie zeichnen.

    {
        "objects": [
            {
                "type": "line",
                "x1": 100,
                "y1": 100,
                "x2": 200,
                "y2": 200,
                "color": {
                    "r": 0,
                    "g": 123,
                    "b": 145
                },
                "width": 3
            }
        ]
    }

Das Ergebnis im PDF sieht folgendermaßen aus:

Linie
FeldBeschreibungTypeGültige WertePflichtfeldStandard
x1
y1
x2
y2
Koordinatenfloatja
widthStrichstärke der Liniefloatnein1
styleStrichtypstringsolid, dashed, dottednein1
color.r
color.g
color.b
Farben der Linie als RGB-Wert (rot, grün und blau)intnein0, 0, 0

Mit dem Typ Oval können wie im Beispiel Ovale und Kreise mit den entsprechenden Koordinaten gezeichnet werden.

    {
        "objects": [
            {
                "type": "oval",
                "x1": 10,
                "y1": 10,
                "x2": 90,
                "y2": 90,
                "border": {
                    "style": "dotted",
                    "color": {
                        "r": 94,
                        "g": 0,
                        "b": 53
                    }
                }
            }
        ]
    }

Das Ergebnis im PDF sieht folgendermaßen aus:

Kreise
FeldBeschreibungTypeGültige WertePflichtfeldStandard
x1
y1
x2
y2
Koordinatenfloatja
border.widthStrichstärke des Rahmensfloatnein1
border.styleStrichtypstringsolid, dashed, dottednein1
border.color.r
border.color.g
border.color.b
Farben der Linie als RGB-Wert (rot, grün und blau)intnein0, 0, 0

Mit dem Typ Polygon können Polygone mit den entsprechenden Koordinaten gezeichnet werden.

    {
        "objects": [
            {
                "type": "polygon",
                "border": {
                    "color": {
                        "r": 94,
                        "g": 0,
                        "b": 53
                    }
                },
                "fill": {
                    "color": {
                        "r": 200,
                        "g": 200,
                        "b": 200
                    }
                },
                "points": [
                    {
                        "x": 10,
                        "y": 30
                    },
                    {
                        "x": 285,
                        "y": 100
                    },
                    {
                        "x": 285,
                        "y": 150
                    }
                ]
            }
        ]
    }

Das Ergebnis im PDF sieht folgendermaßen aus:

Polygon
FeldBeschreibungTypeGültige WertePflichtfeldStandard
points.x
points.y
X/Y-Koordinaten der einzelnen Punktefloatja
border.widthStrichstärke des Rahmensfloatnein1
border.styleStrichtypstringsolid, dashed, dottednein1
border.color.r
border.color.g
border.color.b
Farben der Linie als RGB-Wert (rot, grün und blau)intnein0, 0, 0
fill.color.r
fill.color.g
fill.color.b
Farben der Füllung als RGB-Wert (rot, grün und blau)intnein0, 0, 0

Mit dem Typ Template können Seiten von PDF-Dokumenten mit den entsprechenden Koordinaten und Ausmaßen in die aktuelle Seite eingefügt werden.

Hinweis: Nicht alle PDF-Dokumente und Strukturen werden unterstützt.

            {
                "templates": [
                    {
                        "url": "https://cdn.alvine.io/examples/alvine-cloud-website.pdf",
                        "page": 1,
                        "name": "mytemplate",
                        "box": "/MediaBox"
                    }
                ]
            }
    {
        "objects": [
            {
                "type": "template",
                "name": "mytemplate",
                "x": 200,
                "y": 200,
                "width": 400,
                "height": 400
            }
        ]
    }

Das Ergebnis im PDF sieht folgendermaßen aus:

pdf
FeldBeschreibungTypeGültige WertePflichtfeldStandard
nameName des Templates aus der Definitionstringja
x
y
X/Y-Koordinaten der linken oberen Eckefloatnein0
0
width
height
Breite und Höhe des einzubettenden PDFfloatneinaus der PDF

Damit keine Fragen offen bleiben

Wir sind für Sie da und bieten Ihnen den perfekten Service. Profitieren Sie von unserer Erfahrung, innovativen Lösungen und einer Betreuung, die sich allein an Ihren Bedürfnissen orientiert.

Unsere Kontaktdaten & Chat

Wir freuen uns auf Sie.