All Projects → yumauri → gotenberg-js-client

yumauri / gotenberg-js-client

Licence: MIT license
A simple JS/TS client for interacting with a Gotenberg API

Programming Languages

typescript
32286 projects
HTML
75241 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to gotenberg-js-client

Pdfcropmargins
pdfCropMargins -- a program to crop the margins of PDF files
Stars: ✭ 141 (+56.67%)
Mutual labels:  pdf-converter
Stapler
A small utility making use of the pypdf library to provide a (somewhat) lighter alternative to pdftk
Stars: ✭ 238 (+164.44%)
Mutual labels:  pdf-converter
PdfToImage
Convert PDF To jpg in c# (using PdfiumViewer)
Stars: ✭ 23 (-74.44%)
Mutual labels:  pdf-converter
Aws Lambda Libreoffice
85 MB LibreOffice to fit inside AWS Lambda compressed with Brotli
Stars: ✭ 145 (+61.11%)
Mutual labels:  pdf-converter
Athenapdf
Drop-in replacement for wkhtmltopdf built on Go, Electron and Docker
Stars: ✭ 2,160 (+2300%)
Mutual labels:  pdf-converter
node-poppler
Asynchronous node.js wrapper for the Poppler PDF rendering library
Stars: ✭ 97 (+7.78%)
Mutual labels:  pdf-converter
Net Core Docx Html To Pdf Converter
.NET Core library to create custom reports based on Word docx or HTML documents and convert to PDF
Stars: ✭ 133 (+47.78%)
Mutual labels:  pdf-converter
chromic pdf
Convenient HTML to PDF/A rendering library for Elixir based on Chrome & Ghostscript
Stars: ✭ 196 (+117.78%)
Mutual labels:  pdf-converter
Npm Pdfreader
🚜 Read text and parse tables from PDF files.
Stars: ✭ 225 (+150%)
Mutual labels:  pdf-converter
Office2PDF
Office 文件(Word、Excel、PPT)批量转为 PDF 文件,文档完善,自用满意
Stars: ✭ 114 (+26.67%)
Mutual labels:  pdf-converter
Docviewer
文档/文件查看器(支持本地或者其他app分享过来的word、excel、pdf、rtf等格式文件)
Stars: ✭ 155 (+72.22%)
Mutual labels:  pdf-converter
Golang Html To Pdf Converter
Golang HTML to PDF Converter
Stars: ✭ 177 (+96.67%)
Mutual labels:  pdf-converter
WeReadScan
扫描“微信读书”已购图书并下载本地PDF的爬虫
Stars: ✭ 273 (+203.33%)
Mutual labels:  pdf-converter
Doctron
Docker-powered html convert to pdf(html2pdf), html to image(html2image like jpeg,png),which using chrome(golang) kernel, add watermarks to pdf, convert pdf to images etc.
Stars: ✭ 141 (+56.67%)
Mutual labels:  pdf-converter
pdftron-android-samples
PDFTron Android Samples
Stars: ✭ 30 (-66.67%)
Mutual labels:  pdf-converter
Hrconvert2
A self-hosted, drag-and-drop, & nosql file conversion server that supports 62x file formats.
Stars: ✭ 132 (+46.67%)
Mutual labels:  pdf-converter
Wkhtmltopdf
C# wrapper around excellent wkhtmltopdf console utility.
Stars: ✭ 243 (+170%)
Mutual labels:  pdf-converter
press-ready
🚀 Make your PDF press-ready PDF/X-1a.
Stars: ✭ 56 (-37.78%)
Mutual labels:  pdf-converter
Android-XML-to-PDF-Generator
This library is for convert XML to PDF very easily using Step Builders Pattern
Stars: ✭ 140 (+55.56%)
Mutual labels:  pdf-converter
pdf2jpg
Utility to convert PDF into JPG files
Stars: ✭ 39 (-56.67%)
Mutual labels:  pdf-converter

Gotenberg JS/TS client

Build Status Coverage Status License NPM Made with Love

A simple JS/TS client for interacting with a Gotenberg API.
Gotenberg is a Docker-powered stateless API for converting HTML, Markdown and Office documents to PDF.

  • HTML and Markdown conversions using Google Chrome headless
  • Office conversions (.txt, .rtf, .docx, .doc, .odt, .pptx, .ppt, .odp and so on) using unoconv
  • Assets: send your header, footer, images, fonts, stylesheets and so on for converting your HTML and Markdown to beautiful PDFs!
  • Easily interact with the API using Go and PHP libraries (and now - JavaScript too ;)

