pdf

package
v0.8.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 24, 2026 License: MIT Imports: 29 Imported by: 0

Documentation

Overview

Package pdf renders HTML documents to PDF using Chromium.

Package pdf renders HTML documents to PDF using Chromium.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CheckChromiumAvailable

func CheckChromiumAvailable() error

CheckChromiumAvailable reports whether Chrome or Chromium is installed.

func KillRunningBrowsers added in v0.8.2

func KillRunningBrowsers()

KillRunningBrowsers SIGKILLs every Chrome process this package started and has not yet reaped. Call it immediately before os.Exit on a path that skips deferred cleanup; it is a no-op when no render is in flight.

func SetDocumentInfo added in v0.8.0

func SetDocumentInfo(data []byte, meta DocumentMetadata, ts time.Time) ([]byte, error)

SetDocumentInfo rewrites the /Info dictionary of an in-memory PDF so it carries mdPress's document metadata and a deterministic timestamp.

The rewrite is done in place whenever the new dictionary fits inside the bytes the old one occupied — that keeps every cross-reference offset valid and, because the replaced bytes included Chrome's wall-clock timestamps, makes the output reproducible. When the new dictionary is larger the old object is emptied and a replacement is appended as a standard incremental update.

Any PDF this function cannot confidently parse is returned unchanged along with an error, so a failure degrades to "metadata not set" rather than a corrupt file.

func StripCoverHeaderFooter added in v0.8.2

func StripCoverHeaderFooter(data []byte) ([]byte, error)

StripCoverHeaderFooter removes the print header and footer Chrome drew on page one of data, which is only correct when page one is a cover.

The document is returned unchanged, with an error explaining why, whenever the running head cannot be identified beyond doubt.

func WarnIfCJKFontsMissing added in v0.3.1

func WarnIfCJKFontsMissing(htmlContent string, logger interface{ Warn(string, ...any) })

WarnIfCJKFontsMissing checks whether the HTML content contains CJK characters and warns the user if no CJK fonts are installed on the system. This is a best-effort check — it logs a warning but does not block PDF generation.

Types

type DocumentMetadata added in v0.8.0

type DocumentMetadata struct {
	Title    string
	Author   string
	Subject  string
	Keywords string
	Creator  string
}

DocumentMetadata is the document information mdPress records in a PDF's /Info dictionary. Empty fields are left out of the dictionary entirely.

func (DocumentMetadata) IsZero added in v0.8.0

func (m DocumentMetadata) IsZero() bool

IsZero reports whether no metadata field is set.

type Generator

type Generator struct {
	// contains filtered or unexported fields
}

Generator converts HTML into PDF files.

func NewGenerator

func NewGenerator(opts ...GeneratorOption) *Generator

NewGenerator creates a PDF generator. By default, it generates a document outline (clickable bookmarks) and tagged PDF.

func (*Generator) Generate

func (g *Generator) Generate(ctx context.Context, htmlContent string, outputPath string) error

Generate renders an HTML string to a PDF file. Canceling ctx kills Chrome and returns without writing anything.

func (*Generator) GenerateFromFile

func (g *Generator) GenerateFromFile(ctx context.Context, htmlFilePath string, outputPath string) error

GenerateFromFile renders a local HTML file to PDF. Canceling ctx kills Chrome and returns without writing anything.

type GeneratorOption

type GeneratorOption func(*Generator)

GeneratorOption customizes a PDF generator.

func WithCoverPage added in v0.8.2

func WithCoverPage(cover bool) GeneratorOption

WithCoverPage declares that page one is a cover — artwork printed to the edge of the sheet — so the print header and footer are taken back off it after printing. Chrome draws them from the PrintToPDF parameters rather than from the page box, so nothing in the document can keep them off the cover; see StripCoverHeaderFooter.

func WithDocumentOutline

func WithDocumentOutline(enable bool) GeneratorOption

WithDocumentOutline toggles PDF bookmark/outline generation from heading hierarchy. Enabled by default. Requires Chrome 128+ for full support.

func WithFooterTemplate added in v0.4.0

func WithFooterTemplate(tmpl string) GeneratorOption

WithFooterTemplate sets a custom HTML footer template for PDF pages. The template is rendered by Chrome's PrintToPDF and supports CSS styling. Chrome provides special classes: "pageNumber", "totalPages", "date", "title", "url".

func WithHeaderFooter

func WithHeaderFooter(enable bool) GeneratorOption

WithHeaderFooter toggles header and footer rendering.

func WithHeaderTemplate added in v0.7.14

func WithHeaderTemplate(tmpl string) GeneratorOption

WithHeaderTemplate sets a custom HTML header template for PDF pages. The template is rendered by Chrome's PrintToPDF and supports CSS styling. Chrome provides special classes: "pageNumber", "totalPages", "date", "title", "url".

func WithMarginStrings added in v0.4.0

func WithMarginStrings(left, right, top, bottom string) GeneratorOption

WithMarginStrings sets page margins from string values (e.g., "20mm", "1in"). Uses default values if parsing fails.

func WithMargins

func WithMargins(left, right, top, bottom float64) GeneratorOption

WithMargins sets page margins in millimeters.

func WithMetadata added in v0.8.0

func WithMetadata(m DocumentMetadata) GeneratorOption

WithMetadata sets the document information written into the PDF's /Info dictionary. Without it the PDF keeps whatever Chrome produced, which names headless Chrome as the creator and carries no author or subject.

func WithPageSize

func WithPageSize(width, height float64) GeneratorOption

WithPageSize sets the page size in millimeters.

func WithPrintBackground

func WithPrintBackground(print bool) GeneratorOption

WithPrintBackground toggles background printing.

func WithTaggedPDF

func WithTaggedPDF(enable bool) GeneratorOption

WithTaggedPDF toggles tagged (accessible) PDF generation. Enabled by default. Tagged PDFs include structural metadata for screen readers.

func WithTimeout

func WithTimeout(d time.Duration) GeneratorOption

WithTimeout sets the operation timeout.

type PDFRenderer

type PDFRenderer interface {
	Generate(ctx context.Context, htmlContent string, outputPath string) error
	GenerateFromFile(ctx context.Context, htmlFilePath string, outputPath string) error
}

PDFRenderer abstracts PDF generation so tests can use a mock.

Both methods take a context because rendering a book-sized document keeps Chrome busy for minutes. Without one, Ctrl+C could not reach the render in progress: the CLI's signal handler canceled a context nothing in here was watching, so an interrupted build sat on a frozen progress line until Chrome had finished the whole book anyway.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL