Preskoči na vsebino

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}/
dpmmGostota tiska: 6dpmm, 8dpmm, 12dpmm, 24dpmm.
width, heightVelikost etikete v palcih, na primer 4x6 ali 2.25x1.25. Do 15 palcev vsak.
indexKatero nalepko upodobiti, začenši od 0. Pustite jo brez, pri PDF izhodu, da dobite vsako nalepko, eno na stran.
zplZa 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 delVrednostiPrivzeto
Acceptimage/png, application/pdfPNG
X-QualityGrayscale (8-bit, gladki robovi) ali Bitonal (1-bit, manjše datoteke)Grayscale
X-Rotation0, 90, 180, 270, v smeri urinega kazalca0
X-Languagezpl, epl, tspl, auto: tiskalni jezik telesa. Brez tega se telo brez ^ ali ~ prepozna kot EPL ali TSPL, kadar tako izgleda.zpl
X-API-KeyKljuč 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, ^PQ copies 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 429 with Retry-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:.

StanjePomen
400Parameter je neveljaven, oznaka je prevelika ali je indeks zunaj območja.
401API ključ je neznan ali bil preklican.
406Accept glava zahteva izhodno obliko, ki še ni na voljo.
413Telo je večje od 1 MB ali ZPL ustvari več kot 50 etiket.
429Preveč zahtevkov ali etiket za vaš načrt. Počakajte število sekund v Retry-After.
503Etiketi 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.

Povratne informacije