quds_office_engine 1.5.0
quds_office_engine: ^1.5.0 copied to clipboard
Pure Dart Office, PDF, and report engine: DOCX/XLSX/PPTX, formulas, BiDi/RTL, PdfFile, pdf_widgets, and .qrep band reports exported to PDF, XLSX, and DOCX.
Changelog #
All notable changes to quds_office_engine are documented here.
1.5.0 #
- A variable can ask for a value before preview, print, and export
(
prompt,required). The saved value stays the sample default. - A report can hold more than one detail. Each
<Section>has its own data set, group header, and group footer. A file with only section 0 stays a single flat report. - A crosstab pivots a data set by row field, column field, and value, using the existing aggregates. Empty cells show 0. More than 12 columns keeps the first 12 and warns.
- A subreport draws another template stored at
subreports/<name>.xmlin the same package, once, or once per row when it sits in a repeating detail. The child is shifted into the parent box. A child taller than the parent content area warns. - A text element can hold
<Run>children: bold, italic, size, color, underline, and a link. The link becomes a PDF URI annotation and a Word hyperlink. - Fonts accept
italic.ttfandboldItalic.ttfbeside the regular and bold faces. Shear is used only when the real italic face is absent. - Barcodes add EAN-13. Twelve digits gain a check digit; a wrong check digit warns.
- Excel export draws images and barcodes as pictures, and writes a text page header or footer into the sheet header. Word export draws a barcode as PNG, and a shape that is not a horizontal line as an image.
- An image taller than the page continues on the next page. A chart that does not fit moves to the next page; one taller than the content box is scaled to fit, with a warning.
PdfToOfficereads a PDF file into DOCX, XLSX, or a freeform PPTX. DOCX keeps each line and each JPEG or PNG in a page-anchored box, turns a clearly ruled grid into a table, and turns vector bars, pie wedges, or a polyline into a native chart. A PDF outline or a dot-leader list becomes a table of contents, and link annotations become hyperlinks. XLSX keeps those tables and each chart's values, and writes other text as a single column. PPTX puts each page on a slide of positioned text boxes and PNG pictures. A page with no text layer is reported. Scanned pixels are not read.CffRasterfills a Type 2 charstring into a bitmap. It is not a general CFF text face for PDF.GsubLigaturesapplies OpenType GSUB lookup type 4 before line breaking, and the ligature glyph is subsetted into the PDF font.- Redaction in remove-content mode clears
Tjand hex strings whose text origin lies inside the rectangle, then paints black. Other operators stay. PdfToolbox.stampandnumberPagesembed a supplied TrueType face and shape Arabic. Without those bytes they still use Helvetica and skip non-Latin text.WordMailMerge.documentForrepeats a table row that containsMERGEFIELDonce per record, and otherwise repeats the body with a page break between records.- Ready-made templates add a sales order (
feature_showcase_arandfeature_showcase_en): prompted customer, purchase order, and delivery date, a rich confirmation, an italic note, an EAN-13 code, a nested delivery schedule, an item table, and a branch crosstab. - JBIG2 arithmetic, symbol, and text regions are still not decoded.
1.4.0 #
- A shape map labels each region from an attribute, a calculated column on
the shape table, or a formula in
labelField. The formula may name shape attributes directly (Name,Concat(Name, "\n", SHAPE_Area)) as well asRow.. - The map title, the region labels, and the legend each have their own font.
titleStyle,labelStyle, andlegendStyleset family, size, bold, italic, and color. An empty field inherits the chart font. An empty label color keeps the contrast color, white on a dark region. XML writestitleFont,titleSize,titleBold,titleItalic, andtitleColor, and the same prefixes forlabelandlegend.
1.3.0 #
- Report charts add percent-stacked columns, stacked area, column-and-line
combo (with a secondary axis), waterfall, gauge, bullet, funnel, scatter,
bubble, radar, heatmap, sparkline, and extruded (oblique 3D) columns, pie,
and donut. Each has controllable depth, skew, hole, start angle, curve,
markers, line width, axis bounds, target, bands, and waterfall colors.
Scatter and bubble plot one point per row (
x,y, andsize). PDF and preview draw them as vectors. Word and Excel get a native chart where Office has one, and the nearest bar, line, or donut otherwise. - Ready-made templates add a chart gallery (
chart_gallery_arandchart_gallery_en): every chart type, then a world shape map colored from a separatecountriestable (Row.codetoRow.revenue). - Shape maps color regions from the bundled country atlas or from a shapefile
or GeoJSON stored in the report (
shapes/<name>.qmap). The atlas matches an ISO alpha-2 or alpha-3 code and an English, Arabic, or French name. PDF and preview draw the polygons in Web Mercator, a min/max legend, and labels on the widest regions without overlap. A world-sized layer leaves Antarctica out of the frame. Word and Excel show a bar of the region values. - A chart that crosses the bottom of a page moves to the next page together with the charts below it, so a row is not drawn on top of the one that moved.
1.2.0 #
Reports can do the same job as a mail merge, inside one file.
- A free-form Detail band (no table inside it) honors
newPageBeforeandnewPageAfter. Each row of its data set starts on its own page. Preview, PDF export, and Word export all include those pages. Word writes a page break between the rows. A Detail band that contains a table still flows its rows down the page, so invoices are unchanged. - Word's own mail merge is separate.
WordMailMergefills«Field»andMERGEFIELDtokens.mergefills one record, andmergeAllreturns one document per record. - New template family
class_certificate(Arabic and English): one A4 landscape certificate for every row of astudentstable. The sample is a class of eight students, so opening it and previewing shows eight pages.
1.1.0 #
ReportDiagnostic.targetsays where a finding points (ReportDiagnosticTarget: band, element index, table column or cell, chart series or point, attribute, variable, data table and column, settings section), and parser andvalidate()paths for the same spot agree.ReportDiagnostic.kind(ReportDiagnosticKind) says what kind of problem it is, andsummarydrops the exception class name from parser messages.- The parser warns "No Detail band" only when the template declares data tables, so certificates and vouchers no longer get it.
- Templates are files. A
.qrepthat holds atemplate.jsonmanifest (ReportTemplateManifest: id, family, titles, descriptions, category, language, order) is a template.ReportPackage.templatereads and writes the manifest.ReportTemplateInfo.fromPackageandReportTemplateInfo.decodebuild a catalog entry from such a file, andReportTemplateInfo.manifest,order, andcomparedescribe and sort entries.ReportTemplateInfo.package()returns a file-based template's own package, fonts included. ReportTemplatesis deprecated. The same 16 templates ship as.qrepfiles withquds_office_editor(ReportTemplateLibrary). The class keeps working until 2.0.ReportParseResult.readableis false only when the XML can't be read at all (malformed XML, an empty document, or a root that isn't<QudsReport>). A template with expression errors is still readable, so a designer can open it and show the errors.- Aggregates over
item.in template variables, such as{{SUM(item.amount)}}orCOUNT(), now run over the detail band's data set. They returned 0 before, because variables had no rows in scope. - Template variable names may contain dots, such as
stats.sum. Expressions read them as{{Variables.stats.sum}}. AddsReportVariable.segments,folder, andleaf, andReportGenerator.nestVariables.ReportVariable.isValidNameaccepts dotted names. Validation, completion, and variable renames all handle dotted names. ReportFontFileInfo.scriptslists the writing systems a font covers, read from itscmap. The newReportScriptenum has a sample text for each script, pluspreviewTextandprimary, so a font picker can preview each font in its own script.
1.0.0 #
First stable release. The public API now follows semantic versioning:
breaking changes wait for 2.0. This release brings .qrep packages with
embedded images and fonts, report data schemas with calculated columns, 16
bilingual report templates, and a fidelity pass over Word, Excel, and
PowerPoint files saved by other office suites.
Files saved by LibreOffice and other suites.
- Word:
- Numbering levels with
numFmt="none"or an emptylvlTextprint no label. Writer ties every heading style to such an outline list, which used to show as an extra "1." before each heading. - Runs inherit bold, italic and color from their paragraph style chain. A run's own
w:b w:val="0"still wins. w:b/w:iwithfalseoroffturn the toggle off, in runs and in styles.
- Numbering levels with
- Excel:
- Header and footer sections keep their formatting codes (
&"Arial,Bold",&12). These codes used to swallow the section text. - PDF export expands
&Dand&T, drops font, size, color and toggle codes, and places the left, center and right sections on their own. - PDF export draws each cell at its font size, bold when the cell font is bold, and honors left / center / right alignment. Numbers under General alignment sit on the right, as in Excel.
- Header and footer sections keep their formatting codes (
- PDF: faux bold (used when no bold face is embedded) offsets its second pass by 5% of the em instead of 0.35 pt, so it reads as bold at every size.
Calculated columns in suggestions.
ReportCompleteralso suggests the columns<DataSchema>declares for a table (afteritem.,items.,Data.items.,Group.rows.), including calculated columns and tables with no sample rows yet.- Calculated columns show their expression as the detail.
Word import and layout fixes (#2).
WordLayoutEngine(measure:)takes aWordGlyphMeasurethat gives glyph widths when no font face is loaded, so line breaks match the host's text painting.- Body text uses
fallbackWidthFactor; the wider 0.72 em estimate is now limited to table cells and frames. - Paragraph indents are subtracted once, not twice.
- Style numbering and indents (
w:numPr,w:indinstyles.xml) now apply throughbasedOn, so heading and list styles get their markers.w:numId="0"removes numbering.w:start/w:endindents are read.
- Table styles from
styles.xmlapplytblBordersplusfirstRow/band1Horzshading, followingw:tblLook.- A table's own borders and cell fills win.
Excel import fixes (#3).
t="inlineStr"cells keep their text: rich runs are joined, phonetic runs skipped.- Shared formulas (
<f t="shared" si>) expand from the master formula to every follower withFormulaRefShift.shift.- Relative references move,
$parts stay fixed, and references pushed off the grid become#REF!.
- Relative references move,
FormulaDepGraph.recalculateskips empty formulas.- It keeps a cell's cached value when the engine cannot compute the formula (
#NAME?/#ERROR!), so recalc and save no longer overwrite Excel's result.
- It keeps a cell's cached value when the engine cannot compute the formula (
_xlfn./_xlws.function prefixes are ignored when evaluating; the formula text keeps them.- Number formats support positive;negative;zero sections, thousands grouping,
,scaling,%, quoted literals,[Red]and[$€-407]currency tokens.0%no longer shows two decimals.
- Charts without a value cache are drawn from their
c:val/c:catranges, on the same sheet or another one.SmlDrawinggainssourceSheetName,labelsFromA1andlabelsToA1;SheetChartData.fromSeriespairs values with category labels.
PowerPoint import fixes (#4).
- Only
p:picand shapes with ablipfill become pictures. Text boxes no longer turn into empty "Picture" boxes because of anxfrmor a shadow. off/extare read only inside the shape's ownxfrm, soa:extLst/a:extno longer zeroes a shape's size.p:phis read intoPmlShape.placeholder,placeholderTypeandplaceholderIndex.- Slides follow their
slideLayout→slideMaster→themerelationships:- Placeholders without their own
xfrminherit the layout's geometry (matched byidx, then by type), then the master's. PmlSlide.layoutNameis set.PmlPresentation.layoutslists the deck's layouts, without their prompt text.
- Placeholders without their own
a:schemeClr/a:sysClrcolors resolve through the theme and the master'sp:clrMap, withlumMod,lumOff,shadeandtint.p:stylefillRef/lnRef/fontRefgive default fill, outline and text colors, so PowerPoint autoshapes keep their fill.gradFill/pattFilluse their first color.
- Slide order follows
p:sldIdLstthroughpresentation.xml.rels, and slide parts no longer have to be namedslide1..n.SlideSerializerwrites the real relationship ids intop:sldIdLst.
- Morph transitions keep an empty fill instead of blending through blue.
.qrep packages.
- A
.qrepfile is now a ZIP holdinglayout.xml(the<QudsReport>template) and pre-saved images underimages/<name>.png|jpg.- A stored
mimetypeentry (application/vnd.quds.qrep+zip) comes first.
- A stored
ReportPackage:encode()andReportPackage.decode(bytes);decodealso opens legacy plain-XML.qrepfiles.keyFor(fileName)derives unique image keys;isValidKeychecks a name.- PNG / JPEG only (
ReportImageFormat.sniff); each entry is capped at 64 MB. - Errors raise
ReportPackageException.
QudsReportEngine.fromPackage(bytes, {images})uses the embedded images; hostimages:win on name clashes.engine.toPackage()writes a package.
Embedded fonts in .qrep packages.
- Packages carry TrueType families under
fonts/<family>/regular.ttf|bold.ttf, so a report exports with the faces it was designed with. ReportPackage.fonts(Map<String, ReportFontFiles>),fontRegistry({base}),mergeFonts(base, embedded)andisValidFontFamily.- Host families come first and win on name clashes; the host registry is not modified.
- Every font is checked when it is written or read.
QudsReportEngine.fromPackageregisters the embedded fonts;embeddedFontskeeps them sotoPackage()writes them back.ReportFontFile.inspect(bytes)/inspectWith(read)returnReportFontFileInfo(family, weight, italic) from thename,OS/2andheadtables without parsing glyphs.- They throw
ReportFontExceptionfor.ttccollections, CFF (.otf) outlines, missing tables, and fonts whosefsTypeforbids embedding.
- They throw
Report data schema and sample data.
<DataSchema>in the layout declares fields and tables with typed columns (text,number,boolean,date). This isReportTemplate.dataSchema(ReportDataSchema,ReportDataTable,ReportDataColumn,ReportDataField).- Calculated columns (
expression="qty * price") are evaluated for every row at export; bare names refer to the row's columns. - Exports coerce values to the declared types.
engine.prepare(data)returns the record the layout sees. - The parser warns about unknown types, duplicates, missing names, and broken formulas.
- Calculated columns (
- Packages can carry design-time sample data as
data/sample.json(ReportPackage.sampleData,engine.sampleData). Exports only use it when the host passes it. ReportData: dotted-pathget/set/remove/setTable/addRow/rows, deepmerge, and JSON round-trip with ISO dates.ReportDataTypehandles inference and coercion.ReportCsv.parse/rows/write: delimiter detection (,;tab), quotes, BOM, and typed columns.
Named elements and runtime data.
- Templates keep element names unique:
uniqueElementName,assignElementNames,elementNamed(case-insensitive),duplicateElementNames,isValidElementName. QudsReportEngine:- Host data: the
dataconstructor parameter (ReportData) is merged under the map passed to each export. export(format, {data})/exportSync.ReportExportFormatmoved here from the editor.- Element access by name:
elementNames,element,elementAs<T>. - Setters by name:
setText(withliteral),setImage,setBarcode,setTableRows,setChartRows,setChartPoints,setVisible. - An unknown name or wrong type throws
ReportElementException.
- Host data: the
Bilingual, categorized templates with saved images.
ReportTemplates.allnow has 16 templates: eight families, each with an Arabic (RTL) and an English version.- New families: product catalog (a photo per row) and certificate of appreciation.
- New English versions of the VAT invoice, account statement, receipt voucher and inventory report, and an Arabic version of the commercial invoice and the sales dashboard.
- Existing ids are unchanged.
ReportTemplateInfogainsfamily,language(ReportTemplateLanguage),familyTitle/familyTitleAr,strings,images()andpackage().- Both versions share one layout with
[[key]]tokens filled from per-language strings.
- Both versions share one layout with
ReportTemplates.families,variants,find,counterpartandinCategory.ReportTemplateCategorygainshr(Human resources) and bilingualtitle/titleAr/titleFor.- Templates carry pre-saved PNG images (logo, stamp, signature, seal, product photos) in their package.
- The images are drawn by the new
ReportTemplateArt(logo,stamp,signature,seal,product(ReportProductArt)), an anti-aliased pure-Dart rasterizer.
- The images are drawn by the new
AMOUNTWORDS(amount, 'USD', 'en'|'ar')and thewords:USDformat spell amounts in English (EnglishWords, 21 currencies).- The
dateAr:format uses Arabic month and day names (10 أكتوبر 2026).
Fixes.
- Elements that share a top edge now paint in document order. Before, an unstable sort could draw a filled shape over the text placed on it (for example, the receipt voucher amount).
- Raw deflate now emits overlapping matches and caps hash-chain walks, so long runs (for example, transparent PNG rows) compress fast and much smaller.
Docs.
- The README links to the Quds Report Studio installers for Windows and Linux, which design
.qrepreports for this engine. The pub.dev screenshots include the studio and the new templates.
0.6.0 #
Band report engine (quds_reports.dart).
.qreptemplates:QudsReportXmlParsergives line:column diagnostics.QudsReportXmlWriterround-trips templates.- The mutable
ReportTemplatemodel is built for designers.
QudsExpressionEngine:System.*,Variables.*, andData.*paths; arithmetic, comparisons, and aggregates.- Formats such as
currency:LYDand dates. - Arabic
TAFQEET(amount, code)(ArabicTafqeet).
- Generator:
- Report, page, and group headers/footers, detail bands, and repeating tables.
canGrowtext, page splitting, andSystem.TotalPages.- BiDi, Arabic shaping, and RTL x mirroring (
mirrorRtl).
QudsReportEngine.fromXml(xml)exports withexportToPdf,exportToExcel, andexportToWord.ReportMockData.inferbuilds preview data from a template's bindings.- Charts (
<Chart>/ReportChartElement):- Types: bar, horizontal bar, stacked bar, line, area, pie, donut.
- Data: a dataset grouped by a category expression with
sum/avg/count/min/max/first/last, sorting, and top N; or static<Point>values. - PDF and preview draw vectors (
ReportPathPrimitive); RTL templates mirror the plot. - DOCX and XLSX embed native DrawingML charts; XLSX adds the data table.
ReportTemplates.all: six ready-made templates with sample data (Arabic VAT invoice, English invoice, sales dashboard, account statement, inventory, receipt voucher).ReportCompleter: suggestions inside{{ }}and expressions: functions with signatures,Data/row fields from the preview data,System/Group/Variables, format specs after|, and currency codes inTAFQEET/FORMAT.- Typed template variables (
<Var name type value format description/>):text(may hold{{ }}),number,boolean,date(ISO,today,now),list(;-separated), andexpression. Later variables can use earlier ones, hostvariables:still override, and the validator flags values that don't fit their type. XlsxSheetBuilder.addChartanchors a DrawingML chart part on a sheet.- XLSX builder
style(rightToLeft:)emitsreadingOrder="2". ReportCompleter.formatsexposes the format specs (with samples) that the designer offers as presets.- XLSX and DOCX report exports: transparent text on a filled shape takes the shape's fill (white titles on a colored banner stay readable). XLSX chart placeholder rows get explicit heights, so the chart no longer overlaps its data table in LibreOffice.
tool/dump_report_shots.dartrenders every bundled template to PDF (and the sales dashboard to XLSX/DOCX through LibreOffice) for the README gallery.- Limits are listed in
docs/STANDARDS.md.
PDF fidelity. Five waves: OpenType marks, appearances, page graft, AcroForm write, and a first slice of “files people send”.
- GPOS LookupType 4 (MarkToBase, including type-9 extensions). Combining
marks use font anchors for
paintDx/paintDy; the previous “center of advance” placement is the fallback. - FreeText
/AP(then Tx on fill) is a Form XObject throughLineBreaker- Arabic shaping + a glyf Identity-H subset. Helvetica is not used for
non-Latin text.
/NeedAppearancesstays if generation cannot embed a face.
- Arabic shaping + a glyf Identity-H subset. Helvetica is not used for
non-Latin text.
PdfFile.appendPages/mergeFromrebuild viaPdfPageGraft, so fonts and images survive.PdfToolboxremains the batch assembler.pdf_widgetsTextField/Checkbox/Radiostill draw marks. PassacroForm: true(or useChoiceField) to emit real/Tx/Btn/Chfields on the writerPdfDocument./JBIG2Decodedecodes MMR generic regions (scanner dual-tone) with the same size cap as other filters. Arithmetic coding, symbol dictionaries, and JPX stay typed-unsupported placeholders.- Signature fields: ByteRange coverage plus CMS
SignedDatamessageDigestmatch (valid/invalid). Unknown digest algorithms areunsupported. Creating signatures and trusting a system root list are still out.
0.5.3 #
- High-value
pdf_widgets:PageNumber,HeaderFooter,SignatureLine,KeepTogether,Badge,Callout,Steps,DataGrid,Barcode(Code128),QrCode, andSvgImage(path subset). - Bilingual widget catalog via
pdf_widgets_samples.dart/example/pdf_widgets_catalog.dart. - Skip invisible BiDi marks (
LRE/PDF/LRM/…) sointldates do not paint as.notdefboxes. - Reorder Arabic by grapheme cluster so tashkeel (ضمة on
أُنشئت) stays on its letter after PDF export.
0.5.2 #
- Do not mid-cut Arabic chart axis labels (keeps joining forms intact).
0.5.1 #
- Soft-wrapped
Textkeeps the full max width so RTLstart/justifypaint on the start edge (headers, bullets, paragraphs). TextAlign.justifyorigins follow direction instead of always left.BulletusesTextAlign.start. Chart titles follow direction; long axis labels are shortened to fit their slot.
0.5.0 #
Report templates that look different, not only read different.
pdf_templates.dartships 100+ classified report templates across commerce, finance, people, operations, narrative, data, education, property, logistics, and programs. Pick a named class (InvoiceTemplate,PurchaseOrderTemplate, …) and keep developing it.SheetSkinis the composition surface: invoice bar, receipt slip, letterhead, certificate frame, payslip split, checklist boxes, route endpoints, voucher, grades, identity panel, notice strip, journal, comparison columns, and more. Labels stay language. Direction stays layout.TemplateTheme.copyWithstays brand.TemplateCatalog.all/inCategoryindex every entry.TemplateSuite.demowrites a sample page.joinTemplateFilesjoins English and Arabic into one PDF.Table.fromTextArraydefaults toAlignmentDirectional.topStart, so Arabic table cells pin text to the start edge in RTL.pdf_widgetsFlutter twins:Transform, clips,FractionallySizedBox,IntrinsicHeight,CustomPaint,ListTile, directional insets, and more.TextOverflow.ellipsiscuts a line.OfficeColors.redand other common names areRRGGBBstrings forOfficePalettewithout touching FlutterColors.
0.4.0 #
PDF is a file you can assemble, not only a file you can open or export.
PdfToolboxgrafts a new PDF 1.7 so fonts and images survive merge, extract, split, reorder, remove, reverse, insert, and mix. Range groups are 1-based (1-3,8-10,15). One source may contribute several groups./Rotateis a clockwise quarter-turn added to the existing value. It does not rewrite MediaBox.PdfPageViewmaps view space to unrotated crop space.- Appearance overlays: Helvetica stamp, page numbers, Bates, and CropBox crop.
Stamp is Latin only. A shaped watermark belongs on
pdf_widgets. pdf_widgetswatermark is one rotated string (ActualText + visual-order glyphs) so Arabic stays joined.- Office slide export can stack two slides on one page (
slidesPerPage: 2). The default remains one slide per page. ArabicShaper.nominalmaps presentation forms back to isolated letters.- Package documentation covers the full public surface, including honest limits (no OCR, no CMS verify, no certified PDF/A, no content-stream reflow).
0.3.1 #
- Keep
pdf_widgetson its own library import (package:quds_office_engine/pdf_widgets.dart) so Flutter hosts do not see collidingText/TextStyle/Widgetnames from the main barrel.
0.3.0 #
Office + PDF in one pure-Dart engine. This release makes PDF a first-class citizen alongside DOCX / XLSX / PPTX — open, compose, and export without Flutter.
PDF as a file (PdfFile) #
- Open ISO 32000 packages: xref table/stream, object streams, incremental updates, filters (including CCITT G3/G4), encryption/password paths.
- Display list for page paint (
b/b*, graphics state, Type 3, axial/radial shadings, OCG, SMask→RGBA, CMYK/ICCBased images). - Text extract (WinAnsi / MacRoman / PDFDoc, Standard-14,
/ActualText,/StructTreeRootreading order). - Typed honesty for signatures (
ByteRangestatus), PDF/A detection (not certification), and unsupported codecs (JBIG2/JPX, in-engine CFF raster).
PDF widgets (pdf_widgets.dart) #
- Flutter-like constraint layout in pure Dart:
Document,Page/MultiPage,Table/TableBorder/ column widths, flex, text, media. - Real bold faces via
Document.fontBold(Type0/F3), not faux stroke. - Table cells expand to full width×row height (package:pdf-style fills).
- Synchronous
Document.save()→ nativePdfDocumentwriter bytes.
Office (unchanged strengths) #
- Round-trip DOCX / XLSX / PPTX, formulas, BiDi/RTL, isolate open/save.
OfficePdfExportstill compiles Word / Excel / PowerPoint to PDF 1.7.
Breaking #
- Word widget DSL removed. Use
pdf_widgetsfor PDF layout andDocxDocumentBuilderfor DOCX.
0.2.0 #
- English package documentation, Word widget DSL (later removed), and PDF export polish.
0.1.0 #
- First public release: Office builders, models, formulas, BiDi, PDF export.
