WolfSDKWolfXLWolfPPTWolfDocx

WolfSDK - migration playbook

Move soffice and pdftoppm pipelines to the wolf command

The wolf command takes document conversion and page rendering from soffice and pdftoppm. Move one call at a time with the native verbs, or keep your command lines and put the shims first on PATH. The table lists each form and names the ones that are unsupported.

Two ways to migrate

  • Native verbs. Call wolf render, wolf convert, wolf rasterize, and wolf recalc and read the JSON receipt each run produces.
  • Shims. The wolf binary run under the names soffice, pdftoppm, pdfinfo, pdftotext, and pdfimages accepts the documented command lines. Anything else fails before it writes a file, and a shim never falls back to a real LibreOffice or Poppler binary.

Command mapping

soffice and pdftoppm forms and their wolf equivalents
soffice / Popplerwolf
soffice --headless --convert-to pdf --outdir out report.docxwolf render report.docx --to pdf --outdir out. Inputs: docx, xlsx, pptx, pdf, odt, ods, odp, doc, xls, ppt, emf, and wmf. A run that omits an image exits 1 (a ppt input did in testing); the render report lists what was left out.
Page image of a document (LibreOffice PNG export)wolf render report.docx --to png --pages 1 --outdir out. Targets: pdf, png, svg, jpeg, tiff, and bmp, one file per page named <stem>-<n>.<ext>, with n zero-padded to the digit count of the page total.
Thumbnail of a slide or pagewolf render deck.pptx --to png --pages 1 --scale-to 320 --outdir thumbs. --scale-to sets the longer side in pixels. There is no separate thumbnail command.
soffice --convert-to docx (from .doc or .odt)wolf convert legacy.doc --to docx --outdir out
soffice --convert-to pptx (from .ppt or .odp)wolf convert legacy.ppt --to pptx --outdir out
soffice --convert-to xlsx (from .xls, .xlsb, .ods, .csv)wolf convert legacy.xls --to xlsx --outdir out
soffice --convert-to odt (from .docx)wolf convert report.docx --to odt --outdir out
soffice --convert-to csv (from a workbook)wolf convert book.xlsx --to csv --outdir out. Writes the first worksheet; --sheet NAME picks one.
Recalculate formulas through a LibreOffice macrowolf recalc book.xlsx --clock 2026-10-12T00:00:00Z --seed 0 --outdir out writes a recalculated copy and never overwrites the input. --clock and --seed are required; the output directory must differ from the input directory.
pdftoppm -png -r 150 report.pdf out/reportwolf rasterize report.pdf --dpi 150 --outdir out. Pages are named report-<n>.png with n zero-padded to the digit count of the page total (report-01.png in a 12 page file, report-1.png in a 1 page file); --stem renames the prefix.
pdftoppm -f 2 -l 3--pages 2-3
pdftoppm -scale-to 800--scale-to 800, plus --scale-to-x and --scale-to-y
pdftoppm -singlefile, or no prefix for stdout--single-file on wolf rasterize. --stdout also needs --outdir and --receipt PATH; without them the command exits 2.
pdftoppm -gray, -x -y -W -H, -hide-annotations--colorspace gray, --clip x,y,w,h, and --no-annotations on wolf rasterize
pdftoppm -jpeg, -tiffwolf render report.pdf --to jpeg or --to tiff. JPEG quality is fixed at 90. For -jpegopt quality=N use the shim.
pdftotext, pdfinfo, pdfimagesShim forms only, or wolf shim pdftotext .... wolf extract --what text writes text from docx, xlsx, and pdf; a pptx extract exits 1 with partial output.
soffice -env:UserInstallation=file:///tmp/profileAccepted and ignored. The shim creates no profile directory.
soffice --convert-to docx:...:filter, pdf:writer_pdf_Export, rtf, html, txt, ods, odpNot supported. The shim stops with soffice: unsupported option: --convert-to rtf and exit code 1.
wolf convert report.docx --to pdfNot supported. convert accepts only the targets docx, xlsx, pptx, odt, and csv. Use wolf render --to pdf.
soffice macros and UNO scriptsNot supported. The shim lowers only the recalculate and accept-all-tracked-changes macro URLs and refuses any other.
pdftoppm -rx, -ry, -sz, -o, -e, -sep, -forcenum, -aa, -freetype, -jpegcmyk, -displayprofile, -tiffcompression, -qNot supported. The shim stops with pdftoppm: unsupported option: -rx (the option named) and exit code 99. Use the matching wolf rasterize flags where they exist, or keep Poppler for these.
pdfinfo -box, pdftotext -raw, -enc, -nopgbrkNot supported. The shim exits 99.
soffice --convert-to from rtf, html, or txt input, or wolf render on those filesNot supported. wolf render exits 3 with the format not recognized; csv input to wolf render exits 4. Convert csv with wolf convert --to xlsx first.
Render a .xlsb workbook directlyNot supported by wolf render (exit 4). Run wolf convert book.xlsb --to xlsx first.
Convert an .odp that embeds a chartNot supported in 0.2.0. The command exits 3 with package-invalid-zip-directory; plain .odp files convert.

