Repository files navigation

CarboneJS

npm badgenpm badgecarbone version badge
documentation badgeminizip badgedocker badgegithub fork badge

Fast, Simple and Powerful report generator in any format PDF, DOCX, XLSX, ODT, PPTX, ODS, XML, CSV...

... using your JSON data as input !

⚡️ Breaking news :

Carbone v2.0 🚀 is here :

Table of content

Features

  • Extremely simple : Use only LibreOffice™, OpenOffice™ or Microsoft Office™ to draw your report
  • Unlimited design : The limit is your document editor: pagination, headers, footers, tables...
  • Convert documents : thanks to the integrated document converter
  • Unique template engine : Insert JSON-like markers {d.companyName} directly in your document
  • Flexible : Use any XML documents as a template: docx, odt, ods, xlsx, html, pptx, odp, custom xml files...
  • Future-proof : A powerful XML-agnostic algorithm understands what to do without knowing XML document specifications
  • Multilingual : One template, multiple languages. Update translation files automatically
  • Format data : Use built-in date and number formatters or create your own in Javascript
  • Fast : Manage multiple LibreOffice threads for document conversion, optimized code generation for each report

How it works?

Carbone is a mustache-like template engine {d.companyName}.

Template language documentation : https://carbone.io/documentation.html

  • The template can be any XML-document coming from LibreOffice™ or Microsoft Office™ (ods, docx, odt, xslx...)
  • The injected data must be a JSON object or array, coming directly from your existing APIs for example

Carbone analyzes your template and inject data in the document. The generated document can be exported as is, or converted to another format (PDF, ...) using LibreOffice if it is installed on the system. Carbone is working only on the server-side.

Minimum Requirements

  • NodeJS 10.x+
  • Runs on OSX, Linux (servers and desktop), and Windows

Optional

  • LibreOffice server if you want to use the document converter and generate PDF. Without LibreOffice, you can still generate docx, xlsx, pptx, odt, ods, odp, html as long as your template is in the same format.

Getting started

Basic sample

1 - Install it

 npm install carbone

2 - Copy-paste this code in a new JS file, and execute it with node

constfs=require('fs');constcarbone=require('carbone');// Data to injectvardata={firstname : 'John',lastname : 'Doe'};// Generate a report using the sample template provided by carbone module// This LibreOffice template contains "Hello {d.firstname} {d.lastname} !"// Of course, you can create your own templates!carbone.render('./node_modules/carbone/examples/simple.odt',data,function(err,result){if(err){returnconsole.log(err);}// write the resultfs.writeFileSync('result.odt',result);});

PDF generation, document conversion

Carbone uses efficiently LibreOffice to convert documents. Among all tested solutions, it is the most reliable and stable one in production for now.

Carbone does a lot of thing for you behind the scene:

  • starts LibreOffice in "server-mode": headless, no User Interface loaded
  • manages multiple LibreOffice workers to maximize performance (configurable number of workers)
  • automatically restarts LibreOffice worker if it crashes or does not respond
  • job queue, re-try conversion three times if something bad happen
1 - install LibreOffice
on OSX
on Ubuntu Server & Ubuntu desktop

Be careful, LibreOffice which is provided by the PPA libreoffice/ppa does not bundled python (mandatory for Carbone). The best solution is to download the LibreOffice Package from the official website and install it manually:

# remove all old version of LibreOffice
sudo apt remove --purge libreoffice*
sudo apt autoremove --purge
# Download LibreOffice debian package. Select the right one (64-bit or 32-bit) for your OS.# Get the latest from http://download.documentfoundation.org/libreoffice/stable# or download the version currently "carbone-tested":
wget https://downloadarchive.documentfoundation.org/libreoffice/old/6.4.5.2/deb/x86_64/LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
# Install required dependencies on ubuntu server for LibreOffice 6.0+
sudo apt install libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6
# Uncompress package
tar -zxvf LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
cd LibreOffice_6.4.5.2_Linux_x86-64_deb/DEBS
# Install LibreOffice
sudo dpkg -i *.deb
# If you want to use Microsoft fonts in reports, you must install the fonts# Andale Mono, Arial Black, Arial, Comic Sans MS, Courier New, Georgia, Impact,# Times New Roman, Trebuchet, Verdana,Webdings)
sudo apt install ttf-mscorefonts-installer
# If you want to use special characters, such as chinese ideograms, you must install a font that support them# For example:
sudo apt install fonts-wqy-zenhei
2 - generate PDF

And now, you can use the converter, by passing options to render method.

Don't panic, only the first conversion is slow because LibreOffice must starts Once started, LibreOffice stays on to make new conversions faster

vardata={firstname : 'John',lastname : 'Doe'};varoptions={convertTo : 'pdf'//can be docx, txt, ...};carbone.render('./node_modules/carbone/examples/simple.odt',data,options,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('result.pdf',result);process.exit();// to kill automatically LibreOffice workers});

More examples

Nested repetition in a docx document and spreadsheet
vardata=[{movieName : 'Matrix',actors : [{firstname : 'Keanu',lastname : 'Reeves'},{firstname : 'Laurence',lastname : 'Fishburne'},{firstname : 'Carrie-Anne',lastname : 'Moss'}]},{movieName : 'Back To The Future',actors : [{firstname : 'Michael',lastname : 'J. Fox'},{firstname : 'Christopher',lastname : 'Lloyd'}]}];carbone.render('./node_modules/carbone/examples/movies.docx',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('movies_result.docx',result);});carbone.render('./node_modules/carbone/examples/flat_table.ods',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('flat_table_result.ods',result);});

API Reference

To check out the api reference and the documentation, visit carbone.io.

Command line tools

To checkout out the Carbone CLI documentation, visit carbone.io

Issues

If you're facing any issues, search a similar issue to ensure it doesn't already exist on Github. Otherwhise, create an issue to help us.

Roadmap

The roadmap is pinned on the github issues list.

Performance

Report generation speed (without network latency), using a basic one-page DOCX template:

  • ~ 10 ms / report without document conversion (analyzing, injection, rendering)
  • ~ 50 ms / report with a PDF conversion (100 loops, 3 LibreOffice workers, without cold-start)

On a MacBook Pro Mid-2015, 2,2 Ghz i7, 16Go.

Licenses and editions

There are two editions of Carbone:

  • Carbone Community Edition is available freely under the Apache v2 license
  • Carbone Enterprise Edition (hosted and on-premise) includes extra features like a user interface.

We want to follow the model of Gitlab. The free version must be and must stay generous.

Philosophy

Our ultimate goal

2% percent of our hosted solution revenues will go to charity in three domains: open source software we love, education and environment.

We already know that beneficiaries will be, at least ❤️

  • LibreOffice foundation
  • PostgreSQL foundation
  • An innovative child school in France

Contributors

Thanks to all Ideolys's direct contributors (random order)

  • Florian Bezagu
  • Matthieu Robin
  • Arnaud Lelièvre
  • Maxime Vincent
  • Enzo Ghemard
  • Jordan Nourry
  • Etienne Rouillard
  • Guillaume Chevaux
  • Fabien Bigant
  • Maxime Magne
  • Vincent Bertin
  • Léo Labruyère
  • Aurélien Kermabon
  • Steeve Payraudeau

Thanks to all French citizens (Crédit Impôt Recherche, Jeune Entreprise Innovante, BPI)!

About

Fast and simple report generator, from JSON to pdf, xslx, docx, odt...

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

