effect-libreoffice
v1.0.7
Published
A effect based LibreOffice converter library. Can convert docx to pdf.
Maintainers
Readme
effect-libreoffice
A Effect-based wrapper for LibreOffice, providing multiple strategies for document conversion.
Implementations
This library offers two distinct implementations for interacting with LibreOffice:
- LibreOfficeCmd (Default): Uses the
sofficecommand-line tool directly. - UnoClient (Uno): Connects to a running
unoserverinstance.
Comparison
| Feature | LibreOfficeCmd (Default) | UnoClient (Uno) | | :-------------- | :--------------------------------------- | :--------------------------------------------------------- | | Method | Spawns a new process for each conversion | Connects to a long-running server | | Performance | Slower (~440ms/file) | Fast (~60ms/file) | | Setup | Requires LibreOffice installed locally | Requires unoserver | | Best For | CLI tools, low volume, simple setup | Servers, high volume, performance critical |
Usage
Default Implementation (CLI)
Best for quick scripts or when you can't run a unoserver.
import { NodeContext } from "@effect/platform-node";
import { Effect, Layer } from "effect";
import { LibreOffice } from "effect-libreoffice";
const program = Effect.gen(function* () {
const libre = yield* LibreOffice;
yield* libre.convertLocalFile("input.docx", "output.pdf");
});
const Layers = LibreOffice.Default.pipe(Layer.provide(NodeContext.layer));
program.pipe(Effect.provide(Layers), Effect.runPromise);Uno Implementation (Start Server)
Best for servers, has a lot better performance. This starts a unoserver for you. You will need to have unoserver binary installed and available in your PATH.
import { NodeContext, NodeHttpClient } from "@effect/platform-node";
import { Effect, Layer } from "effect";
import { LibreOffice, UnoServer } from "effect-libreoffice";
const program = Effect.gen(function* () {
const libre = yield* LibreOffice;
yield* libre.convertLocalFile("input.docx", "output.pdf");
});
const Layers = LibreOffice.Uno.pipe(
Layer.provide(UnoServer.Default), // This will start a unoserver
Layer.provide(NodeContext.layer),
Layer.provide(NodeHttpClient.layer)
);
program.pipe(Effect.provide(Layers), Effect.runPromise);Uno Implementation (Remote)
If you want to manage the unoserver yourself, you can use the remote implementation of Uno.
# compose.yml
services:
unoserver:
image: libreofficedocker/libreoffice-unoserver:3.22
ports:
- "2003:2003"
volumes:
- /tmp:/tmp # some shared directory where files can be written and readimport { NodeHttpClient } from "@effect/platform-node";
import { Effect, Layer } from "effect";
import { LibreOffice, UnoServer } from "effect-libreoffice";
const program = Effect.gen(function* () {
const libre = yield* LibreOffice;
yield* libre.convertLocalFile("input.docx", "output.pdf");
});
const UnoLayers = LibreOffice.Uno.pipe(
Layer.provide(NodeHttpClient.layerUndici),
Layer.provide(UnoServer.Remote) // Defaults to localhost:2003
// or: Layer.provide(UnoServer.remoteWithURL("http://localhost:1111/custom/RPC2"))
);
program.pipe(Effect.provide(UnoLayers), Effect.runPromise);