Install

$ yarn add gotenberg-js-client

Or using npm

$ npm install --save gotenberg-js-client

NB ⚠️

This library is not yet fully compatible with Gotenberg 7.
You can find more info in this comment.

There are three main issues:

  • Gotenberg 7 has introduced new concept of conversion modules, thus, changing conversion URLs, so now they are different, than ones, this library creates. This can be sidestepped using custom connection string or adjusting URL manually (see this comment).
  • New modules has some new possibilities/parameters, which are impossible to pass, using this library. This can be sidestepped using adjust, and casting to any, if you use TypeScript (see this issue for reference).
  • Gotenberg 7 can potentially has many many different custom conversion modules, you can even write your own one. You can combine p.1 and p.2 to use any module with any path with any parameters, but I guess it will look not good. But it should work nonetheless.

So, nothing you can live without, but there are some inconveniences. For a while ;)

Usage

import { pipe, gotenberg, convert, html, please } from 'gotenberg-js-client'

const toPDF = pipe(
  gotenberg('http://localhost:3000'),
  convert,
  html,
  please
)

// --- 8< ---

// convert file from disk
const pdf = await toPDF('file://index.html')

// or convert stream
const pdf = await toPDF(fs.createReadStream('index.html'))

// or convert string!
const pdf = await toPDF('<html>...</html>')

// library returns NodeJS.ReadableStream,
// so you can save it to file, if you want, for example
pdf.pipe(fs.createWriteStream('index.pdf'))

// or you can send it as response in Express application
app.get('/pdf', function (req, res) {
  //...
  pdf.pipe(res)
})

You can define any source like string, Buffer, file link, stream.Readable, or URL (for url conversions).
Detailed sources format you can find here.

Header, footer and assets

You can define sources as array or object, for example:

// `toPDF` function is defined above ↑↑↑

// as object
const pdf = await toPDF({
  'index.html': 'file://index.html',
  'header.html': 'file://header.html',
  'footer.html': 'file://footer.html',
  'style.css': 'file://style.css',
  'img.png': 'file://img.png',
  'font.wof': 'file://font.wof',
})

// as array of tuples
const pdf = await toPDF([
  ['index.html', 'file://index.html'],
  ['header.html', 'file://header.html'],
  ['footer.html', 'file://footer.html'],
])

// as even 1-dimensional array of files
// in that case filenames will be retrieved from file path
const pdf = await toPDF([
  'file://index.html',
  'file://header.html',
  'file://footer.html',
])

Instead of array you can use any iterable, like Map, Set, arguments, iterator from generator function, or any object with [Symbol.iterator] defined.
Detailed sources format you can find here.

Paper size, margins, orientation

When converting HTML or Markdown, you can use to helper, to set paper size, margins and orientation:

import {
  pipe,
  gotenberg,
  convert,
  html,
  please,
  to,
  a4,
  landscape,
} from 'gotenberg-js-client'

const toPDF = pipe(
  gotenberg('http://localhost:3000'),
  convert,
  html,
  to(a4, landscape),
  please
)

You can use simple object(s) for to argument(s) as well:

//...
to({
  paperWidth: 8.27,
  paperHeight: 11.69,
  marginTop: 0,
  marginBottom: 0,
  marginLeft: 0,
  marginRight: 0,
  landscape: true,
})
//...

// or
to([8.27, 11.69], [0, 0, 0, 0], { landscape: true })
//...

// or
to({ paper: [8.27, 11.69], margins: [0, 0, 0, 0], landscape: true })
//...

// or
to({ width: 8.27, height: 11.69 }, { landscape: true })
//...

// or
to({ top: 0, bottom: 0 })
//...

// or any other combination

When using array for paper size, order should be [width, height]
When using array for margins, order should be [top, right, bottom, left] (just like in CSS)

Common options

You can set common options, like resultFilename, or waitTimeout, or, actually, you can override any option, using set helper:

//...
set({
  resultFilename: 'foo.pdf',
  waitTimeout: 2.5,
})
//...

There are some modifiers functions as well, like filename, timeout, delay, webhook and googleChromeRpccBufferSize:

//...
set(filename('foo.pdf'), timeout(2.5))
//...

Also you can specify page ranges using set(range) (will not work with merge):

//...
set(range('1-1'))
//...

or scale, using set(scale) (works with HTML, Markdown and URL conversions):

//...
set(scale(0.75))
//...

Markdown // Gotenberg documentation

import { pipe, gotenberg, convert, markdown, please } from 'gotenberg-js-client'

const toPDF = pipe(
  gotenberg('http://localhost:3000'),
  convert,
  markdown,
  please
)

// --- 8< ---

const pdf = await toPDF({
  'index.html': `
    <!doctype html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>My PDF</title>
      </head>
      <body>
        {{ toHTML .DirPath "content.md" }}
      </body>
    </html>`,

  'content.md': `
    # My awesome markdown
    ...
  `,
})

Note: I use strings here as an example, remind that you can use other supported source type.

Office // Gotenberg documentation

import {
  pipe,
  gotenberg,
  convert,
  office,
  to,
  landscape,
  set,
  filename,
  please,
} from 'gotenberg-js-client'

const toPDF = pipe(
  gotenberg('http://localhost:3000'),
  convert,
  office,
  to(landscape),
  set(filename('result.pdf')),
  please
)

// --- 8< ---

const pdf = await toPDF('file://document.docx')

Note: I use file link here as an example, remind that you can use other supported source type, say, Buffer, or stream.Readable:

https.get(
  'https://file-examples.com/wp-content/uploads/2017/02/file-sample_100kB.docx',
  async (document) => {
    const pdf = await toPDF({ 'document.docx': document })
    // ...
  }
)

Url // Gotenberg documentation

import { pipe, gotenberg, convert, url, please } from 'gotenberg-js-client'

const toPDF = pipe(
  gotenberg('http://localhost:3000'),
  convert,
  url,
  please
)

// --- 8< ---

// you can use link as string
const pdf = await toPDF('https://google.com')

// or URL object
const pdf = await toPDF(new URL('https://google.com'))

Note: The only supported source for Url conversion is text url or instance of URL class.

You can set remote url header (for example, for authentication or host specifying) with helper add(header) (or add(headers), or both):

const toPDF = pipe(
  gotenberg('http://localhost:3000'),
  convert,
  url,
  add(
    header('Foo-Header', 'Foo'),
    header('Bar-Header', 'Bar'),
    headers({ 'Baz1-Header': 'Baz1', 'Baz2-Header': 'Baz2' })
  ),
  please
)

(This also applies for Webhook headers, just use webhookHeader instead of header and webhookHeaders instead of headers).

Merge // Gotenberg documentation

Like you would think:

import { pipe, gotenberg, merge, please } from 'gotenberg-js-client'

const toMergedPDF = pipe(
  gotenberg('http://localhost:3000'),
  merge,
  please
)

Advanced fine adjustment

There is special function adjust, which you can use to modify any field in prepared internal Request object. You can check internal Request object structure in types. Any object, passed to adjust, will be merged with prepared Request.

For example, you can modify url, if your Gotenberg instance is working behind reverse proxy with some weird url replacement rules:

import { pipe, gotenberg, convert, html, adjust, please } from 'gotenberg-js-client'

// Original Gotenberg HTML conversion endpoint is
//   -> /convert/html
// But your reverse proxy uses location
//   -> /hidden/html/conversion
const toPDF = pipe(
  gotenberg('http://localhost:3000'),
  convert,
  html,
  adjust({ url: '/hidden/html/conversion' }),
  please
)

But, using that function, remember about Peter Parker principle:

"With great power comes great responsibility"

Bonus

If you happen to use this package from JavaScript, you will, obviously, lost type safety, but in return, you can use proposed pipe operator (with Babel plugin), to get beauty like this:

const toPDF = source =>
  source
    |> gotenberg('http://localhost:3000')
    |> convert
    |> html
    |> to(a4, noMargins)
    |> set(filename('out.pdf'))
    |> please

Names clashes

If you don't like to have simple imported names in your namespace, you can use import * syntax:

import * as got from 'gotenberg-js-client'

const toPDF = got.pipe(
  got.gotenberg('http://localhost:3000'),
  got.convert,
  got.html,
  got.please
)

Sponsored

Setplex OTT Platform

Setplex OTT Platform

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].