CarboneJS

npm badgenpm badgecarbone version badge
documentation badgeminizip badgedocker badgegithub fork badge

Fast, Simple and Powerful report generator in any format PDF, DOCX, XLSX, ODT, PPTX, ODS, XML, CSV...

... using your JSON data as input !

⚡️ Breaking news :

Carbone v2.0 🚀 is here :

Table of content

Features

  • Extremely simple : Use only LibreOffice™, OpenOffice™ or Microsoft Office™ to draw your report
  • Unlimited design : The limit is your document editor: pagination, headers, footers, tables...
  • Convert documents : thanks to the integrated document converter
  • Unique template engine : Insert JSON-like markers {d.companyName} directly in your document
  • Flexible : Use any XML documents as a template: docx, odt, ods, xlsx, html, pptx, odp, custom xml files...
  • Future-proof : A powerful XML-agnostic algorithm understands what to do without knowing XML document specifications
  • Multilingual : One template, multiple languages. Update translation files automatically
  • Format data : Use built-in date and number formatters or create your own in Javascript
  • Fast : Manage multiple LibreOffice threads for document conversion, optimized code generation for each report

How it works?

Carbone is a mustache-like template engine {d.companyName}.

Template language documentation : https://carbone.io/documentation.html

  • The template can be any XML-document coming from LibreOffice™ or Microsoft Office™ (ods, docx, odt, xslx...)
  • The injected data must be a JSON object or array, coming directly from your existing APIs for example

Carbone analyzes your template and inject data in the document. The generated document can be exported as is, or converted to another format (PDF, ...) using LibreOffice if it is installed on the system. Carbone is working only on the server-side.

Minimum Requirements

  • NodeJS 10.x+
  • Runs on OSX, Linux (servers and desktop), and Windows

Optional

  • LibreOffice server if you want to use the document converter and generate PDF. Without LibreOffice, you can still generate docx, xlsx, pptx, odt, ods, odp, html as long as your template is in the same format.

Getting started

Basic sample

1 - Install it

 npm install carbone

2 - Copy-paste this code in a new JS file, and execute it with node

constfs=require('fs');constcarbone=require('carbone');// Data to injectvardata={firstname : 'John',lastname : 'Doe'};// Generate a report using the sample template provided by carbone module// This LibreOffice template contains "Hello {d.firstname} {d.lastname} !"// Of course, you can create your own templates!carbone.render('./node_modules/carbone/examples/simple.odt',data,function(err,result){if(err){returnconsole.log(err);}// write the resultfs.writeFileSync('result.odt',result);});

PDF generation, document conversion

Carbone uses efficiently LibreOffice to convert documents. Among all tested solutions, it is the most reliable and stable one in production for now.

Carbone does a lot of thing for you behind the scene:

  • starts LibreOffice in "server-mode": headless, no User Interface loaded
  • manages multiple LibreOffice workers to maximize performance (configurable number of workers)
  • automatically restarts LibreOffice worker if it crashes or does not respond
  • job queue, re-try conversion three times if something bad happen
1 - install LibreOffice
on OSX
on Ubuntu Server & Ubuntu desktop

Be careful, LibreOffice which is provided by the PPA libreoffice/ppa does not bundled python (mandatory for Carbone). The best solution is to download the LibreOffice Package from the official website and install it manually:

# remove all old version of LibreOffice
sudo apt remove --purge libreoffice*
sudo apt autoremove --purge
# Download LibreOffice debian package. Select the right one (64-bit or 32-bit) for your OS.# Get the latest from http://download.documentfoundation.org/libreoffice/stable# or download the version currently "carbone-tested":
wget https://downloadarchive.documentfoundation.org/libreoffice/old/6.4.5.2/deb/x86_64/LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
# Install required dependencies on ubuntu server for LibreOffice 6.0+
sudo apt install libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6
# Uncompress package
tar -zxvf LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
cd LibreOffice_6.4.5.2_Linux_x86-64_deb/DEBS
# Install LibreOffice
sudo dpkg -i *.deb
# If you want to use Microsoft fonts in reports, you must install the fonts# Andale Mono, Arial Black, Arial, Comic Sans MS, Courier New, Georgia, Impact,# Times New Roman, Trebuchet, Verdana,Webdings)
sudo apt install ttf-mscorefonts-installer
# If you want to use special characters, such as chinese ideograms, you must install a font that support them# For example:
sudo apt install fonts-wqy-zenhei
2 - generate PDF

And now, you can use the converter, by passing options to render method.

Don't panic, only the first conversion is slow because LibreOffice must starts Once started, LibreOffice stays on to make new conversions faster

vardata={firstname : 'John',lastname : 'Doe'};varoptions={convertTo : 'pdf'//can be docx, txt, ...};carbone.render('./node_modules/carbone/examples/simple.odt',data,options,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('result.pdf',result);process.exit();// to kill automatically LibreOffice workers});

More examples

Nested repetition in a docx document and spreadsheet
vardata=[{movieName : 'Matrix',actors : [{firstname : 'Keanu',lastname : 'Reeves'},{firstname : 'Laurence',lastname : 'Fishburne'},{firstname : 'Carrie-Anne',lastname : 'Moss'}]},{movieName : 'Back To The Future',actors : [{firstname : 'Michael',lastname : 'J. Fox'},{firstname : 'Christopher',lastname : 'Lloyd'}]}];carbone.render('./node_modules/carbone/examples/movies.docx',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('movies_result.docx',result);});carbone.render('./node_modules/carbone/examples/flat_table.ods',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('flat_table_result.ods',result);});

API Reference

To check out the api reference and the documentation, visit carbone.io.

Command line tools

To checkout out the Carbone CLI documentation, visit carbone.io

Issues

If you're facing any issues, search a similar issue to ensure it doesn't already exist on Github. Otherwhise, create an issue to help us.

Roadmap

The roadmap is pinned on the github issues list.

Performance

Report generation speed (without network latency), using a basic one-page DOCX template:

  • ~ 10 ms / report without document conversion (analyzing, injection, rendering)
  • ~ 50 ms / report with a PDF conversion (100 loops, 3 LibreOffice workers, without cold-start)

On a MacBook Pro Mid-2015, 2,2 Ghz i7, 16Go.

Licenses and editions

There are two editions of Carbone:

  • Carbone Community Edition is available freely under the Apache v2 license
  • Carbone Enterprise Edition (hosted and on-premise) includes extra features like a user interface.

We want to follow the model of Gitlab. The free version must be and must stay generous.

Philosophy

Our ultimate goal

2% percent of our hosted solution revenues will go to charity in three domains: open source software we love, education and environment.

We already know that beneficiaries will be, at least ❤️

  • LibreOffice foundation
  • PostgreSQL foundation
  • An innovative child school in France

Contributors

Thanks to all Ideolys's direct contributors (random order)

  • Florian Bezagu
  • Matthieu Robin
  • Arnaud Lelièvre
  • Maxime Vincent
  • Enzo Ghemard
  • Jordan Nourry
  • Etienne Rouillard
  • Guillaume Chevaux
  • Fabien Bigant
  • Maxime Magne
  • Vincent Bertin
  • Léo Labruyère
  • Aurélien Kermabon
  • Steeve Payraudeau

Thanks to all French citizens (Crédit Impôt Recherche, Jeune Entreprise Innovante, BPI)!

About

Fast and simple report generator, from JSON to pdf, xslx, docx, odt...

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CarboneJS

