বিষয়ে যান

ZPL রেন্ডারিং API: HTTP এর মাধ্যমে ZPL কে 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 আউটপুটের সাথে এটি বাদ দিন প্রতিটি লেবেল পেতে, পৃষ্ঠা প্রতি একটি।
zplGET এর জন্য, URL-এ এনকোডেড ZPL। # কে %23 হিসেবে এনকোড করুন। কিছু লম্বা হলে POST ব্যবহার করুন।

POST এর সাথে, ZPL কে কাঁচা অনুরোধের শরীর হিসেবে পাঠান, অথবা file নামযুক্ত একটি মাল্টিপার্ট ফর্ম ফিল্ড হিসেবে।

এপিআই কী

একটি কী ছাড়া আপনি প্রতি আইপি ঠিকানায় ৩টি লেবেল পেয়ে থাকেন, যা চেষ্টা করার জন্য যথেষ্ট। আপনার ড্যাশবোর্ড থেকে একটি কী দিয়ে, এটি 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"

অনুরোধের হেডার

হেডারমূল্যডিফল্ট
Acceptimage/png, application/pdfPNG
X-QualityGrayscale (8-বিট, মসৃণ প্রান্ত) অথবা Bitonal (1-বিট, ছোট ফাইল)Grayscale
X-Rotation0, 90, 180, 270, ঘড়ির কাঁটার দিকে0
X-Languagezpl, 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, ^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).

প্রতিক্রিয়া এবং ত্রুটি

সফল প্রতিক্রিয়া X-Total-Count বহন করে, ZPL যে লেবেলগুলির সংখ্যা উৎপাদন করে, ^PQ কপি অন্তর্ভুক্ত। ত্রুটিগুলি ERROR: দিয়ে শুরু হওয়া সাধারণ টেক্সট।

অবস্থাঅর্থ
400একটি প্যারামিটার অবৈধ, লেবেল খুব বড়, অথবা সূচক সীমার বাইরে।
401API কী অজানা বা বাতিল করা হয়েছে।
406Accept হেডারটি একটি আউটপুট ফরম্যাটের জন্য জিজ্ঞাসা করছে যা এখনও উপলব্ধ নয়।
413বডির আকার 1 এমবি থেকে বেশি, অথবা ZPL 50টির বেশি লেবেল তৈরি করছে।
429আপনার পরিকল্পনার জন্য слишком много запросов или меток. Retry-After তে সেকেন্ড সংখ্যা অপেক্ষা করুন।
503লেবেলটি রেন্ডার করতে 10 সেকেন্ডের বেশি সময় লেগেছে, অথবা পরিষেবাটি পুর্ন। পুনরায় চেষ্টা করুন, অথবা ঘনত্ব বা আকার কমান।

ইঞ্জিনটি কী আঁকে, কী উপেক্ষা করে বা এখনও সমর্থন করে না তা 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 $29 প্রতি মাসে 100,000 লেবেল থেকে শুরু হয়।

এটি কি Labelary-র সাথে সামঞ্জস্যপূর্ণ?

হ্যাঁ: একই পথ, শিরোনাম এবং ত্রুটি। হোস্টনেম পরিবর্তন করুন এবং আপনার কী পাঠান, যেমন migration guide দেখায়।

আপনি কি আমার লেবেলগুলি রাখেন?

একটি API কী ছাড়া: লেবেলটি রেন্ডার করা হয় এবং ফেরত দেওয়া হয়। privacy page বিস্তারিত এবং সময়সীমা রয়েছে।

একটি AI সহকারী কি এটি ব্যবহার করতে পারে?

হ্যাঁ, MCP server এর মাধ্যমে: ক্লড, কার্সার এবং অন্য সহায়করা এর সাথে লেবেলগুলি রেন্ডার করতে পারে।

OpenAPI এবং Markdown

একই চুক্তিটি OpenAPI 3.1 এবং Markdown হিসাবে প্রকাশিত হয়, কোড জেনারেটর এবং কোডিং সহায়কদের জন্য।

পদক্ষেপে পদক্ষেপ গাইড: Python, Node.js, PHP, C#। Labelary থেকে স্থানান্তর: migration guide।

পুনঃপ্রতিক্রিয়া