ZPL رینڈرنگ API: ZPL کو HTTP کے ذریعے PNG اور PDF میں
ایک اینڈپوائنٹ ZPL کو PNG یا PDF میں تیار کرتا ہے۔ یہ Labelary کے v1 API کے ساتھ ہم آہنگ ہے: وہی راستے، ہیڈرز اور غلطیاں۔
لیبل کو رینڈر کریں
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 | پرنٹ کثافت: 6dpmm, 8dpmm, 12dpmm, 24dpmm. |
width, height | لیبل کا سائز انچ میں، مثلاً 4x6 یا 2.25x1.25۔ ہر ایک کا زیادہ سے زیادہ سائز 15 انچ۔ |
index | کون سا لیبل رینڈر کرنا ہے، 0 سے شروع کرتے ہوئے۔ PDF آؤٹ پٹ کے ساتھ اسے چھوڑ دیں تاکہ ہر لیبل، ایک ہر صفحے پر مل سکے. |
zpl | GET کے لیے، URL-encoded ZPL۔ # کو %23 کے طور پر انکوڈ کریں۔ لمبی چیزوں کے لیے POST استعمال کریں۔ |
POST کے ساتھ، ZPL کو خام درخواست باڈی کے طور پر بھیجیں، یا ایک ملٹیپارٹ فارم فیلڈ کے طور پر جس کا نام file ہو.
API چابیاں
بغیر کلید کے آپ کو ہر آئی پی ایڈریس پر روزانہ 3 لیبلز ملتے ہیں، جو اسے آزمانے کے لیے کافی ہیں۔ اپنے ڈیش بورڈ سے کلید کے ساتھ، اسے X-API-Key ہیڈر میں بھیجیں اور آپ کی ورک اسپیس کے منصوبے کی حدود نافذ ہوں گی۔
curl https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/0/ \ -H "X-API-Key: oz_live_…" --data-binary @label.zpl > label.png
مثالیں
ہر ایک label.zpl بھیجتا ہے، label.pdf محفوظ کرتا ہے اور اگر کچھ غلط ہو تو API کا خطا پیغام دکھاتا ہے۔ PNG کے لئے، image/png کی درخواست کریں اور URL میں لیبل کا انڈیکس (/0/) شامل کریں۔
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"
درخواست ہیڈرز
| ہیڈر | قدریں | ڈیفالٹ |
|---|---|---|
Accept | image/png, application/pdf | PNG |
X-Quality | Grayscale (8-bit، ہموار کنارے) یا Bitonal (1-bit، چھوٹی فائلیں) | Grayscale |
X-Rotation | 0, 90, 180, 270, گھڑی کی سمت | 0 |
X-Language | zpl, epl, tspl, auto: جسم کی پرنٹر زبان۔ اس کے بغیر، بغیر ^ یا ~ کا جسم جب ایسا لگتا ہے تو اسے EPL یا TSPL کے طور پر پڑھا جاتا ہے۔ | zpl |
X-API-Key | آپ کی ورک اسپیس کی چابی، اختیاری | — |
حدیں
- 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).
جوابات اور غلطیاں
کامیاب جوابات X-Total-Count ، ZPL کے ذریعہ تیار کردہ لیبلز کی تعداد، ^PQ کاپیوں سمیت، لے جاتے ہیں۔ غلطیاں سادہ متن ہیں جو ERROR: سے شروع ہوتی ہیں۔
| حیثیت | معنی |
|---|---|
| 400 | ایک پیرامیٹر درست نہیں ہے، لیبل بہت بڑا ہے، یا انڈیکس حد سے باہر ہے۔ |
| 401 | API کلید نامعلوم ہے یا واپس لی گئی ہے۔ |
| 406 | Accept ہیڈر ایک آؤٹ پٹ فارمیٹ کی درخواست کرتا ہے جو ابھی دستیاب نہیں ہے۔ |
| 413 | مشمولات 1 ایم بی سے زیادہ ہیں، یا ZPL 50 سے زیادہ لیبلز بناتا ہے۔ |
| 429 | آپ کے منصوبے کے لیے بہت زیادہ درخواستیں یا لیبلز ہیں۔ Retry-After میں سیکنڈز کا انتظار کریں۔ |
| 503 | لیبل کو رینڈر کرنے میں 10 سیکنڈ سے زیادہ وقت لگا، یا سروس اپنی زیادہ سے زیادہ حد پر ہے۔ دوبارہ کوشش کریں، یا کثافت یا سائز کو کم کریں۔ |
جو چیز انجن_draws کرتا ہے، نظر انداز کرتا ہے یا ابھی سپورٹ نہیں کرتا وہ the compatibility page پر ہے؛ یہ کتنی تیزی سے رینڈر کرتا ہے، پیداواری سرور پر، the benchmarks page پر ماپا گیا.
ٹیمپلیٹس: اپنے ڈیٹا کے ساتھ محفوظ کردہ ڈیزائن کو بھریں
ایک لیبل کو {{variables}} کی جگہوں کے ساتھ ڈیزائن کریں، اسے محفوظ کریں، اور اپنے ڈیش بورڈ سے اس کی ID کاپی کریں: d123 ایک ڈیزائن کے لیے، l45 ایک محفوظ کردہ لیبل کے لیے۔ پھر آپ کا سسٹم صرف ڈیٹا بھیجتا ہے، ایک 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
ایک لیبل کے لئے {"data": {...}} استعمال کریں یا 50 تک {"rows": [...]} کے لئے۔ Accept ایک PDF یا PNG دیتا ہے، یا text/plain بھرے ہوئے ZPL کو پرنٹر کو بھیجنے کے لئے۔ قیمتیں محفوظ کی گئی ہیں، لہذا آپ کا ڈیٹا کبھی بھی ZPL کمانڈ شروع نہیں کر سکتا۔
مقامی پرنٹر پر پرنٹ کریں
جب print agent پرنٹر کے قریب چل رہا ہو، POST /v1/print-jobs اس کے لیے ZPL قطار میں لگاتا ہے اور POST /v1/templates/{id}/print ایک محفوظ ڈیزائن کو بھرتا ہے۔ دونوں ایک printer کا نام لیتے ہیں اور ایک کام ID واپس کرتے ہیں؛ GET /v1/print-jobs/{id} آپ کو بتاتا ہے کہ کیا یہ پرنٹ ہوا.
سوالات
API کی قیمت کتنی ہے؟
بغیر چابی کے آپ اسے روزانہ 3 لیبلز کے ساتھ آزما سکتے ہیں۔ ایک مفت چابی روزانہ 20 لیبلز کی اجازت دیتی ہے، اور paid plans 100,000 لیبلز کے لئے $29 ہر ماہ سے شروع ہوتا ہے۔
کیا یہ Labelary کے ساتھ ہم آہنگ ہے؟
جی ہاں: وہی راستے، ہیڈرز اور غلطیاں۔ ہوسٹ نام تبدیل کریں اور اپنی کلید بھیجیں، جیسے migration guide دکھاتا ہے۔
کیا آپ میرے لیبلز رکھیں گے؟
API کلید کے ساتھ نہیں: لیبل رینڈر کیا جاتا ہے اور واپس کیا جاتا ہے۔ privacy page کے پاس تفصیلات اور مہلتیں ہیں۔
کیا AI اسسٹنٹ اسے استعمال کر سکتا ہے؟
جی ہاں، MCP server کے ذریعے: Claude، Cursor اور دیگر مددگار اس کے ساتھ لیبلز رینڈر کر سکتے ہیں۔
OpenAPI اور مارک ڈاؤن
اسی معاہدے کو OpenAPI 3.1 اور Markdown کے طور پر شائع کیا گیا ہے، کوڈ جنریٹرز اور کوڈنگ معاونین کے لیے۔
گام بہ گام رہنما: Python، Node.js، PHP، C#۔ Labelary سے منتقل ہونا: migration guide۔