npm badgenpm badgecarbone version badge
documentation badgeminizip badgedocker badgegithub fork badge

Fast, Simple and Powerful report generator in any format PDF, DOCX, XLSX, ODT, PPTX, ODS, XML, CSV...

... using your JSON data as input !

⚡️ Breaking news :

Carbone v2.0 🚀 is here :

Table of content

Features

  • Extremely simple : Use only LibreOffice™, OpenOffice™ or Microsoft Office™ to draw your report
  • Unlimited design : The limit is your document editor: pagination, headers, footers, tables...
  • Convert documents : thanks to the integrated document converter
  • Unique template engine : Insert JSON-like markers {d.companyName} directly in your document
  • Flexible : Use any XML documents as a template: docx, odt, ods, xlsx, html, pptx, odp, custom xml files...
  • Future-proof : A powerful XML-agnostic algorithm understands what to do without knowing XML document specifications
  • Multilingual : One template, multiple languages. Update translation files automatically
  • Format data : Use built-in date and number formatters or create your own in Javascript
  • Fast : Manage multiple LibreOffice threads for document conversion, optimized code generation for each report

How it works?

Carbone is a mustache-like template engine {d.companyName}.

Template language documentation : https://carbone.io/documentation.html

  • The template can be any XML-document coming from LibreOffice™ or Microsoft Office™ (ods, docx, odt, xslx...)
  • The injected data must be a JSON object or array, coming directly from your existing APIs for example

Carbone analyzes your template and inject data in the document. The generated document can be exported as is, or converted to another format (PDF, ...) using LibreOffice if it is installed on the system. Carbone is working only on the server-side.

Minimum Requirements

  • NodeJS 10.x+
  • Runs on OSX, Linux (servers and desktop), and Windows

Optional

  • LibreOffice server if you want to use the document converter and generate PDF. Without LibreOffice, you can still generate docx, xlsx, pptx, odt, ods, odp, html as long as your template is in the same format.

Getting started

Basic sample

1 - Install it

 npm install carbone

2 - Copy-paste this code in a new JS file, and execute it with node

constfs=require('fs');constcarbone=require('carbone');// Data to injectvardata={firstname : 'John',lastname : 'Doe'};// Generate a report using the sample template provided by carbone module// This LibreOffice template contains "Hello {d.firstname} {d.lastname} !"// Of course, you can create your own templates!carbone.render('./node_modules/carbone/examples/simple.odt',data,function(err,result){if(err){returnconsole.log(err);}// write the resultfs.writeFileSync('result.odt',result);});

PDF generation, document conversion

Carbone uses efficiently LibreOffice to convert documents. Among all tested solutions, it is the most reliable and stable one in production for now.

Carbone does a lot of thing for you behind the scene:

  • starts LibreOffice in "server-mode": headless, no User Interface loaded
  • manages multiple LibreOffice workers to maximize performance (configurable number of workers)
  • automatically restarts LibreOffice worker if it crashes or does not respond
  • job queue, re-try conversion three times if something bad happen
1 - install LibreOffice
on OSX
on Ubuntu Server & Ubuntu desktop

Be careful, LibreOffice which is provided by the PPA libreoffice/ppa does not bundled python (mandatory for Carbone). The best solution is to download the LibreOffice Package from the official website and install it manually:

# remove all old version of LibreOffice
sudo apt remove --purge libreoffice*
sudo apt autoremove --purge
# Download LibreOffice debian package. Select the right one (64-bit or 32-bit) for your OS.# Get the latest from http://download.documentfoundation.org/libreoffice/stable# or download the version currently "carbone-tested":
wget https://downloadarchive.documentfoundation.org/libreoffice/old/6.4.5.2/deb/x86_64/LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
# Install required dependencies on ubuntu server for LibreOffice 6.0+
sudo apt install libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6
# Uncompress package
tar -zxvf LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
cd LibreOffice_6.4.5.2_Linux_x86-64_deb/DEBS
# Install LibreOffice
sudo dpkg -i *.deb
# If you want to use Microsoft fonts in reports, you must install the fonts# Andale Mono, Arial Black, Arial, Comic Sans MS, Courier New, Georgia, Impact,# Times New Roman, Trebuchet, Verdana,Webdings)
sudo apt install ttf-mscorefonts-installer
# If you want to use special characters, such as chinese ideograms, you must install a font that support them# For example:
sudo apt install fonts-wqy-zenhei
2 - generate PDF

And now, you can use the converter, by passing options to render method.

Don't panic, only the first conversion is slow because LibreOffice must starts Once started, LibreOffice stays on to make new conversions faster

vardata={firstname : 'John',lastname : 'Doe'};varoptions={convertTo : 'pdf'//can be docx, txt, ...};carbone.render('./node_modules/carbone/examples/simple.odt',data,options,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('result.pdf',result);process.exit();// to kill automatically LibreOffice workers});

More examples

Nested repetition in a docx document and spreadsheet
vardata=[{movieName : 'Matrix',actors : [{firstname : 'Keanu',lastname : 'Reeves'},{firstname : 'Laurence',lastname : 'Fishburne'},{firstname : 'Carrie-Anne',lastname : 'Moss'}]},{movieName : 'Back To The Future',actors : [{firstname : 'Michael',lastname : 'J. Fox'},{firstname : 'Christopher',lastname : 'Lloyd'}]}];carbone.render('./node_modules/carbone/examples/movies.docx',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('movies_result.docx',result);});carbone.render('./node_modules/carbone/examples/flat_table.ods',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('flat_table_result.ods',result);});

API Reference

To check out the api reference and the documentation, visit carbone.io.

Command line tools

To checkout out the Carbone CLI documentation, visit carbone.io

Issues

If you're facing any issues, search a similar issue to ensure it doesn't already exist on Github. Otherwhise, create an issue to help us.

Roadmap

The roadmap is pinned on the github issues list.

Performance

Report generation speed (without network latency), using a basic one-page DOCX template:

  • ~ 10 ms / report without document conversion (analyzing, injection, rendering)
  • ~ 50 ms / report with a PDF conversion (100 loops, 3 LibreOffice workers, without cold-start)

On a MacBook Pro Mid-2015, 2,2 Ghz i7, 16Go.

Licenses and editions

There are two editions of Carbone:

  • Carbone Community Edition is available freely under the Apache v2 license
  • Carbone Enterprise Edition (hosted and on-premise) includes extra features like a user interface.

We want to follow the model of Gitlab. The free version must be and must stay generous.

Philosophy

Our ultimate goal

2% percent of our hosted solution revenues will go to charity in three domains: open source software we love, education and environment.

We already know that beneficiaries will be, at least ❤️

  • LibreOffice foundation
  • PostgreSQL foundation
  • An innovative child school in France

Contributors

Thanks to all Ideolys's direct contributors (random order)

  • Florian Bezagu
  • Matthieu Robin
  • Arnaud Lelièvre
  • Maxime Vincent
  • Enzo Ghemard
  • Jordan Nourry
  • Etienne Rouillard
  • Guillaume Chevaux
  • Fabien Bigant
  • Maxime Magne
  • Vincent Bertin
  • Léo Labruyère
  • Aurélien Kermabon
  • Steeve Payraudeau

Thanks to all French citizens (Crédit Impôt Recherche, Jeune Entreprise Innovante, BPI)!

About

Fast and simple report generator, from JSON to pdf, xslx, docx, odt...

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CarboneJS

