ZPL renderirni API: ZPL v PNG in PDF preko HTTP
En konec obdeluje ZPL v PNG ali PDF. Združljiv je z Labelaryjevo v1 API: iste poti, glave in napake.
Izriši nalepko
GET https://api.openzpl.com/v1/printers/{dpmm}/labels/{width}x{height}/{index}/{zpl}
POST https://api.openzpl.com/v1/printers/{dpmm}/labels/{width}x{height}/{index}
POST https://api.openzpl.com/v1/printers/{dpmm}/labels/{width}x{height}/
dpmm | Gostota tiska: 6dpmm, 8dpmm, 12dpmm, 24dpmm. |
width, height | Velikost etikete v palcih, na primer 4x6 ali 2.25x1.25. Do 15 palcev vsak. |
index | Katero nalepko upodobiti, začenši od 0. Pustite jo brez, pri PDF izhodu, da dobite vsako nalepko, eno na stran. |
zpl | Za GET, URL-encoded ZPL. Kodirajte # kot %23. Uporabite POST za vse dolge zahteve. |
Pri POST pošlji ZPL kot suho telo zahteve, ali kot večdelno polje obrazca z imenom file.
API ključi
Brez ključa prejmete 3 oznake na dan na IP naslov, kar je dovolj za preizkus. S ključem iz vašega nadzornega panela ga pošljite v X-API-Key glavi in omejitve vašega načrta delovnega prostora se uporabljajo.
curl https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/0/ \ -H "X-API-Key: oz_live_…" --data-binary @label.zpl > label.png
Primeri
Vsak pošlje label.zpl, shrani label.pdf in prikaže sporočilo o napaki API-ja, če je kaj narobe. Za PNG zahtevajte image/png in dodajte indeks nalepke (/0/) v URL.
curl https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/ \
-H "Accept: application/pdf" \
--data-binary @label.zpl --fail-with-body -o label.pdf
import requests # pip install requests
with open("label.zpl", "rb") as f:
res = requests.post(
"https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/",
data=f.read(),
headers={"Accept": "application/pdf"},
timeout=30,
)
if not res.ok:
raise SystemExit(res.text)
with open("label.pdf", "wb") as f:
f.write(res.content)
// Node.js 18+; save as label.mjs
import { readFile, writeFile } from "node:fs/promises";
const res = await fetch("https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/", {
method: "POST",
headers: { Accept: "application/pdf" },
body: await readFile("label.zpl"),
});
if (!res.ok) throw new Error(await res.text());
await writeFile("label.pdf", Buffer.from(await res.arrayBuffer()));
<?php
$ch = curl_init("https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => file_get_contents("label.zpl"),
CURLOPT_HTTPHEADER => ["Accept: application/pdf"],
CURLOPT_RETURNTRANSFER => true,
]);
$pdf = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) !== 200) {
exit($pdf);
}
file_put_contents("label.pdf", $pdf);
using var http = new HttpClient();
var req = new HttpRequestMessage(HttpMethod.Post,
"https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/")
{
Content = new StringContent(File.ReadAllText("label.zpl")),
};
req.Headers.Add("Accept", "application/pdf");
var res = await http.SendAsync(req);
if (!res.IsSuccessStatusCode)
throw new Exception(await res.Content.ReadAsStringAsync());
File.WriteAllBytes("label.pdf", await res.Content.ReadAsByteArrayAsync());
// Java 11+
import java.net.URI;
import java.net.http.*;
import java.nio.file.Path;
public class Label {
public static void main(String[] args) throws Exception {
var req = HttpRequest.newBuilder(
URI.create("https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/"))
.header("Accept", "application/pdf")
.POST(HttpRequest.BodyPublishers.ofFile(Path.of("label.zpl")))
.build();
var res = HttpClient.newHttpClient()
.send(req, HttpResponse.BodyHandlers.ofByteArray());
if (res.statusCode() != 200)
throw new RuntimeException(new String(res.body()));
java.nio.file.Files.write(Path.of("label.pdf"), res.body());
}
}
package main
import (
"io"
"log"
"net/http"
"os"
)
func main() {
zpl, err := os.Open("label.zpl")
if err != nil {
log.Fatal(err)
}
req, _ := http.NewRequest("POST", "https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/", zpl)
req.Header.Set("Accept", "application/pdf")
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
if res.StatusCode != 200 {
log.Fatal(string(body))
}
os.WriteFile("label.pdf", body, 0o644)
}
require "net/http"
uri = URI("https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/")
res = Net::HTTP.post(uri, File.binread("label.zpl"), "Accept" => "application/pdf")
abort res.body unless res.is_a?(Net::HTTPSuccess)
File.binwrite("label.pdf", res.body)
Invoke-WebRequest -Method Post `
-Uri "https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/" `
-Headers @{ Accept = "application/pdf" } `
-InFile "label.zpl" -OutFile "label.pdf"
Glave zahtev
| Zgornji del | Vrednosti | Privzeto |
|---|---|---|
Accept | image/png, application/pdf | PNG |
X-Quality | Grayscale (8-bit, gladki robovi) ali Bitonal (1-bit, manjše datoteke) | Grayscale |
X-Rotation | 0, 90, 180, 270, v smeri urinega kazalca | 0 |
X-Language | zpl, epl, tspl, auto: tiskalni jezik telesa. Brez tega se telo brez ^ ali ~ prepozna kot EPL ali TSPL, kadar tako izgleda. | zpl |
X-API-Key | Ključ vašega delovnega prostora, neobvezno | — |
Omejitve
- Without a key: 3 requests per second and 3 labels per UTC day, per IP address. With a free key from the dashboard: 20 labels per UTC day.
- Labels, not requests, count against the allowance (per UTC day on Free, per UTC calendar month on paid plans): every label rendered,
^PQcopies and PDF pages included. A 10-label PDF is 1 request and 10 labels. - Every request: up to 50 labels, a 1 MB body, 15 inches per side, and 10 seconds of render time.
- Paid plans (Pro $29/month: 10 requests/s and 100,000 labels/month, Business $99/month: 20 requests/s and 1,000,000 labels/month): subscriptions, monthly or yearly, from the dashboard's Billing page (card, through Stripe), and you can cancel at any time. The workspace's API keys move to the plan's limits as soon as the payment is approved.
- Over a limit the API answers
429withRetry-After(seconds) and a body that names the limit, e.g.ERROR: Daily limit reached: 20 labels per UTC day on this plan (^PQ copies and PDF pages count).
Odgovori in napake
Uspešni odgovori prenašajo X-Total-Count, število nalepk, ki jih ZPL proizvede, ^PQ kopij vključeno. Napake so naveden besedilovi, ki se začnejo z ERROR:.
| Stanje | Pomen |
|---|---|
| 400 | Parameter je neveljaven, oznaka je prevelika ali je indeks zunaj območja. |
| 401 | API ključ je neznan ali bil preklican. |
| 406 | Accept glava zahteva izhodno obliko, ki še ni na voljo. |
| 413 | Telo je večje od 1 MB ali ZPL ustvari več kot 50 etiket. |
| 429 | Preveč zahtevkov ali etiket za vaš načrt. Počakajte število sekund v Retry-After. |
| 503 | Etiketi je trajalo več kot 10 sekund, da se je izrisala, ali je storitev dosegla kapaciteto. Poskusite znova ali zmanjšajte gostoto ali velikost. |
Kar motor nariše, ignorira ali še ne podpira, je na the compatibility page; koliko hitro se upodablja, merjeno na proizvodnem strežniku, na the benchmarks page.
Predloge: izpolnite shranjen dizajn s svojimi podatki
Oblikujte oznako s {{variables}} rezerviranimi mesti, jo shranite in kopirajte njen ID iz nadzorne plošče: d123 za zasnovo, l45 za shranjeno oznako. Nato vaš sistem pošlje samo podatke, s ključem API.
curl https://api.openzpl.com/v1/templates/d123 \
-H "X-API-Key: oz_live_…" -H "Accept: application/pdf" \
-d '{"rows": [{"sku": "A-100"}, {"sku": "A-101"}]}' > labels.pdf
Uporabite {"data": {...}} za en etiket ali {"rows": [...]} za do 50. Accept vrne PDF ali PNG, ali text/plain napolnjen ZPL za pošiljanje tiskalniku. Vrednosti so escaped, tako da vaši podatki nikoli ne morejo začeti ZPL ukaza.
Natisnite na lokalni tiskalnik
S print agent, ki teče poleg tiskalnika, POST /v1/print-jobs postavi ZPL v vrsto in POST /v1/templates/{id}/print napolni shranjeno zasnovo. Oba vzameta ime printer in vrneta ID naloge; GET /v1/print-jobs/{id} vam pove, ali je tiskal.
Vprašanja
Koliko stane API?
Brez ključa lahko poskusite z 3 nalepkami na dan. Brezplačni ključ omogoča 20 nalepk na dan, in paid plans se začne pri $29 na mesec za 100,000 nalepk.
Ali je združljiv z Labelary?
Da: iste poti, glave in napake. Spremenite ime gostitelja in pošljite svoj ključ, kot prikazuje migration guide.
Ali hranite moje etikete?
Brez API ključa: nalepka je upodobljena in vrnjena. privacy page ima podrobnosti in roke.
Ali lahko AI asistent to uporablja?
Da, preko MCP server: Claude, Cursor in druga pomočnika lahko ustvarjajo oznake z njim.
OpenAPI in Markdown
Enaka pogodba je objavljena kot OpenAPI 3.1 in kot Markdown, za generatore kode in pomočnike pri kodiranju.
Navodila po korakih: Python, Node.js, PHP, C#. Premik iz Labelary: migration guide.