Four ways to author
Use fluent Java, immutable Java values, strict JSON or letter HTML. Every route reaches the same PDF engine.
Four ways to author
Built for real letters
See what you will get
Know the boundaries
Your API choice is remembered across documentation pages. Java examples below are complete programs; JSON and HTML show their complete input documents.
import com.nsdev.lettergenerator.Letter;import com.nsdev.lettergenerator.LetterPdfGenerator;import java.nio.file.Files;import java.nio.file.Path;
/** A complete first letter using the fluent API and engine-provided standard fonts. */public final class FluentQuickstart { private FluentQuickstart() {}
public static void main(String[] args) throws Exception { var letter = Letter.builder().body("Hello from Letter Generator").build(); byte[] pdf = new LetterPdfGenerator().generate(letter); Files.write(Path.of(args.length == 0 ? "letter.pdf" : args[0]), pdf); }}import com.nsdev.lettergenerator.LetterPdfGenerator;import com.nsdev.lettergenerator.model.LetterDocument;import com.nsdev.lettergenerator.model.Section;import com.nsdev.lettergenerator.model.block.Paragraph;import com.nsdev.lettergenerator.model.text.TextRun;import java.nio.file.Files;import java.nio.file.Path;import java.util.List;
/** The same letter constructed directly from immutable public model values. */public final class TypedQuickstart { private TypedQuickstart() {}
public static void main(String[] args) throws Exception { var letter = new LetterDocument( LetterDocument.SUPPORTED_SCHEMA_VERSION, null, null, List.of( new Section( "body", null, List.of( new Paragraph( List.of( new TextRun( "Hello from Letter Generator", null, null)), null)))), List.of(), null, null); byte[] pdf = new LetterPdfGenerator().generate(letter); Files.write(Path.of(args.length == 0 ? "letter.pdf" : args[0]), pdf); }}{ "schemaVersion": 1, "sections": [{ "name": "body", "blocks": [{ "type": "paragraph", "runs": [{ "text": "Hello from Letter Generator" }] }] }]}<letter page="a4"> <main> <p>${message}</p> </main></letter>