npm badgenpm badgecarbone version badge
documentation badgeminizip badgedocker badgegithub fork badge

Fast, Simple and Powerful report generator in any format PDF, DOCX, XLSX, ODT, PPTX, ODS, XML, CSV...

... using your JSON data as input !

⚡️ Breaking news :

Carbone v2.0 🚀 is here :

Table of content

Features

  • Extremely simple : Use only LibreOffice™, OpenOffice™ or Microsoft Office™ to draw your report
  • Unlimited design : The limit is your document editor: pagination, headers, footers, tables...
  • Convert documents : thanks to the integrated document converter
  • Unique template engine : Insert JSON-like markers {d.companyName} directly in your document
  • Flexible : Use any XML documents as a template: docx, odt, ods, xlsx, html, pptx, odp, custom xml files...
  • Future-proof : A powerful XML-agnostic algorithm understands what to do without knowing XML document specifications
  • Multilingual : One template, multiple languages. Update translation files automatically
  • Format data : Use built-in date and number formatters or create your own in Javascript
  • Fast : Manage multiple LibreOffice threads for document conversion, optimized code generation for each report

How it works?

Carbone is a mustache-like template engine {d.companyName}.

Template language documentation : https://carbone.io/documentation.html

  • The template can be any XML-document coming from LibreOffice™ or Microsoft Office™ (ods, docx, odt, xslx...)
  • The injected data must be a JSON object or array, coming directly from your existing APIs for example

Carbone analyzes your template and inject data in the document. The generated document can be exported as is, or converted to another format (PDF, ...) using LibreOffice if it is installed on the system. Carbone is working only on the server-side.

Minimum Requirements

  • NodeJS 10.x+
  • Runs on OSX, Linux (servers and desktop), and Windows

Optional

  • LibreOffice server if you want to use the document converter and generate PDF. Without LibreOffice, you can still generate docx, xlsx, pptx, odt, ods, odp, html as long as your template is in the same format.

Getting started

Basic sample

1 - Install it

 npm install carbone

2 - Copy-paste this code in a new JS file, and execute it with node

constfs=require('fs');constcarbone=require('carbone');// Data to injectvardata={firstname : 'John',lastname : 'Doe'};// Generate a report using the sample template provided by carbone module// This LibreOffice template contains "Hello {d.firstname} {d.lastname} !"// Of course, you can create your own templates!carbone.render('./node_modules/carbone/examples/simple.odt',data,function(err,result){if(err){returnconsole.log(err);}// write the resultfs.writeFileSync('result.odt',result);});

PDF generation, document conversion

Carbone uses efficiently LibreOffice to convert documents. Among all tested solutions, it is the most reliable and stable one in production for now.

Carbone does a lot of thing for you behind the scene:

  • starts LibreOffice in "server-mode": headless, no User Interface loaded
  • manages multiple LibreOffice workers to maximize performance (configurable number of workers)
  • automatically restarts LibreOffice worker if it crashes or does not respond
  • job queue, re-try conversion three times if something bad happen
1 - install LibreOffice
on OSX
on Ubuntu Server & Ubuntu desktop

Be careful, LibreOffice which is provided by the PPA libreoffice/ppa does not bundled python (mandatory for Carbone). The best solution is to download the LibreOffice Package from the official website and install it manually:

# remove all old version of LibreOffice
sudo apt remove --purge libreoffice*
sudo apt autoremove --purge
# Download LibreOffice debian package. Select the right one (64-bit or 32-bit) for your OS.# Get the latest from http://download.documentfoundation.org/libreoffice/stable# or download the version currently "carbone-tested":
wget https://downloadarchive.documentfoundation.org/libreoffice/old/6.4.5.2/deb/x86_64/LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
# Install required dependencies on ubuntu server for LibreOffice 6.0+
sudo apt install libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6
# Uncompress package
tar -zxvf LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
cd LibreOffice_6.4.5.2_Linux_x86-64_deb/DEBS
# Install LibreOffice
sudo dpkg -i *.deb
# If you want to use Microsoft fonts in reports, you must install the fonts# Andale Mono, Arial Black, Arial, Comic Sans MS, Courier New, Georgia, Impact,# Times New Roman, Trebuchet, Verdana,Webdings)
sudo apt install ttf-mscorefonts-installer
# If you want to use special characters, such as chinese ideograms, you must install a font that support them# For example:
sudo apt install fonts-wqy-zenhei
2 - generate PDF

And now, you can use the converter, by passing options to render method.

Don't panic, only the first conversion is slow because LibreOffice must starts Once started, LibreOffice stays on to make new conversions faster

vardata={firstname : 'John',lastname : 'Doe'};varoptions={convertTo : 'pdf'//can be docx, txt, ...};carbone.render('./node_modules/carbone/examples/simple.odt',data,options,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('result.pdf',result);process.exit();// to kill automatically LibreOffice workers});

More examples

Nested repetition in a docx document and spreadsheet
vardata=[{movieName : 'Matrix',actors : [{firstname : 'Keanu',lastname : 'Reeves'},{firstname : 'Laurence',lastname : 'Fishburne'},{firstname : 'Carrie-Anne',lastname : 'Moss'}]},{movieName : 'Back To The Future',actors : [{firstname : 'Michael',lastname : 'J. Fox'},{firstname : 'Christopher',lastname : 'Lloyd'}]}];carbone.render('./node_modules/carbone/examples/movies.docx',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('movies_result.docx',result);});carbone.render('./node_modules/carbone/examples/flat_table.ods',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('flat_table_result.ods',result);});

API Reference

To check out the api reference and the documentation, visit carbone.io.

Command line tools

To checkout out the Carbone CLI documentation, visit carbone.io

Issues

If you're facing any issues, search a similar issue to ensure it doesn't already exist on Github. Otherwhise, create an issue to help us.

Roadmap

The roadmap is pinned on the github issues list.

Performance

Report generation speed (without network latency), using a basic one-page DOCX template:

  • ~ 10 ms / report without document conversion (analyzing, injection, rendering)
  • ~ 50 ms / report with a PDF conversion (100 loops, 3 LibreOffice workers, without cold-start)

On a MacBook Pro Mid-2015, 2,2 Ghz i7, 16Go.

Licenses and editions

There are two editions of Carbone:

  • Carbone Community Edition is available freely under the Apache v2 license
  • Carbone Enterprise Edition (hosted and on-premise) includes extra features like a user interface.

We want to follow the model of Gitlab. The free version must be and must stay generous.

Philosophy

Our ultimate goal

2% percent of our hosted solution revenues will go to charity in three domains: open source software we love, education and environment.

We already know that beneficiaries will be, at least ❤️

  • LibreOffice foundation
  • PostgreSQL foundation
  • An innovative child school in France

Contributors

Thanks to all Ideolys's direct contributors (random order)

  • Florian Bezagu
  • Matthieu Robin
  • Arnaud Lelièvre
  • Maxime Vincent
  • Enzo Ghemard
  • Jordan Nourry
  • Etienne Rouillard
  • Guillaume Chevaux
  • Fabien Bigant
  • Maxime Magne
  • Vincent Bertin
  • Léo Labruyère
  • Aurélien Kermabon
  • Steeve Payraudeau

Thanks to all French citizens (Crédit Impôt Recherche, Jeune Entreprise Innovante, BPI)!

About

Fast and simple report generator, from JSON to pdf, xslx, docx, odt...

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

CarboneJS