Every native command requires --outdir. Which input and target pairs run depends on the linked engines, and an unimplemented pair exits 4 and names the pair.

Native commands

wolf render report.docx --to pdf --outdir out
wolf rasterize out/report.pdf --dpi 150 --outdir out
wolf render deck.pptx --to png --pages 1 --scale-to 320 --outdir thumbs
wolf convert legacy.doc --to docx --outdir converted
wolf convert book.xlsx --to csv --outdir converted
# each run writes a JSON receipt; render and convert add a render report

Exit code 0 means every output was written with no error-severity loss. Exit code 1 means outputs exist but the render report names an error-severity omission or approximation. Exit codes 2 to 6 and 70 are failures that write no outputs. Check the code instead of treating any written file as success:

import subprocess

done = subprocess.run(["wolf", "render", "report.docx", "--to", "pdf", "--outdir", "out"])
if done.returncode == 1:
    print("partial output: read out/render-report.json")
elif done.returncode:
    raise SystemExit(f"wolf failed with exit code {done.returncode}")

Keep your command lines with the shims

export PATH="$PWD/wolf-shims:$PATH"   # soffice, pdftoppm, pdfinfo: links to the wolf binary
soffice --headless --convert-to pdf --outdir out report.docx
pdftoppm -png -r 150 out/report.pdf out/report
pdfinfo out/report.pdf
  • soffice --convert-to accepts the bare targets pdf, odt, docx, pptx, xlsx, and csv. Options such as --headless, --invisible, and --norestore have no effect. Exit code 1 reports any unsupported argument.
  • pdftoppm writes PNG, JPEG, TIFF, and PPM pages and defaults to 150 dpi. Poppler shims exit 99 for an unsupported argument and 1 for an unreadable input.
  • A run with omissions still exits 0, as the native tools do, and prints a summary line on standard error for each pdf, docx, pptx, or xlsx output. Set WOLF_REPORT_DIR to a directory to write a receipt and render report for each shim run.

The LibreOffice headless alternative page lists the shim limits and the cases where LibreOffice remains the better fit.

Migration checklist

  1. Search the pipeline for every soffice, pdftoppm, pdfinfo, pdftotext, and pdfimages call and mark each against the table.
  2. Keep LibreOffice for every call marked unsupported, including other convert targets and macros.
  3. Pin fonts. The native commands use bundled fonts plus any --font-dir folders, while the shims default to system fonts and read extra folders from WOLF_FONT_DIRS.
  4. Run a representative set of documents through both paths and compare page counts and page images by eye.
  5. Expect pagination and line breaks to differ from LibreOffice in some documents, and set a tolerance before the comparison.
  6. Handle exit code 1 explicitly and read the render report for losses.
  7. Switch one pipeline, keep the old path for rollback, and widen after the output review.

Published rendering results state their corpus and caveats in the Wolf Runtime announcement.

Get the wolf command

The wolf command ships with Wolf Runtime, which is licensed under a written Order. There is no pip package for it. The Wolf Runtime page lists the integration steps: select the build, install the shims or call the command directly, and run your own documents while you check the receipts, omissions, and refusals.