{"id":48540170,"url":"https://github.com/panoramicdata/panoramicdata.render","last_synced_at":"2026-04-08T04:01:54.869Z","repository":{"id":349360858,"uuid":"1201948306","full_name":"panoramicdata/PanoramicData.Render","owner":"panoramicdata","description":"A render engine","archived":false,"fork":false,"pushed_at":"2026-04-05T14:05:45.000Z","size":101,"stargazers_count":0,"open_issues_count":12,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-05T16:09:21.456Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"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/panoramicdata.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"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}},"created_at":"2026-04-05T11:39:00.000Z","updated_at":"2026-04-05T14:05:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/panoramicdata/PanoramicData.Render","commit_stats":null,"previous_names":["panoramicdata/panoramicdata.render"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/panoramicdata/PanoramicData.Render","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FPanoramicData.Render","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FPanoramicData.Render/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FPanoramicData.Render/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FPanoramicData.Render/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/panoramicdata","download_url":"https://codeload.github.com/panoramicdata/PanoramicData.Render/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panoramicdata%2FPanoramicData.Render/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31539229,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"online","status_checked_at":"2026-04-08T02:00:06.127Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-04-08T04:01:51.049Z","updated_at":"2026-04-08T04:01:54.858Z","avatar_url":"https://github.com/panoramicdata.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# PanoramicData.Render\n\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/placeholder)](https://app.codacy.com/gh/panoramicdata/PanoramicData.Render/dashboard)\n[![NuGet](https://img.shields.io/nuget/v/PanoramicData.Render)](https://www.nuget.org/packages/PanoramicData.Render/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA high-fidelity rendering engine for OpenXML (DOCX) documents, producing paginated SVG and PDF output.\n\n## What It Does\n\nPanoramicData.Render is a **virtual layout engine** that reads `.docx` files and produces visually faithful SVG pages (one per document page) and PDF files. Unlike semantic converters that map document tags to HTML, this library calculates exact glyph positions, line breaks, and object anchors — acting as a layout engine comparable to a word processor's print path.\n\n## What It Is Not\n\n- **Not a DOCX editor.** This is read-only, one-way conversion.\n- **Not an HTML converter.** Output is SVG and PDF only; there is no HTML mapping.\n- **Not pixel-perfect.** The goal is \"visually indistinguishable at normal zoom.\" Sub-pixel identity with Microsoft Word is not claimed.\n- **Not a UI component.** This is a library that produces files/strings. Visualization is the consumer's responsibility.\n\n## Quick Start\n\n```csharp\nusing PanoramicData.Render;\n\nvar options = new RenderOptions\n{\n    FontDirectories = [\"/usr/share/fonts\", \"C:\\\\Windows\\\\Fonts\"],\n    FallbackFontFamily = \"Liberation Sans\",\n    TargetDpi = 96\n};\n\nawait using var stream = File.OpenRead(\"document.docx\");\nvar renderer = new DocxRenderer(options);\nvar result = await renderer.RenderAsync(stream);\n\n// Get SVG for each page\nfor (var i = 0; i \u003c result.Pages.Count; i++)\n{\n    var svg = result.Pages[i].ToSvg();\n    await File.WriteAllTextAsync($\"page-{i + 1}.svg\", svg);\n}\n\n// Or export as a single PDF\nawait using var pdfStream = File.Create(\"output.pdf\");\nawait result.ToPdfAsync(pdfStream);\n```\n\n## Key Design Decisions\n\n| Decision | Rationale |\n|---|---|\n| **SkiaSharp** for measurement \u0026 PDF | MIT-licensed, cross-platform, includes HarfBuzz for complex script shaping |\n| **Knuth-Plass** line breaking | Produces paragraph-optimal line breaks matching Word's behaviour more closely than greedy algorithms |\n| **Twips** as internal unit | Matches Word's internal precision (1/1440 inch), avoiding accumulated rounding errors |\n| **Full OOXML style cascade** | Document Defaults → Theme → Numbering → Table → Paragraph hierarchy → Character hierarchy → Toggle properties → Direct Formatting |\n\n## Supported Formats\n\n| Input | Output |\n|---|---|\n| `.docx` (OOXML) | SVG (one per page, fonts optionally embedded as WOFF2) |\n| | PDF (single file via SkiaSharp PDF backend) |\n\n`.doc` (binary format) is **not supported** and never will be. Future versions may add `.pptx` and `.xlsx` support.\n\n## Requirements\n\n- .NET 10.0+\n- Access to `.ttf` and/or `.otf` font files used in the source document (system fonts, a directory, or embedded)\n\n## Documentation\n\n- [DESIGN.md](DESIGN.md) — Architecture and technical design\n- [PLAN.md](PLAN.md) — Phased implementation roadmap\n- [docs/plans/](docs/plans/) — Detailed per-phase deliverables\n\n## License\n\n[MIT](LICENSE) — Copyright © 2026 Panoramic Data Limited\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and coding standards.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpanoramicdata%2Fpanoramicdata.render","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpanoramicdata%2Fpanoramicdata.render","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpanoramicdata%2Fpanoramicdata.render/lists"}