npm badgenpm badgecarbone version badge
documentation badgeminizip badgedocker badgegithub fork badge

Fast, Simple and Powerful report generator in any format PDF, DOCX, XLSX, ODT, PPTX, ODS, XML, CSV...

... using your JSON data as input !

⚡️ Breaking news :

Carbone v2.0 🚀 is here :

Table of content

Features

  • Extremely simple : Use only LibreOffice™, OpenOffice™ or Microsoft Office™ to draw your report
  • Unlimited design : The limit is your document editor: pagination, headers, footers, tables...
  • Convert documents : thanks to the integrated document converter
  • Unique template engine : Insert JSON-like markers {d.companyName} directly in your document
  • Flexible : Use any XML documents as a template: docx, odt, ods, xlsx, html, pptx, odp, custom xml files...
  • Future-proof : A powerful XML-agnostic algorithm understands what to do without knowing XML document specifications
  • Multilingual : One template, multiple languages. Update translation files automatically
  • Format data : Use built-in date and number formatters or create your own in Javascript
  • Fast : Manage multiple LibreOffice threads for document conversion, optimized code generation for each report

How it works?

Carbone is a mustache-like template engine {d.companyName}.

Template language documentation : https://carbone.io/documentation.html

  • The template can be any XML-document coming from LibreOffice™ or Microsoft Office™ (ods, docx, odt, xslx...)
  • The injected data must be a JSON object or array, coming directly from your existing APIs for example

Carbone analyzes your template and inject data in the document. The generated document can be exported as is, or converted to another format (PDF, ...) using LibreOffice if it is installed on the system. Carbone is working only on the server-side.

Minimum Requirements

  • NodeJS 10.x+
  • Runs on OSX, Linux (servers and desktop), and Windows

Optional

  • LibreOffice server if you want to use the document converter and generate PDF. Without LibreOffice, you can still generate docx, xlsx, pptx, odt, ods, odp, html as long as your template is in the same format.

Getting started

Basic sample

1 - Install it

 npm install carbone

2 - Copy-paste this code in a new JS file, and execute it with node

constfs=require('fs');constcarbone=require('carbone');// Data to injectvardata={firstname : 'John',lastname : 'Doe'};// Generate a report using the sample template provided by carbone module// This LibreOffice template contains "Hello {d.firstname} {d.lastname} !"// Of course, you can create your own templates!carbone.render('./node_modules/carbone/examples/simple.odt',data,function(err,result){if(err){returnconsole.log(err);}// write the resultfs.writeFileSync('result.odt',result);});

PDF generation, document conversion

Carbone uses efficiently LibreOffice to convert documents. Among all tested solutions, it is the most reliable and stable one in production for now.

Carbone does a lot of thing for you behind the scene:

  • starts LibreOffice in "server-mode": headless, no User Interface loaded
  • manages multiple LibreOffice workers to maximize performance (configurable number of workers)
  • automatically restarts LibreOffice worker if it crashes or does not respond
  • job queue, re-try conversion three times if something bad happen
1 - install LibreOffice
on OSX
on Ubuntu Server & Ubuntu desktop

Be careful, LibreOffice which is provided by the PPA libreoffice/ppa does not bundled python (mandatory for Carbone). The best solution is to download the LibreOffice Package from the official website and install it manually:

# remove all old version of LibreOffice
sudo apt remove --purge libreoffice*
sudo apt autoremove --purge
# Download LibreOffice debian package. Select the right one (64-bit or 32-bit) for your OS.# Get the latest from http://download.documentfoundation.org/libreoffice/stable# or download the version currently "carbone-tested":
wget https://downloadarchive.documentfoundation.org/libreoffice/old/6.4.5.2/deb/x86_64/LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
# Install required dependencies on ubuntu server for LibreOffice 6.0+
sudo apt install libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6
# Uncompress package
tar -zxvf LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
cd LibreOffice_6.4.5.2_Linux_x86-64_deb/DEBS
# Install LibreOffice
sudo dpkg -i *.deb
# If you want to use Microsoft fonts in reports, you must install the fonts# Andale Mono, Arial Black, Arial, Comic Sans MS, Courier New, Georgia, Impact,# Times New Roman, Trebuchet, Verdana,Webdings)
sudo apt install ttf-mscorefonts-installer
# If you want to use special characters, such as chinese ideograms, you must install a font that support them# For example:
sudo apt install fonts-wqy-zenhei
2 - generate PDF

And now, you can use the converter, by passing options to render method.

Don't panic, only the first conversion is slow because LibreOffice must starts Once started, LibreOffice stays on to make new conversions faster

vardata={firstname : 'John',lastname : 'Doe'};varoptions={convertTo : 'pdf'//can be docx, txt, ...};carbone.render('./node_modules/carbone/examples/simple.odt',data,options,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('result.pdf',result);process.exit();// to kill automatically LibreOffice workers});

More examples

Nested repetition in a docx document and spreadsheet
vardata=[{movieName : 'Matrix',actors : [{firstname : 'Keanu',lastname : 'Reeves'},{firstname : 'Laurence',lastname : 'Fishburne'},{firstname : 'Carrie-Anne',lastname : 'Moss'}]},{movieName : 'Back To The Future',actors : [{firstname : 'Michael',lastname : 'J. Fox'},{firstname : 'Christopher',lastname : 'Lloyd'}]}];carbone.render('./node_modules/carbone/examples/movies.docx',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('movies_result.docx',result);});carbone.render('./node_modules/carbone/examples/flat_table.ods',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('flat_table_result.ods',result);});

API Reference

To check out the api reference and the documentation, visit carbone.io.

Command line tools

To checkout out the Carbone CLI documentation, visit carbone.io

Issues

If you're facing any issues, search a similar issue to ensure it doesn't already exist on Github. Otherwhise, create an issue to help us.

Roadmap

The roadmap is pinned on the github issues list.

Performance

Report generation speed (without network latency), using a basic one-page DOCX template:

  • ~ 10 ms / report without document conversion (analyzing, injection, rendering)
  • ~ 50 ms / report with a PDF conversion (100 loops, 3 LibreOffice workers, without cold-start)

On a MacBook Pro Mid-2015, 2,2 Ghz i7, 16Go.

Licenses and editions

There are two editions of Carbone:

  • Carbone Community Edition is available freely under the Apache v2 license
  • Carbone Enterprise Edition (hosted and on-premise) includes extra features like a user interface.

We want to follow the model of Gitlab. The free version must be and must stay generous.

Philosophy

Our ultimate goal

2% percent of our hosted solution revenues will go to charity in three domains: open source software we love, education and environment.

We already know that beneficiaries will be, at least ❤️

  • LibreOffice foundation
  • PostgreSQL foundation
  • An innovative child school in France

Contributors

Thanks to all Ideolys's direct contributors (random order)

  • Florian Bezagu
  • Matthieu Robin
  • Arnaud Lelièvre
  • Maxime Vincent
  • Enzo Ghemard
  • Jordan Nourry
  • Etienne Rouillard
  • Guillaume Chevaux
  • Fabien Bigant
  • Maxime Magne
  • Vincent Bertin
  • Léo Labruyère
  • Aurélien Kermabon
  • Steeve Payraudeau

Thanks to all French citizens (Crédit Impôt Recherche, Jeune Entreprise Innovante, BPI)!

About

Fast and simple report generator, from JSON to pdf, xslx, docx, odt...

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CarboneJS

npm badgenpm badgecarbone version badge
documentation badgeminizip badgedocker badgegithub fork badge

