Convert an 'XLSForm' to a 'Word' or PDF Document
Overview
Converts 'XLSForm' questionnaires, as used by 'Open Data Kit' ('ODK') and 'KoboToolbox', into formatted paper versions for interviewing and review. See https://xlsform.org for the 'XLSForm' standard. Output is a 'Word' document ('.docx') or, optionally, a PDF produced from that 'Word' document with 'LibreOffice'. Supports multilingual forms, nested question numbering, skip logic display, and question and choice media.
A complete rewrite. The package writes Word and PDF paper versions of an XLSForm through a new API, a terminal interface and one document model that both outputs share.
New features
convertxlsform()writes a Word document (.docx) by default.format = "pdf"orformat = c("docx", "pdf")also writes a PDF. The output location, format and overwrite rules follow from the arguments, and the function returns the paths invisibly.- PDF output converts the Word document with LibreOffice. Microsoft Word is used through the
doconvpackage when LibreOffice is not found.docx_to_pdf()andhas_libreoffice()are exported. cli()runs a conversion from a terminal, for exampleRscript -e 'convertxlsform::cli()' form.xlsx --format pdf. Scripts can usequit(status = convertxlsform::cli())to get the exit status.xlsform_outline()returns the numbered form as a data frame, for checking a form before conversion.xlsform_languages()lists the languages in a form and marks the default.- Language columns are read from
label::English (en),label::enandlabel::English. Thelangargument accepts a code, a name or the full suffix. A blank translated cell falls back to the plain column, then to the default language. Headers with a common language name only, such aslabel::French, also match their ISO 639-1 code (lang = "fr"). - Skip logic, constraints and choice filters are written in plain language. Expressions that cannot be read are shown as written.
- Connective phrases such as "Ask if" come from built-in English and French tables. The
stringsoption replaces any of them for another language. - Paper layouts for each question type: single and multiple choice, rank, long lists as code boxes, write-in boxes, numeric, date and time formats, geographic and media questions, and acknowledgments.
- Groups and repeat groups, with nested numbering (
nested_serial_numbers) and blank copies of repeats (repeat_copies).
Show all changes in 0.3.0Hide the rest of the changes in 0.3.0
- Question images are scaled to at most 2 inches tall, and choice images to at most 0.6 inches. A missing media or choice file triggers one combined warning, and a missing image prints a placeholder.
- Complex-script fonts are chosen from the text for Bengali, Arabic, Devanagari and Ethiopic. The
font_family_csoption overrides the choice. - Page size, orientation, margins (up to 2 inches), fonts, a reference
template,title, and switches for hints, constraints, relevants, choice codes, variable names and hidden rows. - Bundled examples:
inst/extdata/multilang(multilingual, with an external choice list and images) andinst/extdata/all_types(every question type and feature the package renders).
Changes from 0.2.1
- Arguments are renamed:
xlsform_pathis nowxlsform,output_docxis nowoutput,selected_languageis nowlang, andnumber_questionsis nownested_serial_numbers. The 0.2.1 names are not accepted. - HTML tags in labels are stripped. Emphasis in Markdown is rendered.
- Imports are reduced to
cli,flextable,magrittr,officer,readxl,rlangandzip, plus base packages (stats,tools,utils).optparseis no longer used, and the command line is parsed bycli().
Known issues
- PDF output can show blank text for Bengali and other complex scripts when LibreOffice cannot find a suitable font on the machine. The Word document is correct. A fix is planned for 0.4.0.
From NEWS.md in the release
Install
Health
- OK7 OKNow
- OK1 OK2026-10-21
Documentation
- Help pages
- 7 (1 internal)includes a package overview page
- Examples that run
- 100%6 run in a plain check (1 of them under a condition)
- Exported functions with examples
- 100%
- Documented parameters
- 90%
- Return-value docs
- 100%
- Help pages citing references
- 0%
- Getting started HTML
Downloads
Repository
- PRs merged (all time)
- 100%
- Median days to close, 50 most recently updated closed issues
- not measured
- Median days to close, 50 most recently updated closed PRs
- not measured
Repository github.com/masud90/convertxlsform is linked, but repository-practices checks have not run for it yet.
Dependencies
Installing convertxlsform adds 65 packages (37 with compiled code, 55 MB of source tarballs). Heaviest: stringi 11 MB, data.table 5.7 MB, bslib 5.6 MB.
Code & Tests
Datasets
People & History
- 0.3.0Latest2026-10-21 · current release ·
8 days in CRAN's queue
Listed in CRAN's incoming queue from 2026-10-13 08:46 to 2026-10-21 15:47 UTC, in 49 readings. - RR 4.6.0 released · 2026-04-24
Package metadata
- First published
- 2026-10-21
- Total releases
- 1 / 1 yrs
- License
- MIT + file LICENSE OSI
- Minimum R
- ≥ 4.1
- Download size
- 598 KB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("convertxlsform")This package has no citation file, so citation() returns this entry built from DESCRIPTION.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-23, which the citation names so these numbers can be found later. More on citing and the projects behind them.