⭐ Found this useful? Install from Packagist (
composer require nowo-tech/html-to-word-bundle) and consider starring HtmlToWordBundle on GitHub.
Symfony bundle that converts rich HTML (WYSIWYG output from TipTap, CKEditor, etc.—already rendered server-side) into a downloadable .docx using PHPWord, with:
- named YAML profiles + default profile + deep merge with per-call options, or
convertWithInlineProfile()for a full stored profile (no YAML merge); - sanitization and HTML5 parsing (masterminds/html5);
- tagged transformers for block elements (
p, headings, lists, tables, images, …); - remote & inline images — optional download of
http(s)://<img src>to temp paths before PhpWord, with cleanup after DOCXsave; - optional header/footer (logo, text, page numbers) per profile;
- Symfony-friendly export: streamed/binary responses, local path, optional Flysystem. This bundle does not render Twig, generate HTML, produce PDF, or edit existing Word files.
This bundle is FrankenPHP worker mode friendly.
Stable releases are tagged on GitHub; upgrade notes are in docs/UPGRADING.md and docs/CHANGELOG.md.
This library follows Semantic Versioning.
composer require nowo-tech/html-to-word-bundleRegister Nowo\HtmlToWordBundle\HtmlToWordBundle if Flex does not, then add config/packages/nowo_html_to_word.yaml (see Configuration).
use Nowo\HtmlToWordBundle\Converter\HtmlToWordConverterInterface;
use Nowo\HtmlToWordBundle\Export\ExporterInterface;
$doc = $converter->convert($html);
return $exporter->toStreamResponse($doc);- PHP 8.2+
- Symfony 6.4 / 7.x / 8.x (components declared in
composer.json) - Extensions:
dom,json,libxml
Use the root Makefile and docker-compose.yml:
make up
make qa
make release-checkThe PHP Docker image installs extensions required by PHPWord (including GD). Demo apps live under demo/ (see docs/DEMO-FRANKENPHP.md).
- GitHub Actions CI requirements
- Installation
- Configuration
- Usage
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
- FrankenPHP demos — how
demo/symfony8runs in Docker. - Example YAML profiles are shipped as
src/Resources/config/nowo_html_to_word.yaml(copy into your app’sconfig/packages/).
| Scope | Detail |
|---|---|
| PHPUnit | composer test — unit tests under tests/Unit, integration tests under tests/Integration (minimal Symfony kernel in tests/Fixtures/AppKernel.php). |
| PHP lines | Run composer test-coverage for the console summary, or composer coverage-check (same report written to coverage-output.txt, fails below 100% global lines). Latest reported global line coverage: 100% (PCOV; src/Engine excluded in phpunit.xml.dist; a few defensive branches are marked @codeCoverageIgnore where impractical to hit in CI). |
CI runs tests, PHPStan, and PHP-CS-Fixer on push/PR (see .github/workflows/ci.yml).
Released under the MIT License.