Fast, Simple and Powerful report generator in any format PDF, DOCX, XLSX, ODT, PPTX, ODS, XML, CSV...

... using your JSON data as input !

⚡️ Breaking news :

Carbone v2.0 🚀 is here :

Table of content

Features

  • Extremely simple : Use only LibreOffice™, OpenOffice™ or Microsoft Office™ to draw your report
  • Unlimited design : The limit is your document editor: pagination, headers, footers, tables...
  • Convert documents : thanks to the integrated document converter
  • Unique template engine : Insert JSON-like markers {d.companyName} directly in your document
  • Flexible : Use any XML documents as a template: docx, odt, ods, xlsx, html, pptx, odp, custom xml files...
  • Future-proof : A powerful XML-agnostic algorithm understands what to do without knowing XML document specifications
  • Multilingual : One template, multiple languages. Update translation files automatically
  • Format data : Use built-in date and number formatters or create your own in Javascript
  • Fast : Manage multiple LibreOffice threads for document conversion, optimized code generation for each report

How it works?

Carbone is a mustache-like template engine {d.companyName}.

Template language documentation : https://carbone.io/documentation.html

  • The template can be any XML-document coming from LibreOffice™ or Microsoft Office™ (ods, docx, odt, xslx...)
  • The injected data must be a JSON object or array, coming directly from your existing APIs for example

Carbone analyzes your template and inject data in the document. The generated document can be exported as is, or converted to another format (PDF, ...) using LibreOffice if it is installed on the system. Carbone is working only on the server-side.

Minimum Requirements

  • NodeJS 10.x+
  • Runs on OSX, Linux (servers and desktop), and Windows

Optional

  • LibreOffice server if you want to use the document converter and generate PDF. Without LibreOffice, you can still generate docx, xlsx, pptx, odt, ods, odp, html as long as your template is in the same format.

Getting started

Basic sample

1 - Install it

 npm install carbone

2 - Copy-paste this code in a new JS file, and execute it with node

constfs=require('fs');constcarbone=require('carbone');// Data to injectvardata={firstname : 'John',lastname : 'Doe'};// Generate a report using the sample template provided by carbone module// This LibreOffice template contains "Hello {d.firstname} {d.lastname} !"// Of course, you can create your own templates!carbone.render('./node_modules/carbone/examples/simple.odt',data,function(err,result){if(err){returnconsole.log(err);}// write the resultfs.writeFileSync('result.odt',result);});

PDF generation, document conversion

Carbone uses efficiently LibreOffice to convert documents. Among all tested solutions, it is the most reliable and stable one in production for now.

Carbone does a lot of thing for you behind the scene:

  • starts LibreOffice in "server-mode": headless, no User Interface loaded
  • manages multiple LibreOffice workers to maximize performance (configurable number of workers)
  • automatically restarts LibreOffice worker if it crashes or does not respond
  • job queue, re-try conversion three times if something bad happen
1 - install LibreOffice
on OSX
on Ubuntu Server & Ubuntu desktop

Be careful, LibreOffice which is provided by the PPA libreoffice/ppa does not bundled python (mandatory for Carbone). The best solution is to download the LibreOffice Package from the official website and install it manually:

# remove all old version of LibreOffice
sudo apt remove --purge libreoffice*
sudo apt autoremove --purge
# Download LibreOffice debian package. Select the right one (64-bit or 32-bit) for your OS.# Get the latest from http://download.documentfoundation.org/libreoffice/stable# or download the version currently "carbone-tested":
wget https://downloadarchive.documentfoundation.org/libreoffice/old/6.4.5.2/deb/x86_64/LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
# Install required dependencies on ubuntu server for LibreOffice 6.0+
sudo apt install libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6
# Uncompress package
tar -zxvf LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
cd LibreOffice_6.4.5.2_Linux_x86-64_deb/DEBS
# Install LibreOffice
sudo dpkg -i *.deb
# If you want to use Microsoft fonts in reports, you must install the fonts# Andale Mono, Arial Black, Arial, Comic Sans MS, Courier New, Georgia, Impact,# Times New Roman, Trebuchet, Verdana,Webdings)
sudo apt install ttf-mscorefonts-installer
# If you want to use special characters, such as chinese ideograms, you must install a font that support them# For example:
sudo apt install fonts-wqy-zenhei
2 - generate PDF

And now, you can use the converter, by passing options to render method.

Don't panic, only the first conversion is slow because LibreOffice must starts Once started, LibreOffice stays on to make new conversions faster

vardata={firstname : 'John',lastname : 'Doe'};varoptions={convertTo : 'pdf'//can be docx, txt, ...};carbone.render('./node_modules/carbone/examples/simple.odt',data,options,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('result.pdf',result);process.exit();// to kill automatically LibreOffice workers});

More examples

Nested repetition in a docx document and spreadsheet
vardata=[{movieName : 'Matrix',actors : [{firstname : 'Keanu',lastname : 'Reeves'},{firstname : 'Laurence',lastname : 'Fishburne'},{firstname : 'Carrie-Anne',lastname : 'Moss'}]},{movieName : 'Back To The Future',actors : [{firstname : 'Michael',lastname : 'J. Fox'},{firstname : 'Christopher',lastname : 'Lloyd'}]}];carbone.render('./node_modules/carbone/examples/movies.docx',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('movies_result.docx',result);});carbone.render('./node_modules/carbone/examples/flat_table.ods',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('flat_table_result.ods',result);});

API Reference

To check out the api reference and the documentation, visit carbone.io.

Command line tools

To checkout out the Carbone CLI documentation, visit carbone.io

Issues

If you're facing any issues, search a similar issue to ensure it doesn't already exist on Github. Otherwhise, create an issue to help us.

Roadmap

The roadmap is pinned on the github issues list.

Performance

Report generation speed (without network latency), using a basic one-page DOCX template:

  • ~ 10 ms / report without document conversion (analyzing, injection, rendering)
  • ~ 50 ms / report with a PDF conversion (100 loops, 3 LibreOffice workers, without cold-start)

On a MacBook Pro Mid-2015, 2,2 Ghz i7, 16Go.

Licenses and editions

There are two editions of Carbone:

  • Carbone Community Edition is available freely under the Apache v2 license
  • Carbone Enterprise Edition (hosted and on-premise) includes extra features like a user interface.

We want to follow the model of Gitlab. The free version must be and must stay generous.

Philosophy

Our ultimate goal

2% percent of our hosted solution revenues will go to charity in three domains: open source software we love, education and environment.

We already know that beneficiaries will be, at least ❤️

  • LibreOffice foundation
  • PostgreSQL foundation
  • An innovative child school in France

Contributors

Thanks to all Ideolys's direct contributors (random order)

  • Florian Bezagu
  • Matthieu Robin
  • Arnaud Lelièvre
  • Maxime Vincent
  • Enzo Ghemard
  • Jordan Nourry
  • Etienne Rouillard
  • Guillaume Chevaux
  • Fabien Bigant
  • Maxime Magne
  • Vincent Bertin
  • Léo Labruyère
  • Aurélien Kermabon
  • Steeve Payraudeau

Thanks to all French citizens (Crédit Impôt Recherche, Jeune Entreprise Innovante, BPI)!

About

Fast and simple report generator, from JSON to pdf, xslx, docx, odt...

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CarboneJS

npm badgenpm badgecarbone version badge
documentation badgeminizip badgedocker badgegithub fork badge

