{"id":25404927,"url":"https://github.com/brunoleocam/zpl2pdf","last_synced_at":"2026-05-07T15:03:06.797Z","repository":{"id":276194244,"uuid":"928520649","full_name":"brunoleocam/ZPL2PDF","owner":"brunoleocam","description":"Convert ZPL (Zebra Programming Language) labels to PDF easily and for free.","archived":false,"fork":false,"pushed_at":"2026-03-23T17:42:18.000Z","size":186444,"stargazers_count":23,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-24T15:09:18.847Z","etag":null,"topics":["cli-tool","dotnet","lab-pdf","lab2pdf","label","label-converters","labelary","pdf","zebra","zebra-printers","zpl","zpl-commands","zpl-language","zpl-pdf","zpl-preview","zpl-programming-language","zpl-render","zpl-viewer","zpl2","zpl2pdf"],"latest_commit_sha":null,"homepage":"https://github.com/brunoleocam/ZPL2PDF","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brunoleocam.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"brunoleocam","patreon":"brunoleocam","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":["https://buymeacoffee.com/brunoleocam"]}},"created_at":"2025-02-06T19:08:07.000Z","updated_at":"2026-03-24T07:36:11.000Z","dependencies_parsed_at":"2025-10-08T20:47:16.432Z","dependency_job_id":null,"html_url":"https://github.com/brunoleocam/ZPL2PDF","commit_stats":null,"previous_names":["brunoleocam/etq2pdf"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/brunoleocam/ZPL2PDF","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoleocam%2FZPL2PDF","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoleocam%2FZPL2PDF/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoleocam%2FZPL2PDF/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoleocam%2FZPL2PDF/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brunoleocam","download_url":"https://codeload.github.com/brunoleocam/ZPL2PDF/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoleocam%2FZPL2PDF/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32743074,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-07T02:14:30.463Z","status":"ssl_error","status_checked_at":"2026-05-07T02:14:29.405Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli-tool","dotnet","lab-pdf","lab2pdf","label","label-converters","labelary","pdf","zebra","zebra-printers","zpl","zpl-commands","zpl-language","zpl-pdf","zpl-preview","zpl-programming-language","zpl-render","zpl-viewer","zpl2","zpl2pdf"],"created_at":"2025-02-16T04:25:29.064Z","updated_at":"2026-05-07T15:03:06.778Z","avatar_url":"https://github.com/brunoleocam.png","language":"C#","funding_links":["https://github.com/sponsors/brunoleocam","https://patreon.com/brunoleocam","https://buymeacoffee.com/brunoleocam"],"categories":[],"sub_categories":[],"readme":"# ZPL2PDF - ZPL to PDF Converter\n\n[![Version](https://img.shields.io/badge/version-3.1.2-blue.svg)](https://github.com/brunoleocam/ZPL2PDF/releases)\n![GitHub all releases](https://img.shields.io/github/downloads/brunoleocam/ZPL2PDF/total)\n[![.NET](https://img.shields.io/badge/.NET-9.0-purple.svg)](https://dotnet.microsoft.com/download)\n[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-lightgrey.svg)](https://github.com/brunoleocam/ZPL2PDF)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Docker Hub](https://img.shields.io/badge/docker-Alpine%20470MB-blue.svg)](https://hub.docker.com/r/brunoleocam/zpl2pdf)\n[![WinGet Package](https://img.shields.io/badge/winget-brunoleocam.ZPL2PDF-blue)](https://github.com/microsoft/winget-pkgs/tree/master/manifests/b/brunoleocam/ZPL2PDF)\n\n**[English](#)** | **[Português-BR](docs/i18n/README.pt-BR.md)** | **[Español](docs/i18n/README.es-ES.md)** | **[Français](docs/i18n/README.fr-FR.md)** | **[Deutsch](docs/i18n/README.de-DE.md)** | **[Italiano](docs/i18n/README.it-IT.md)** | **[日本語](docs/i18n/README.ja-JP.md)** | **[中文](docs/i18n/README.zh-CN.md)**\n\nA powerful, cross-platform command-line tool that converts ZPL (Zebra Programming Language) files to high-quality PDF documents. Perfect for label printing workflows, automated document generation, and enterprise label management systems.\n\n![ZPL2PDF Demo](docs/Image/example_converted.png)\n\n---\n\n## 🚀 **What's New in v3.1.2**\n\n### 🔧 Changed\n\n- **Release tooling**: Scripts under `scripts/release/`; Linux packaging assets under `scripts/release/packages/` (documentation and contributor paths updated).\n- **Internals**: Single Labelary PDF fallback path in `ConversionService` across CLI, API, TCP server, and daemon; dimension/value-object consolidation and daemon PID handling without reflection.\n\n### 🛠️ Maintenance\n\n- **Installer pipeline**: More reliable cleanup in `08-build-installer.ps1`; optional `cleanup-installer-output.ps1` for `installer/Output`.\n- **Docker**: Leaner default build context via `.dockerignore`.\n- **Repo hygiene**: `.github/prompts/` and `.github/skills/` remain untracked; the rest of `.github` (workflows, templates) stays versioned.\n\n### Recent highlights (v3.1.2)\n\n- **`--stdout`**, smarter default PDF naming, BinaryKits/PDFsharp bumps, dimension validation fix, Aztec `^B0` → `^BO` preprocessing.\n- Thanks to Jacques Caruso (jacques.caruso@exhibitgroup.fr) for contributions that landed in v3.1.2.\n\n---\n\n## ✨ **Key Features**\n\n### 🎯 **Three Operation Modes**\n\n#### **Conversion Mode** - Convert individual files\n```bash\nZPL2PDF -i label.txt -o output/ -n mylabel.pdf\n```\n\n#### **Daemon Mode** - Auto-monitor folders\n```bash\nZPL2PDF start -l \"C:\\Labels\"\n```\n\n#### **TCP Server Mode** - Virtual printer\n```bash\nZPL2PDF server start --port 9101 -o output/\n```\n\n### 📐 **Intelligent Dimension Handling**\n\n- ✅ Extract dimensions from ZPL commands (`^PW`, `^LL`)\n- ✅ Support for multiple units (mm, cm, inches, points)\n- ✅ Automatic fallback to sensible defaults\n- ✅ Priority-based dimension resolution\n\n### 🌍 **Multi-Language Interface**\n\nSet your preferred language:\n```bash\n# Temporary (current session)\nZPL2PDF status --language pt-BR\n\n# Permanent (all sessions)\nZPL2PDF --set-language pt-BR\n\n# Check configuration\nZPL2PDF --show-language\n```\n\n**Supported Languages:**\n- 🇺🇸 English (en-US)\n- 🇧🇷 Português (pt-BR)\n- 🇪🇸 Español (es-ES)\n- 🇫🇷 Français (fr-FR)\n- 🇩🇪 Deutsch (de-DE)\n- 🇮🇹 Italiano (it-IT)\n- 🇯🇵 日本語 (ja-JP)\n- 🇨🇳 中文 (zh-CN)\n\n---\n\n## 📦 **Installation**\n\n### **Windows**\n\n#### Option 1: WinGet (Recommended)\n```powershell\nwinget install brunoleocam.ZPL2PDF\n```\n\n#### Option 2: Installer\n1. Download [ZPL2PDF-Setup.exe](https://github.com/brunoleocam/ZPL2PDF/releases/latest)\n2. Run installer\n3. Choose your language during installation\n4. Done! ✅\n\n### **Linux**\n\n#### Ubuntu/Debian (.deb package)\n```bash\n# Download .deb package from releases\nwget https://github.com/brunoleocam/ZPL2PDF/releases/download/v3.1.2/ZPL2PDF-v3.1.2-linux-amd64.deb\n\n# Install package\nsudo dpkg -i ZPL2PDF-v3.1.2-linux-amd64.deb\n\n# Fix dependencies if needed\nsudo apt-get install -f\n\n# Verify installation\nzpl2pdf -help\n```\n\n#### Fedora/CentOS/RHEL (.tar.gz)\n```bash\n# Download tarball from releases\nwget https://github.com/brunoleocam/ZPL2PDF/releases/download/v3.1.2/ZPL2PDF-v3.1.2-linux-x64-rpm.tar.gz\n\n# Extract to system\nsudo tar -xzf ZPL2PDF-v3.1.2-linux-x64-rpm.tar.gz -C /\n\n# Make executable\nsudo chmod +x /usr/bin/ZPL2PDF\n\n# Create symbolic link\nsudo ln -s /usr/bin/ZPL2PDF /usr/bin/zpl2pdf\n\n# Verify installation\nzpl2pdf -help\n```\n\n#### Docker (All Linux distributions)\n```bash\ndocker pull brunoleocam/zpl2pdf:latest\ndocker run -v ./watch:/app/watch -v ./output:/app/output brunoleocam/zpl2pdf:latest\n```\n\n### **macOS**\n\n#### Intel Macs\n```bash\n# Download\ncurl -L https://github.com/brunoleocam/ZPL2PDF/releases/download/v3.1.2/ZPL2PDF-v3.1.2-osx-x64.tar.gz -o zpl2pdf.tar.gz\n\n# Extract and run\ntar -xzf zpl2pdf.tar.gz\n./ZPL2PDF -help\n```\n\n#### Apple Silicon (M1/M2/M3)\n```bash\ncurl -L https://github.com/brunoleocam/ZPL2PDF/releases/download/v3.1.2/ZPL2PDF-v3.1.2-osx-arm64.tar.gz -o zpl2pdf.tar.gz\ntar -xzf zpl2pdf.tar.gz\n./ZPL2PDF -help\n```\n\n---\n\n## 🚀 **Quick Start**\n\n### **Convert a Single File**\n```bash\nZPL2PDF -i label.txt -o output_folder -n my_label.pdf\n```\n\n### **Convert with Custom Dimensions**\n```bash\nZPL2PDF -i label.txt -o output_folder -w 10 -h 5 -u cm\n```\n\n### **Convert ZPL String Directly**\n```bash\nZPL2PDF -z \"^XA^FO50,50^A0N,50,50^FDHello World^FS^XZ\" -o output_folder\n```\n\n### **Start Daemon Mode (Auto-Conversion)**\n```bash\n# Start with default settings\nZPL2PDF start\n\n# Start with custom folder\nZPL2PDF start -l \"C:\\Labels\" -w 7.5 -h 15 -u in\n\n# Check status\nZPL2PDF status\n\n# Stop daemon\nZPL2PDF stop\n```\n\n---\n\n## 📖 **Usage Guide**\n\n### **Conversion Mode Parameters**\n\n```bash\nZPL2PDF -i \u003cinput_file\u003e (-o \u003coutput_folder\u003e | --stdout) [options]\nZPL2PDF -z \u003czpl_content\u003e (-o \u003coutput_folder\u003e | --stdout) [options]\n```\n\n| Parameter | Description | Example |\n|-----------|-------------|---------|\n| `-i \u003cfile\u003e` | Input ZPL file (.txt, .prn, .zpl, .imp) | `-i label.zpl` |\n| `-z \u003ccontent\u003e` | ZPL content as string | `-z \"^XA...^XZ\"` |\n| `-o \u003cfolder\u003e` | Output folder for PDF (required unless `--stdout`) | `-o C:\\Output` |\n| `--stdout` | Write PDF bytes to stdout only (no file) | `--stdout` |\n| `-n \u003cname\u003e` | Output PDF filename (optional; default: input basename or timestamp for `-z`) | `-n result.pdf` |\n| `-w \u003cwidth\u003e` | Label width | `-w 10` |\n| `-h \u003cheight\u003e` | Label height | `-h 5` |\n| `-u \u003cunit\u003e` | Unit (mm, cm, in) | `-u cm` |\n| `-d \u003cdpi\u003e` | Print density (default: 203) | `-d 300` |\n| `--renderer` | Rendering engine (offline/labelary/auto) | `--renderer labelary` |\n| `--fonts-dir` | Custom fonts directory | `--fonts-dir C:\\Fonts` |\n| `--font` | Map specific font | `--font \"A=arial.ttf\"` |\n\n**Custom fonts (offline renderer):** ZPL font IDs (`^A0N`, `^AAN`, `^ABN`, …) are mapped to TTF/OTF files. Use `--font \"A=arial.ttf\"` to map font A; use multiple `--font` for B, 0, etc. If you set `--fonts-dir ./fonts`, relative paths in `--font` are resolved under that directory (e.g. `--font \"A=arial.ttf\"` → `./fonts/arial.ttf`). Example:\n\n```bash\nZPL2PDF -i zpl_teste.txt -o output -n label1.pdf -d 600 -w 10.0 -h 8.0 -u cm --fonts-dir ./fonts --font \"A=arial.ttf\" --font \"B=another.ttf\"\n```\n\n### **Daemon Mode Commands**\n\n```bash\nZPL2PDF start [options]    # Start daemon in background\nZPL2PDF stop               # Stop daemon\nZPL2PDF status             # Check daemon status\nZPL2PDF run [options]      # Run daemon in foreground (testing)\n```\n\n| Option | Description | Default |\n|--------|-------------|---------|\n| `-l \u003cfolder\u003e` | Folder to monitor | `Documents/ZPL2PDF Auto Converter` |\n| `-w \u003cwidth\u003e` | Fixed width for all conversions | Extract from ZPL |\n| `-h \u003cheight\u003e` | Fixed height for all conversions | Extract from ZPL |\n| `-u \u003cunit\u003e` | Unit of measurement | `mm` |\n| `-d \u003cdpi\u003e` | Print density | `203` |\n\n### **TCP Server Commands**\n\n```bash\nZPL2PDF server start [options]    # Start TCP server (virtual printer)\nZPL2PDF server stop               # Stop TCP server\nZPL2PDF server status             # Check TCP server status\n```\n\n| Option | Description | Default |\n|--------|-------------|---------|\n| `--port \u003cport\u003e` | TCP port to listen on | `9101` |\n| `-o \u003cfolder\u003e` | Output folder for PDFs | `Documents/ZPL2PDF TCP Output` |\n| `--foreground` | Run in foreground (not background) | Background |\n| `--renderer` | Rendering engine | `offline` |\n\n### **Language Commands**\n\n```bash\n--language \u003ccode\u003e           # Temporary language override\n--set-language \u003ccode\u003e       # Set language permanently\n--reset-language            # Reset to system default\n--show-language             # Show current configuration\n```\n\n---\n\n## 🎨 **Rendering Engines**\n\n### **Offline (BinaryKits)** - Default\n```bash\nZPL2PDF -i label.txt -o output/ --renderer offline\n```\n- ✅ Works without internet\n- ✅ Fast processing\n- ⚠️ Some ZPL commands may render differently\n\n### **Labelary (API)** - High Fidelity\n```bash\nZPL2PDF -i label.txt -o output/ --renderer labelary\n```\n- ✅ Exact Zebra printer emulation\n- ✅ High-fidelity rendering via Labelary (uses Labelary to generate PNGs)\n- ✅ Works for multi-label ZPL inputs\n- ⚠️ Requires internet connection\n\n### **Auto (Fallback)**\n```bash\nZPL2PDF -i label.txt -o output/ --renderer auto\n```\n- ✅ Tries Labelary first\n- ✅ Falls back to BinaryKits if offline\n\n---\n\n## 🌐 REST API\nStart the API server:\n\n```bash\nZPL2PDF --api --host localhost --port 5000\n```\n\n### Health check\n\n```bash\ncurl -s http://localhost:5000/api/health\n```\n\n```json\n{\n  \"status\": \"ok\",\n  \"service\": \"ZPL2PDF API\"\n}\n```\n\n### Convert (ZPL to PDF/PNG)\n\nEndpoint: `POST /api/convert`\n\n#### Request body\n\n```json\n{\n  \"zpl\": \"^XA...^XZ\",\n  \"zplArray\": [\"^XA...^XZ\"],\n  \"format\": \"pdf\",\n  \"width\": 7.5,\n  \"height\": 15,\n  \"unit\": \"in\",\n  \"dpi\": 203,\n  \"renderer\": \"offline\"\n}\n```\n\nNotes:\n- You must provide either `zpl` or `zplArray` (at least one non-empty ZPL string).\n- `renderer` supports `offline` (BinaryKits), `labelary` (Labelary online API), or `auto` (try Labelary then fall back).\n- If `width`/`height` are not set or are `0`, dimensions are extracted from ZPL (`^PW` / `^LL`) by default.\n\n#### Example: PDF (offline renderer)\n\n```bash\ncurl -s -X POST http://localhost:5000/api/convert -H \"Content-Type: application/json\" -d '{\n  \"zpl\": \"^XA^FO50,50^A0N,50,50^FDHello^FS^XZ\",\n  \"format\": \"pdf\",\n  \"renderer\": \"offline\",\n  \"width\": 7.5,\n  \"height\": 3,\n  \"unit\": \"in\",\n  \"dpi\": 203\n}'\n```\n\n```json\n{\n  \"success\": true,\n  \"format\": \"pdf\",\n  \"pdf\": \"JVBERi0xLjQKJc...base64...\",\n  \"pages\": 1,\n  \"message\": \"Conversion successful\"\n}\n```\n\n#### Example: PDF (Labelary renderer - direct PDF)\n\n```bash\ncurl -s -X POST http://localhost:5000/api/convert -H \"Content-Type: application/json\" -d '{\n  \"zpl\": \"^XA^FO50,50^A0N,50,50^FDHello^FS^XZ\",\n  \"format\": \"pdf\",\n  \"renderer\": \"labelary\",\n  \"width\": 7.5,\n  \"height\": 3,\n  \"unit\": \"in\",\n  \"dpi\": 203\n}'\n```\n\n```json\n{\n  \"success\": true,\n  \"format\": \"pdf\",\n  \"pdf\": \"JVBERi0xLjQKJc...base64...\",\n  \"pages\": 1,\n  \"message\": \"Conversion successful\"\n}\n```\n\n#### Example: PNG (Labelary renderer)\n\n```bash\ncurl -s -X POST http://localhost:5000/api/convert -H \"Content-Type: application/json\" -d '{\n  \"zpl\": \"^XA^FO50,50^A0N,50,50^FDHello^FS^XZ\",\n  \"format\": \"png\",\n  \"renderer\": \"labelary\",\n  \"width\": 7.5,\n  \"height\": 3,\n  \"unit\": \"in\",\n  \"dpi\": 203\n}'\n```\n\n```json\n{\n  \"success\": true,\n  \"format\": \"png\",\n  \"image\": \"iVBORw0KGgo...base64...\",\n  \"pages\": 1,\n  \"message\": \"Conversion successful\"\n}\n```\n\nIf more than one label/image is produced, the response uses `images` (array) instead of `image` (single string).\n\n---\n\n## 🐳 **Docker Usage**\n\n### **Quick Start with Docker**\n\n```bash\n# Pull image\ndocker pull brunoleocam/zpl2pdf:latest\n\n# Run daemon mode\ndocker run -d \\\n  --name zpl2pdf \\\n  -v ./watch:/app/watch \\\n  -v ./output:/app/output \\\n  -e ZPL2PDF_LANGUAGE=en-US \\\n  brunoleocam/zpl2pdf:latest\n```\n\n### **Docker Compose**\n\nCreate `docker-compose.yml`:\n\n```yaml\nversion: '3.8'\n\nservices:\n  zpl2pdf:\n    image: brunoleocam/zpl2pdf:latest\n    container_name: zpl2pdf-daemon\n    volumes:\n      - ./watch:/app/watch\n      - ./output:/app/output\n    environment:\n      - ZPL2PDF_LANGUAGE=pt-BR\n    restart: unless-stopped\n```\n\nRun:\n```bash\ndocker-compose up -d\n```\n\n📘 **Full Docker Guide:** [docs/guides/DOCKER_GUIDE.md](docs/guides/DOCKER_GUIDE.md)\n\n---\n\n## 🔧 **Configuration**\n\n### **Configuration File (`zpl2pdf.json`)**\n\nCreate a `zpl2pdf.json` file in the application directory:\n\n```json\n{\n  \"language\": \"en-US\",\n  \"defaultListenFolder\": \"C:\\\\Users\\\\user\\\\Documents\\\\ZPL2PDF Auto Converter\",\n  \"labelWidth\": 10,\n  \"labelHeight\": 5,\n  \"unit\": \"cm\",\n  \"dpi\": 203,\n  \"logLevel\": \"Info\",\n  \"retryDelay\": 2000,\n  \"maxRetries\": 3\n}\n```\n\nSee [zpl2pdf.json.example](zpl2pdf.json.example) for full configuration options.\n\n### **Environment Variables**\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `ZPL2PDF_LANGUAGE` | Application language | `pt-BR` |\n\n📘 **Language Configuration Guide:** [docs/guides/LANGUAGE_CONFIGURATION.md](docs/guides/LANGUAGE_CONFIGURATION.md)\n\n---\n\n## 📐 **ZPL Support**\n\n### **Supported ZPL Commands**\n\n- ✅ `^XA` / `^XZ` - Label start/end\n- ✅ `^PW\u003cwidth\u003e` - Print width in points\n- ✅ `^LL\u003clength\u003e` - Label length in points\n- ✅ All standard ZPL text, graphics, and barcode commands\n\n### **Dimension Extraction**\n\nZPL2PDF automatically extracts dimensions:\n\n```zpl\n^XA\n^PW800        ← Width: 800 points\n^LL1200       ← Height: 1200 points\n^FO50,50^A0N,50,50^FDHello^FS\n^XZ\n```\n\n**Conversion:** `mm = (points / 203) * 25.4`\n\n### **Priority Logic**\n\n1. ⭐ **Explicit Parameters** (`-w`, `-h`) - Highest priority\n2. ⭐⭐ **ZPL Commands** (`^PW`, `^LL`) - If no parameters\n3. ⭐⭐⭐ **Default Values** (100mm × 150mm) - Fallback\n\n---\n\n## 🏗️ **Architecture**\n\nZPL2PDF follows **Clean Architecture** principles:\n\n```\nsrc/\n├── Application/          # Use Cases \u0026 Services\n│   ├── Services/         # Business logic\n│   └── Interfaces/       # Service contracts\n├── Domain/              # Business entities \u0026 rules\n│   ├── ValueObjects/    # Value objects\n│   └── Services/        # Domain interfaces\n├── Infrastructure/      # External concerns\n│   ├── FileSystem/      # File operations\n│   ├── Rendering/       # PDF generation\n│   └── Processing/      # Queue management\n├── Presentation/        # CLI \u0026 user interface\n│   └── Handlers/        # Mode handlers\n└── Shared/             # Common utilities\n    ├── Localization/   # Multi-language\n    └── Constants/      # Configuration\n```\n\n---\n\n## 🧪 **Testing**\n\n### **Run Tests**\n\n```bash\n# All tests\ndotnet test\n\n# Unit tests only\ndotnet test tests/ZPL2PDF.Unit/\n\n# Integration tests\ndotnet test tests/ZPL2PDF.Integration/\n\n# With coverage\ndotnet test --collect:\"XPlat Code Coverage\"\n```\n\n### **Test Coverage**\n- ✅ Unit Tests: 90%+ coverage\n- ✅ Integration Tests: End-to-end workflows\n- ✅ Cross-Platform: Windows, Linux, macOS\n\n---\n\n## 📚 **Documentation**\n\n### **User Guides**\n- 📖 [Complete Documentation](docs/README.md) - Full user manual\n- 🌍 [Multi-language Configuration](docs/guides/LANGUAGE_CONFIGURATION.md)\n- 🐳 [Docker Usage Guide](docs/guides/DOCKER_GUIDE.md)\n- 📦 [Inno Setup Guide](docs/INNO_SETUP_GUIDE.md)\n\n### **Developer Guides**\n- 🛠️ [Contributing Guide](CONTRIBUTING.md)\n- 📋 [Changelog](CHANGELOG.md)\n- 🏗️ [Architecture Overview](wiki/Architecture-Overview.md)\n- 🔄 [CI/CD Workflow](docs/development/CI_CD_WORKFLOW.md)\n\n### **Build \u0026 Deployment**\n- 🔨 [Build Scripts](scripts/README.md)\n- 🐳 [Docker Publishing](docs/DOCKER_PUBLISH_GUIDE.md)\n- 📦 [Windows Installer](installer/README.md)\n\n---\n\n## 💡 **Use Cases**\n\n### **1. ERP Integration**\n```csharp\n// C# example\nProcess.Start(\"ZPL2PDF.exe\", \"-i label.txt -o output/ -w 10 -h 5 -u cm\");\n```\n\n### **2. Batch Processing**\n```bash\n# Process all ZPL files in a folder\nfor file in *.txt; do\n    ZPL2PDF -i \"$file\" -o output/\ndone\n```\n\n### **3. Automated Workflow**\n```bash\n# Start daemon on system startup\nZPL2PDF start -l \"C:\\Labels\\Incoming\"\n```\n\n### **4. Docker Deployment**\n```bash\n# Deploy to server\ndocker run -d \\\n  -v /srv/labels:/app/watch \\\n  -v /srv/pdfs:/app/output \\\n  --restart always \\\n  brunoleocam/zpl2pdf:latest\n```\n\n---\n\n## 📊 **Performance**\n\n### **Benchmarks**\n\n| Metric | Value |\n|--------|-------|\n| **Single Label** | ~50ms |\n| **Batch Processing** | 100+ labels/minute |\n| **Memory Usage** | \u003c50MB typical |\n| **PDF File Size** | ~100KB per label |\n| **Startup Time** | \u003c1 second |\n\n### **Optimization Features**\n- ✅ Async processing with configurable concurrency\n- ✅ Retry mechanisms for locked files\n- ✅ Memory-efficient image processing\n- ✅ Optimized PDF generation with compression\n\n---\n\n## 🛠️ **Development**\n\n### **Prerequisites**\n\n- .NET 9.0 SDK or later\n- Git\n- Visual Studio 2022 or VS Code\n- Docker (for cross-platform testing)\n\n### **Build from Source**\n\n```bash\n# Clone repository\ngit clone https://github.com/brunoleocam/ZPL2PDF.git\ncd ZPL2PDF\n\n# Restore dependencies\ndotnet restore\n\n# Build solution\ndotnet build\n\n# Run tests\ndotnet test\n\n# Build for your platform\ndotnet publish -c Release -r win-x64 --self-contained true\n\n# Build all platforms\n.\\scripts\\build-all-platforms.ps1  # Windows\n./scripts/build-all-platforms.sh   # Linux/macOS\n```\n\n### **Project Structure**\n\n```\nZPL2PDF/\n├── src/                    # Source code (Clean Architecture)\n├── tests/                  # Unit \u0026 integration tests\n├── docs/                   # Documentation\n│   ├── i18n/              # Translated documentation\n│   ├── Image/             # Screenshots \u0026 icons\n│   └── Sample/            # Sample ZPL files\n├── installer/              # Windows installer (Inno Setup)\n├── scripts/                # Build \u0026 release scripts\n├── .github/workflows/      # GitHub Actions CI/CD\n├── docker-compose.yml      # Docker orchestration\n└── Dockerfile              # Docker image definition\n```\n\n---\n\n## 🐛 **Troubleshooting**\n\n### **Common Issues**\n\n| Issue | Solution |\n|-------|----------|\n| **File Locked Error** | Wait for the process writing the file to complete |\n| **Invalid ZPL Content** | Ensure file contains valid ZPL commands (`^XA...^XZ`) |\n| **Permission Denied** | Run with appropriate permissions or check folder access |\n| **Docker: libgdiplus not found** | Use official image: `brunoleocam/zpl2pdf:alpine` |\n\n### **Debug Mode**\n\n```bash\n# Enable verbose logging by setting \"logLevel\": \"Debug\" in `zpl2pdf.json`\n# (then re-run your command)\nZPL2PDF -i label.txt -o output/\n```\n\n### **Get Help**\n\n- 📖 [Wiki](https://github.com/brunoleocam/ZPL2PDF/wiki)\n- 🐛 [Issues](https://github.com/brunoleocam/ZPL2PDF/issues)\n- 💬 [Discussions](https://github.com/brunoleocam/ZPL2PDF/discussions)\n\n---\n\n## 🤝 **Contributing**\n\nWe welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for details.\n\n### **Quick Start**\n\n```bash\n# 1. Fork and clone\ngit clone https://github.com/YOUR_USERNAME/ZPL2PDF.git\n\n# 2. Create feature branch\ngit checkout -b feature/amazing-feature\n\n# 3. Make changes and test\ndotnet test\n\n# 4. Commit and push\ngit commit -m \"feat: add amazing feature\"\ngit push origin feature/amazing-feature\n\n# 5. Create Pull Request\n```\n\n---\n\n## 📄 **License**\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\n## 🙏 **Acknowledgments**\n\nBuilt with amazing open-source libraries:\n\n- [BinaryKits.Zpl](https://github.com/BinaryKits/BinaryKits.Zpl) - ZPL parsing and rendering\n- [PdfSharpCore](https://github.com/empira/PdfSharpCore) - PDF generation\n- [SkiaSharp](https://github.com/mono/SkiaSharp) - Cross-platform graphics\n\n---\n\n## 📞 **Support**\n\n- 📖 **Documentation**: [Full documentation](docs/)\n- 🐛 **Bug Reports**: [GitHub Issues](https://github.com/brunoleocam/ZPL2PDF/issues)\n- 💬 **Questions**: [GitHub Discussions](https://github.com/brunoleocam/ZPL2PDF/discussions)\n- 📧 **Email**: [Contact](mailto:brunoleocam@gmail.com)\n\n---\n\n## 💝 **Support the Project**\n\nIf ZPL2PDF helps you, consider supporting its development:\n\n- ☕ [Buy Me a Coffee](https://buymeacoffee.com/brunoleocam)\n- 🎗️ [Patreon](https://patreon.com/brunoleocam)\n- 💖 [GitHub Sponsors](https://github.com/sponsors/brunoleocam)\n\nYour support helps maintain and improve ZPL2PDF for everyone!\n\n---\n\n## 🌟 **Star History**\n\nIf ZPL2PDF helps you, please ⭐ star the repository!\n\n---\n\n## 👥 **Contributors**\n\nThanks to all contributors who have helped make ZPL2PDF better!\n\nSpecial thanks to Jacques Caruso (jacques.caruso@exhibitgroup.fr) for sending the solutions for version 3.1.2.\n\n\u003ca href=\"https://github.com/brunoleocam/ZPL2PDF/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=brunoleocam/ZPL2PDF\u0026max=30\" alt=\"Contributors\" /\u003e\n\u003c/a\u003e\n\n_Image may be cached; [see full list on GitHub](https://github.com/brunoleocam/ZPL2PDF/graphs/contributors)._\n\n---\n\n**ZPL2PDF** - Convert ZPL labels to PDF easily and efficiently.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrunoleocam%2Fzpl2pdf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrunoleocam%2Fzpl2pdf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrunoleocam%2Fzpl2pdf/lists"}