From Newsgroup: comp.lang.tcl
ANNOUNCE: tclpdf 1.5 released - runs, headings and lists inside a paragraph =========================================================================
tclpdf is a pure Tcl extension for creating PDF documents: pages and
graphics, embedded fonts in four formats - TrueType subset to the glyphs actually used, OpenType with CFF outlines, a bare CFF table and Type 1 -
plus Type 3 fonts drawn by the caller, JPEG, PNG and TIFF images, SVG
drawn as vectors, flowing text with bold, italic, underlined and struck
runs, links, headings and lists inside a paragraph - written with tags
or in Markdown -, tables, layers, interactive form fields, tagged and accessible documents up to PDF/UA-2, encryption, digital signatures, and electronic invoices as ZUGFeRD / Factur-X in PDF/A-3B. It also reads: a
page of an existing PDF is taken over as a form, a finished file is
continued by an incremental update, and what a foreign file says about
itself is answered as a dictionary. Developed by Alexander Schoepe, it requires Tcl 8.6.11+ and runs under Tcl 9 as well; zlib is a built-in
command rather than a package, tdom is needed only for the XMP metadata
of a PDF/A, PDF/UA or ZUGFeRD document, and Tk is not used.
Built on and measured against ISO 32000-1 and -2, ISO 19005-2 and -3
(PDF/A), ISO 14289-1 and -2 (PDF/UA), EN 16931 with ZUGFeRD 2.3 /
Factur-X 1.09.2 and Order-X, ETSI EN 319 142-1 and RFC 5652 for
signatures, RFC 3161 for timestamps, ISO/IEC 14496-22 for fonts. What
claims a profile is checked against it on every run: veraPDF,
Mustangproject, qpdf and pdfsig over every document. 4616 tests in 89
files, green under Tcl 8.6.18 and Tcl 9.0.4 alike; 87 examples writing
96 documents, every one run, validated and looked at.
1.5 is about one road: a paragraph may now carry bold, italic,
underlined and struck words, links, headings and lists, and the line
breaker measures every piece in its own face. The primitive is a list of
{text options} pairs; tags and Markdown are two notations that become
that list, both read strictly and both proven to set the same bytes.
1.4, four weeks earlier, added the document timestamp. The API grew and nothing was withdrawn.
Tech notes:
What 1.5 does, and what it deliberately does not:
https://fossil.sowaswie.de/tclpdf/technote/01fad837fc
One day, one release - 2026-08-31 from 1.3 to 1.4, measured:
https://fossil.sowaswie.de/tclpdf/technote/16070dfc64
Download / Repository:
https://fossil.sowaswie.de/tclpdf
Author: Alexander Schoepe <
alx.tcl@sowaswie.de>
English
-------
New since 1.3:
* "text -runs 1" sets a list of {text options} pairs as runs in flowing
text: style bold, italic or both, underline, strike, url; a run keeps
the paragraph's size and colour. "heading 1|2|3" makes a run a paragraph
of its own, larger and bold, never the last line of a page; "item bullet|number" makes it a list item with a bullet or a counted number.
In a tagged document that is H1 to H3, and L with LI, Lbl and LBody,
green under veraPDF for PDF/UA-1 and UA-2. "textLines" and the rest of a height-limited block answer in the same shape.
* "text -markup tags" reads b, i, u, s, em, strong, a href, h1 to h3, p,
ul, ol and li - nothing else between angle brackets is a tag, <
writes a literal one - with strict nesting and every fault refused by
name and position.
* "text -markup markdown" reads **strong**, *em*, ~~struck~~,
[text](url), "# " to "### " and "- " or "1. " at the start of a line; no underline, "_" is text, the rest of Markdown is text rather than
refused, and a run left open is refused with its position - deliberately against CommonMark.
* "font family name -regular -bold -italic -boldItalic" ties the faces
of an embedded family under one name, so that -style bold and every bold
run reach it; a face the family lacks is refused by name, not set
regular in silence.
* Underline and strikeout take their place and weight from the face -
post and OS/2 of an embedded one, the AFM of the standard fourteen.
* Since 1.4: "sign timestamp" appends an RFC 3161 token over every byte
of a finished file, signed or not, verified before a byte is written; a stamped PDF/A file stays PDF/A.
Changed since 1.3:
* A two-line heading set as one run gives its second paragraph the
heading's leading as well; before, it had the heading's size with the
leading of the running text.
Notes:
* Installing: the release archives tclpdf1.5.zip and tclpdf1.5.tar.gz
hold one directory tclpdf1.5 with the modules, pkgIndex.tcl and the ICC profiles - nothing to build; extract it into a directory on your
auto_path and "package require tclpdf" finds it. The source archive
builds the TEA way in the source directory: ./configure, make test, make install. A separate build directory configures cleanly but cannot run
the tests, because the generated pkgIndex.tcl locates the modules
through $dir while the sources stay where they are.
* tdom is required for the XMP metadata packet, so every document that declares PDF/A, PDF/UA or ZUGFeRD needs it; a document with no such
claim runs without it. The SVG module uses it as well when present: it
parses 27 to 48 times faster than the parser tclpdf brings along and
refuses an entity expansion bomb, and without it SVG still works through
the built-in element tree parser. tzint is optional and only for
barcodes. Nothing else is used - the encryption and the signatures are
pure Tcl.
* No font is part of the package. The faces under examples/assets/fonts
exist so that the tests and examples have something to embed and travel
in the source archive alone; "make install" installs none. Whether you
may embed a font into a PDF that tclpdf writes is a question for that
font's licence, not for this one.
* Not coming, each for a measured reason: nested lists, runs that change
the size or the colour, mixed writing directions in one call, PDF/X, RC4
and the older encryption revisions, EPS, GIF and BMP.
--- Synchronet 3.22a-Linux NewsLink 1.2