Fast, Simple and Powerful report generator in any format PDF, DOCX, XLSX, ODT, PPTX, ODS, XML, CSV...

... using your JSON data as input !

⚡️ Breaking news :

Carbone v2.0 🚀 is here :

Table of content

Features

  • Extremely simple : Use only LibreOffice™, OpenOffice™ or Microsoft Office™ to draw your report
  • Unlimited design : The limit is your document editor: pagination, headers, footers, tables...
  • Convert documents : thanks to the integrated document converter
  • Unique template engine : Insert JSON-like markers {d.companyName} directly in your document
  • Flexible : Use any XML documents as a template: docx, odt, ods, xlsx, html, pptx, odp, custom xml files...
  • Future-proof : A powerful XML-agnostic algorithm understands what to do without knowing XML document specifications
  • Multilingual : One template, multiple languages. Update translation files automatically
  • Format data : Use built-in date and number formatters or create your own in Javascript
  • Fast : Manage multiple LibreOffice threads for document conversion, optimized code generation for each report

How it works?

Carbone is a mustache-like template engine {d.companyName}.

Template language documentation : https://carbone.io/documentation.html

  • The template can be any XML-document coming from LibreOffice™ or Microsoft Office™ (ods, docx, odt, xslx...)
  • The injected data must be a JSON object or array, coming directly from your existing APIs for example

Carbone analyzes your template and inject data in the document. The generated document can be exported as is, or converted to another format (PDF, ...) using LibreOffice if it is installed on the system. Carbone is working only on the server-side.

Minimum Requirements

  • NodeJS 10.x+
  • Runs on OSX, Linux (servers and desktop), and Windows

Optional

  • LibreOffice server if you want to use the document converter and generate PDF. Without LibreOffice, you can still generate docx, xlsx, pptx, odt, ods, odp, html as long as your template is in the same format.

Getting started

Basic sample

1 - Install it

 npm install carbone

2 - Copy-paste this code in a new JS file, and execute it with node

constfs=require('fs');constcarbone=require('carbone');// Data to injectvardata={firstname : 'John',lastname : 'Doe'};// Generate a report using the sample template provided by carbone module// This LibreOffice template contains "Hello {d.firstname} {d.lastname} !"// Of course, you can create your own templates!carbone.render('./node_modules/carbone/examples/simple.odt',data,function(err,result){if(err){returnconsole.log(err);}// write the resultfs.writeFileSync('result.odt',result);});

PDF generation, document conversion

Carbone uses efficiently LibreOffice to convert documents. Among all tested solutions, it is the most reliable and stable one in production for now.

Carbone does a lot of thing for you behind the scene:

  • starts LibreOffice in "server-mode": headless, no User Interface loaded
  • manages multiple LibreOffice workers to maximize performance (configurable number of workers)
  • automatically restarts LibreOffice worker if it crashes or does not respond
  • job queue, re-try conversion three times if something bad happen
1 - install LibreOffice
on OSX
on Ubuntu Server & Ubuntu desktop

Be careful, LibreOffice which is provided by the PPA libreoffice/ppa does not bundled python (mandatory for Carbone). The best solution is to download the LibreOffice Package from the official website and install it manually:

# remove all old version of LibreOffice
sudo apt remove --purge libreoffice*
sudo apt autoremove --purge
# Download LibreOffice debian package. Select the right one (64-bit or 32-bit) for your OS.# Get the latest from http://download.documentfoundation.org/libreoffice/stable# or download the version currently "carbone-tested":
wget https://downloadarchive.documentfoundation.org/libreoffice/old/6.4.5.2/deb/x86_64/LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
# Install required dependencies on ubuntu server for LibreOffice 6.0+
sudo apt install libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6
# Uncompress package
tar -zxvf LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
cd LibreOffice_6.4.5.2_Linux_x86-64_deb/DEBS
# Install LibreOffice
sudo dpkg -i *.deb
# If you want to use Microsoft fonts in reports, you must install the fonts# Andale Mono, Arial Black, Arial, Comic Sans MS, Courier New, Georgia, Impact,# Times New Roman, Trebuchet, Verdana,Webdings)
sudo apt install ttf-mscorefonts-installer
# If you want to use special characters, such as chinese ideograms, you must install a font that support them# For example:
sudo apt install fonts-wqy-zenhei
2 - generate PDF

And now, you can use the converter, by passing options to render method.

Don't panic, only the first conversion is slow because LibreOffice must starts Once started, LibreOffice stays on to make new conversions faster

vardata={firstname : 'John',lastname : 'Doe'};varoptions={convertTo : 'pdf'//can be docx, txt, ...};carbone.render('./node_modules/carbone/examples/simple.odt',data,options,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('result.pdf',result);process.exit();// to kill automatically LibreOffice workers});

More examples

Nested repetition in a docx document and spreadsheet
vardata=[{movieName : 'Matrix',actors : [{firstname : 'Keanu',lastname : 'Reeves'},{firstname : 'Laurence',lastname : 'Fishburne'},{firstname : 'Carrie-Anne',lastname : 'Moss'}]},{movieName : 'Back To The Future',actors : [{firstname : 'Michael',lastname : 'J. Fox'},{firstname : 'Christopher',lastname : 'Lloyd'}]}];carbone.render('./node_modules/carbone/examples/movies.docx',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('movies_result.docx',result);});carbone.render('./node_modules/carbone/examples/flat_table.ods',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('flat_table_result.ods',result);});

API Reference

To check out the api reference and the documentation, visit carbone.io.

Command line tools

To checkout out the Carbone CLI documentation, visit carbone.io

Issues

If you're facing any issues, search a similar issue to ensure it doesn't already exist on Github. Otherwhise, create an issue to help us.

Roadmap

The roadmap is pinned on the github issues list.

Performance

Report generation speed (without network latency), using a basic one-page DOCX template:

  • ~ 10 ms / report without document conversion (analyzing, injection, rendering)
  • ~ 50 ms / report with a PDF conversion (100 loops, 3 LibreOffice workers, without cold-start)

On a MacBook Pro Mid-2015, 2,2 Ghz i7, 16Go.

Licenses and editions

There are two editions of Carbone:

  • Carbone Community Edition is available freely under the Apache v2 license
  • Carbone Enterprise Edition (hosted and on-premise) includes extra features like a user interface.

We want to follow the model of Gitlab. The free version must be and must stay generous.

Philosophy

Our ultimate goal

2% percent of our hosted solution revenues will go to charity in three domains: open source software we love, education and environment.

We already know that beneficiaries will be, at least ❤️

  • LibreOffice foundation
  • PostgreSQL foundation
  • An innovative child school in France

Contributors

Thanks to all Ideolys's direct contributors (random order)

  • Florian Bezagu
  • Matthieu Robin
  • Arnaud Lelièvre
  • Maxime Vincent
  • Enzo Ghemard
  • Jordan Nourry
  • Etienne Rouillard
  • Guillaume Chevaux
  • Fabien Bigant
  • Maxime Magne
  • Vincent Bertin
  • Léo Labruyère
  • Aurélien Kermabon
  • Steeve Payraudeau

Thanks to all French citizens (Crédit Impôt Recherche, Jeune Entreprise Innovante, BPI)!

About

Fast and simple report generator, from JSON to pdf, xslx, docx, odt...

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

CarboneJS

npm badgenpm badgecarbone version badge
documentation badgeminizip badgedocker badgegithub fork badge

Fast, Simple and Powerful report generator in any format PDF, DOCX, XLSX, ODT, PPTX, ODS, XML, CSV...

... using your JSON data as input !

⚡️ Breaking news :

Carbone v2.0 🚀 is here :

Table of content

Features

  • Extremely simple : Use only LibreOffice™, OpenOffice™ or Microsoft Office™ to draw your report
  • Unlimited design : The limit is your document editor: pagination, headers, footers, tables...
  • Convert documents : thanks to the integrated document converter
  • Unique template engine : Insert JSON-like markers {d.companyName} directly in your document
  • Flexible : Use any XML documents as a template: docx, odt, ods, xlsx, html, pptx, odp, custom xml files...
  • Future-proof : A powerful XML-agnostic algorithm understands what to do without knowing XML document specifications
  • Multilingual : One template, multiple languages. Update translation files automatically
  • Format data : Use built-in date and number formatters or create your own in Javascript
  • Fast : Manage multiple LibreOffice threads for document conversion, optimized code generation for each report

How it works?

Carbone is a mustache-like template engine {d.companyName}.

Template language documentation : https://carbone.io/documentation.html

  • The template can be any XML-document coming from LibreOffice™ or Microsoft Office™ (ods, docx, odt, xslx...)
  • The injected data must be a JSON object or array, coming directly from your existing APIs for example

Carbone analyzes your template and inject data in the document. The generated document can be exported as is, or converted to another format (PDF, ...) using LibreOffice if it is installed on the system. Carbone is working only on the server-side.

Minimum Requirements

  • NodeJS 10.x+
  • Runs on OSX, Linux (servers and desktop), and Windows

Optional

  • LibreOffice server if you want to use the document converter and generate PDF. Without LibreOffice, you can still generate docx, xlsx, pptx, odt, ods, odp, html as long as your template is in the same format.

Getting started

Basic sample

1 - Install it

 npm install carbone

2 - Copy-paste this code in a new JS file, and execute it with node

constfs=require('fs');constcarbone=require('carbone');// Data to injectvardata={firstname : 'John',lastname : 'Doe'};// Generate a report using the sample template provided by carbone module// This LibreOffice template contains "Hello {d.firstname} {d.lastname} !"// Of course, you can create your own templates!carbone.render('./node_modules/carbone/examples/simple.odt',data,function(err,result){if(err){returnconsole.log(err);}// write the resultfs.writeFileSync('result.odt',result);});

PDF generation, document conversion

Carbone uses efficiently LibreOffice to convert documents. Among all tested solutions, it is the most reliable and stable one in production for now.

Carbone does a lot of thing for you behind the scene:

  • starts LibreOffice in "server-mode": headless, no User Interface loaded
  • manages multiple LibreOffice workers to maximize performance (configurable number of workers)
  • automatically restarts LibreOffice worker if it crashes or does not respond
  • job queue, re-try conversion three times if something bad happen
1 - install LibreOffice
on OSX
on Ubuntu Server & Ubuntu desktop

Be careful, LibreOffice which is provided by the PPA libreoffice/ppa does not bundled python (mandatory for Carbone). The best solution is to download the LibreOffice Package from the official website and install it manually:

# remove all old version of LibreOffice
sudo apt remove --purge libreoffice*
sudo apt autoremove --purge
# Download LibreOffice debian package. Select the right one (64-bit or 32-bit) for your OS.# Get the latest from http://download.documentfoundation.org/libreoffice/stable# or download the version currently "carbone-tested":
wget https://downloadarchive.documentfoundation.org/libreoffice/old/6.4.5.2/deb/x86_64/LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
# Install required dependencies on ubuntu server for LibreOffice 6.0+
sudo apt install libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6
# Uncompress package
tar -zxvf LibreOffice_6.4.5.2_Linux_x86-64_deb.tar.gz
cd LibreOffice_6.4.5.2_Linux_x86-64_deb/DEBS
# Install LibreOffice
sudo dpkg -i *.deb
# If you want to use Microsoft fonts in reports, you must install the fonts# Andale Mono, Arial Black, Arial, Comic Sans MS, Courier New, Georgia, Impact,# Times New Roman, Trebuchet, Verdana,Webdings)
sudo apt install ttf-mscorefonts-installer
# If you want to use special characters, such as chinese ideograms, you must install a font that support them# For example:
sudo apt install fonts-wqy-zenhei
2 - generate PDF

And now, you can use the converter, by passing options to render method.

Don't panic, only the first conversion is slow because LibreOffice must starts Once started, LibreOffice stays on to make new conversions faster

vardata={firstname : 'John',lastname : 'Doe'};varoptions={convertTo : 'pdf'//can be docx, txt, ...};carbone.render('./node_modules/carbone/examples/simple.odt',data,options,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('result.pdf',result);process.exit();// to kill automatically LibreOffice workers});

More examples

Nested repetition in a docx document and spreadsheet
vardata=[{movieName : 'Matrix',actors : [{firstname : 'Keanu',lastname : 'Reeves'},{firstname : 'Laurence',lastname : 'Fishburne'},{firstname : 'Carrie-Anne',lastname : 'Moss'}]},{movieName : 'Back To The Future',actors : [{firstname : 'Michael',lastname : 'J. Fox'},{firstname : 'Christopher',lastname : 'Lloyd'}]}];carbone.render('./node_modules/carbone/examples/movies.docx',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('movies_result.docx',result);});carbone.render('./node_modules/carbone/examples/flat_table.ods',data,function(err,result){if(err)returnconsole.log(err);fs.writeFileSync('flat_table_result.ods',result);});

API Reference

To check out the api reference and the documentation, visit carbone.io.

Command line tools

To checkout out the Carbone CLI documentation, visit carbone.io

Issues

If you're facing any issues, search a similar issue to ensure it doesn't already exist on Github. Otherwhise, create an issue to help us.

Roadmap

The roadmap is pinned on the github issues list.

Performance

Report generation speed (without network latency), using a basic one-page DOCX template:

  • ~ 10 ms / report without document conversion (analyzing, injection, rendering)
  • ~ 50 ms / report with a PDF conversion (100 loops, 3 LibreOffice workers, without cold-start)

On a MacBook Pro Mid-2015, 2,2 Ghz i7, 16Go.

Licenses and editions

There are two editions of Carbone:

  • Carbone Community Edition is available freely under the Apache v2 license
  • Carbone Enterprise Edition (hosted and on-premise) includes extra features like a user interface.

We want to follow the model of Gitlab. The free version must be and must stay generous.

Philosophy

Our ultimate goal

2% percent of our hosted solution revenues will go to charity in three domains: open source software we love, education and environment.

We already know that beneficiaries will be, at least ❤️

  • LibreOffice foundation
  • PostgreSQL foundation
  • An innovative child school in France

Contributors

Thanks to all Ideolys's direct contributors (random order)

  • Florian Bezagu
  • Matthieu Robin
  • Arnaud Lelièvre
  • Maxime Vincent
  • Enzo Ghemard
  • Jordan Nourry
  • Etienne Rouillard
  • Guillaume Chevaux
  • Fabien Bigant
  • Maxime Magne
  • Vincent Bertin
  • Léo Labruyère
  • Aurélien Kermabon
  • Steeve Payraudeau

Thanks to all French citizens (Crédit Impôt Recherche, Jeune Entreprise Innovante, BPI)!

About

Fast and simple report generator, from JSON to pdf, xslx, docx, odt...

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages