Package: z3c.rml
z3c.rml– An alternative implementation of RMLThis is an alternative implementation of ReportLab’s RML PDF generation XML
format. Like the original implementation, it is based on ReportLab’sreportlablibrary.You can read all aboutz3c.rmland see many examples on how to use it,
see theRML ReferenceInstall on pip:pip install z3c.rmlz3c.rml is then available on the commandline as z3c.rml.:$ z3c.rml --help
usage: rml2pdf [-h]
               xmlInputName [outputFileName] [outDir]
               [dtdDir]

Converts file in RML format into PDF file.

positional arguments:
  xmlInputName    RML file to be processed
  outputFileName  output PDF file name
  outDir          output directory
  dtdDir          directory with XML DTD (not yet supported)

optional arguments:
  -h, --help      show this help message and exit

Copyright (c) 2007 Zope Foundation and Contributors.Save this file as file.rml:<!DOCTYPE document SYSTEM "rml.dtd">
<document filename="example_01.pdf">
 <template showBoundary="1"> <!--Debugging is now turned on, frame outlines -->
 <!--will appear on the page -->
 <pageTemplate id="main">
 <!-- two frames are defined here: -->
 <frame id="first" x1="100" y1="400" width="150" height="200"/>
 <frame id="second" x1="300" y1="400" width="150" height="200"/>
 </pageTemplate>
 </template>
 <stylesheet>
 <!-- still empty...-->
 </stylesheet>
 <story>
 <para>
 Welcome to RML.
 </para>
 </story>
</document>Then run:$ z3c.rml file.rmlThe output will be example_01.pdf as defined in the documentCodewise you can do:from z3c.rml import rml2pdf
rml2pdf.go('file.rml','file.pdf')CHANGES4.4.0 (2023-08-23)Add support for the splitByRow and splitInRow arguments to BlockTable.AddrlPyCairoas install requirement asreportlab >= 4.0needs that library.
(#117 <https://github.com/zopefoundation/z3c.rml/issues/117>_)4.3.0 (2023-04-25)Add support for Python 3.11.Drop support for Python 2.7, 3.5, 3.6.Added support for text anchor points on images.Make sure we only close input files if we opened them.Delegate image ratio to drawImage. (PR #105)Accepts “None” for label box colors.Use svglib for the svg to rml conversion instead of maintaining our own.Allow unicode characters as bullets.4.2.1 (2022-09-30)Add support for Python 3.10.Add back support for Python 3.6.Fix name clash in repository on file systems which are not case sensitive but
just case preserving.Move output directory of tests to a temporary directory.Supportpikepdf6.0+.4.2.0 (2021-10-14)Upgrade to usingpikepdf3.0+.4.1.2 (2020-12-14)Fix include on first page. (PR #84)4.1.1 (2020-12-08)Allow<registerTTFont>to search default font directories instead of
requiring absolute or relative path. (Fixes issue #46.)Make sure a includePages adds blank pages at the end of a document when
there is no flowable after it.4.1.0 (2020-12-07)Implement new tag<blockNosplit>for<blockTableStyle>.Fix dynamic tags in paragraph. Fixes page numbering.Make new bullet styles of Reportlab 3.5 avaialable.Support for customCanvasclasses.4.0.0 (2020-12-07)Dropped support for Python 2.x.DroppedPyPDF2forpikepdf.3.10.0 (2020-03-27)AddedinFillproperty to<linePlot>which will fill the area below
the line makign it effectively an area plot.Added ability to specify thelabelTextFormatproperty of<xValueAxis>and<yValueAxis>to be a reference to a function via a Python path.Added an example from Stack Overflow that exercises the new features. Seetag0linePlot.rml.Remove Python 3.6 support and add 3.8.3.9.1 (2019-10-04)Adding textTransform implementation.3.9.0 (2019-07-19)Create a proper, parsable DTD. Add a test that verifies its validity.Updatedrml.dtd.strandLabelsdoes not support text content. That was accidentally
asserted due to bad schema inheritance.3.8.0 (2019-06-24)UnifiedparaStyleandspanStyleeven more.Extended<spanStyle>to support underline and strike as well.Simplified implemnetation of strike and underline style implementation. It
is also the more correct implementation.3.7.0 (2019-06-14)Drop support for running tests usingpython setup.py test.Drop Python 3.5 support.Extended<paraStyle>:underline: A boolean field indicating whether the entire paragraph is
underlined. The following related attributes have also been added to the
style:underlineColor,underlineOffset,underlineWidth,underlineGap, andunderlineKindstrike: A boolean field indicating whether the entire paragraph is
stricken. The following related attributes have also been added to the
style:strikeColor,strikeOffset,strikeWidth,strikeGap, andstrikeKindjustifyLastLine: Added attribute that is available in the API.justifyBreaks: Added attribute that is available in the API.spaceShrinkage: Added attribute that is available in the API.linkUnderline: Added attribute that is available in the API.3.6.3 (2019-04-11)Added missinglineBelowDash,lineAboveDash,lineLeftDash,lineRightDashattributes3.6.2 (2019-03-27)Fix num2words (missing import, two digit dashes)Added test to check what happens with text not in tags
(e.g. not in a<para>tag)3.6.1 (2018-12-01)Add Python 3.7 Trove classifier.3.6.0 (2018-12-01)Upgraded to support Python 3.7Allow<place>to contain<fixedSize>, which allows content to be
fitted into the place boundaries.3.5.1 (2018-10-09)Upgraded to support Reportlab 3.5.93.5.0 (2018-04-10)Honor the order of attribute choices in the docs.Abstracted span styles out of base paragraph style, so that attributes can
be reused.Remove all default values forSpanStylestyles, so that all values can
be inherited from the paragraph.Support for package-relativesrcvalues in<para><img>tags.3.4.0 (2018-04-09)Drop Python 3.4 support.Feature: Support for<spanstyle="NAME">and corresponding<spanStyle>styles.Bug:attr.Sequence’smin_lengthandmax_lengthwas ineffective3.3.0 (2017-12-06)Add support for non-rml header and footer statements
This is to be able to support export to Open Document Format.Dropped Support for Python 3.33.2.0 (2017-01-08)ImproveIntegerSequencefield to return ranges using lists of two
numbers instead of listing them all out.ExtendedIntegerSequenceto allow specification of first number and
lower/upper bound inclusion.UpdatedConcatenationPostProcessorto handle the new integer sequence
data structure. Since this is so much more efficient for the merging
library, there was a 5x improvement when including PDFs with page ranges.Implemented a PdfTk-based concatenation post-processor. PdfTk is very fast,
but unfortunatelya lot of the gain is lost, since the outline must be merged
in manually. The PdfTk post-processor can be enabled by:from z3c.rml import pdfinclude
pdfinclude.IncludePdfPages.ConcatenationPostProcessorFactory = \
    pdfinclude.PdfTkConcatenationPostProcessorFix initial blank page when PDF inclusion is first flowable. [Kyle MacFarlane]Support for Python 3.5 [Kyle MacFarlane]attr.getFileInfo() crashed if the context element wasn’t parsed.3.1.0 (2016-04-04)Feature: Added new paragraph style attributessplitLongWords,underlineProportion, andbulletAnchor.Feature: AddedtopPadderdirective. Patch by Alvin Gonzales.Bug: Default SVG fill is black. Patch by Alvin Gonzales.Bug: Fixes drawing incorrectly showing when the SVGviewBoxis not
anchored at coordinate (0, 0). Patch by Alvin Gonzales.Test: Updated versions.cfg to reference the latest releases of all
dependencies.Bug: Avoid raising an exception of PdfReadWarning when including PDFs.
Patch by Adam Groszer.3.0.0 (2015-10-02)Support for python 3.3 and 3.4Add ‘bulletchar’ as a valid unordered bullet type.Added nice help to rml2pdf script.Allow “go()” to accept input and output file objects.Fix “Unresolved bookmark” issue.Fix Issue #10.2.9.3 (2015-09-18)Support transparent images in <image> tag2.9.2 (2015-06-16)Fix spelling “nineth” to “ninth”.2.9.1 (2015-06-15)Add missing file missing from brow-bag 2.9.0 release.2.9.0 (2015-06-15)Added support for more numbering schemes for ordered lists. The following
newbulletTypevalues are supported:‘l’ - Numbers as lower-cased text.‘L’ - Numbers as upper-cased text.‘o’ - Lower-cased ordinal with numbers converted to text.‘O’ - Upper-cased ordinal with numbers converted to text.‘r’ - Lower-cased ordinal with numbers.‘R’ - Upper-cased ordinal with numbers.2.8.1 (2015-05-05)AddedbarBorderattribute tobarCodeandbarCodeFlowabletags. This attribute controls the thickness of a white border around a QR
code.2.8.0 (2015-02-02)Get version of reference manual from package version.Added the ability to specify any set of characters as the “bullet content”
like it is supported by ReportLab.Fixed code to work with ReportLab 3.1.44.2.7.2 (2014-10-28)Now the latest PyPDF2 versions are supported.2.7.1 (2014-09-10)Fixed package name.2.7.0 (2014-09-10)AddedbulletTypesypport for thelistStyletag.Added “bullet” as a valid unordered list type value.2.6.0 (2014-07-24)Implemented ability to use themergePagetag inside thepageTemplatetag. This way you can use a PDF as a background for a page.Updated code to work with ReportLab 3.x, specifically the latest 3.1.8. This
includes a monkeypatch to the code formatter for Python 2.Updated code to work with PyPDF2 1.21. There is a bug in 1.22 that prohibits
us from upgrading fully.Changed buildout to create a testable set of scripts on Ubuntu. In the
process all package versions were nailed for testing.2.5.0 (2013-12-10)ReimplamentedincludePdfPagesdirective to use the new PyPDF2 merger
component that supports simple appending of pages. Also optimized page
creation and minimized file loading. All of this resulted in a 95% speedup.2.4.1 (2013-12-10)Fixed a bug when rendering a table with the same style twice. Unfortuantely,
Reportlab modifies a style during usage, so that a copy mustbe created for
each use. [Marcin Nowak]2.4.0 (2013-12-05)Switch frompyPdfto the newer, maintainedPyPDF2library.2.3.1 (2013-12-03)Report correct element during error reporting.registerFontFamilynever worked until now, since the directive was not
properly registered.2.3.0 (2013-09-03)Addedtitle,subject,author, andcreatorattributes todocumentelement. Those are set as PDF annotations, which are now
commonly used to hint viewers window titles, etc. (Those fields are not
available in RML2PDF.)2.2.1 (2013-08-06)Make the number of max rendering passes configurable by exposing the setting
in the API.Addedalignattribute toimgtag.2.2.0 (2013-07-08)Added a new console script “rml2pdf” that renders an RML file to PDF.AddedpreserveAspectRatiotoimgtag flowable. The attribute was
already supported for theimagetag.2.1.0 (2013-03-07)Implemented all PDF viewer preferences. [Kyle MacFarlane]HideToolbarHideMenubarHideWindowUIFitWindowCenterWindowDisplayDocTitleNonFullScreenPageModeDirectionViewAreaViewClipPrintAreaPrintClipPrintScalingThey are all available via thedocinittag.Added SVG support to theimageandimageAndFlowablestags. [Kyle
MacFarlane]Approach: Convert the drawing to a PILImageinstance and pass that
around just like a regular image. The big problem is that in the conversion
fromDrawingtoImagestroke width can often get messed up and
become too thick. I think this is maybe down to how scaling is done but you
can avoid it by editing the SVGs you want to insert. You also lose any
transparency and get a white background. Basically you no longer really have
a vector graphic but instead a 300 DPI bitmap that is automatically scaled
to the correct size with little quality loss.Added ability to look for font files in packages using the standard
“[package.path]/dir/filename” notation. [Kyle MacFarlane]Documented thepageSizeversuspagesizeattribute difference ontemplateandpageTemplateelements compared to RML2PDF. [Kyle
MacFarlane]namedStringelement now evaluates its contents so you can use things
likepageNumberinside of it. [Kyle MacFarlane]ImplementedevalStringusing Python’seval()with builtins
disabled. [Kyle MacFarlane]getNameelement now checks if it has a default attribute. This is used
as a width measurement for a first pass or as the actual value if the
reference isn’t resolved after the second pass. [Kyle MacFarlane]getNameelement now supports forward references. This means you can now
do things like “Page X of Y”. This only works in thedrawStringandparaelements. [Kyle MacFarlane]General performance improvements. [Kyle MacFarlane]Improved performance by not applying a copy of the default style to every
table cell and also by not even trying to initialise the attributes if lxml
says they don’t exist. [Kyle MacFarlane]MergePostProcessorclass did not copy document info and table of
contents (aka Outlines) ofinputFile1. That meant that if you used anyincludePdfPagesormergePagedirectives you lost anyoutlineAdddirective effect. [Alex Garel]Fixed any failing tests, including the ones failing on Windows. [Kyle
MacFarlane]Fixed the table borders not printing or even appearing in some
viewers. [Kyle MacFarlane]Updatedbootstrap.pyandbuildout.cfgto work with the latest
version ofzc.buildout.Updated build to use latest version of lxml.2.0.0 (2012-12-21)ImplementedsaveStateandrestoreStatedirectives. (LP #666194)ImplementedstoryPlacedirective. (LP #665941)Implementedclipattribute ofpathdirective. See RML example 041.Addedh4,h5, andh6directives.Implementedcodesnippetdirective.ImplementedpageBreakBefore,frameBreakBefore,textTransform,
andendDotsattributes for paragraph styles.AddedmaxLineLengthandnewLineCharsattributes to thepredirective.ImplementedpageNumberelement for alldraw*Stringelements.ImplementedNamedStringdirective.ImplementedstartIndexandshowIndexdirective. Also hooked upindexin paragraphs properly. You can now create real book indexes.Implementedol,ul, andlidirectives, which allow highly
flexible lists to be created. Also implemented a complimentarylistStyledirective.Implemented the following doc-programming directives:docAssertdocAssigndocElsedocIfdocExecdocParadocWhileAddedencNameattribute toregisterCidFontdirective.RenamedbookmarktobookmarkPage.Created a new canvas directive calledbookmark.Addedimgdirective, which is a simple image flowable.Implemented crop marks support fully.AddedpageLayoutandpageModetodocInitdirective.Implemented all logging related directives.Implementedcolordirective inside theinitializedirective.RenamedpdfIncludeto documentedincludePdfPagesand addedpagesattribute, so that you can only include specific pages.Don’t show “doc” namespace in reference snippets.Create a list of RML2PDF and z3c.rml differences.Implemented theABORT_ON_INVALID_DIRECTIVEflag, that when setTruewill raise aValueErrorerror on the first occurence of a bad tag.ImplementedsetFontSizedirective for page drawings.ImplementedplugInGraphicwhich allows inserting graphics rendered in
Python.Addedhrefanddestinationto table cells and rectangles.Bug: Due to a logic error, bad directives were never properly detected and
logged about.Bug: Overwriting the default paragraph styles did not work properly.Bug: Specifying a color in any tag inside the paragraph would fail, if the
color was a referenced name.Bug: Moved prematuregetNameevaluation into runtime to properly handle
synamic content now. This is now properly done for any paragraph and
draw string variant.Bug: Fixed DTD generator to properly ignore Text Nodes as attributes. Also
text nodes were not properly documented as element PCDATA.1.1.0 (2012-12-18)Upgrade to ReportLab 2.6. This required some font changes and several
generated PDFs did not match, since some default fonts changed to sans-serif.AddedpdfIncludedirective from Alex Garel. (LP #969399).Switched to Pillow (from PIL).Switched RML highlighting in RML Reference from SilverCity to Pygments.Bug: Addressed a bug in ReportLab 2.6 that disallowed 3-D pie charts from
rendering.Bug: Properly reset pdfform before rendering a document.Bug: Reset fonts properly before a rendering.1.0.0 (2012-04-02)Using Python’sdoctestmodule instead of depreactedzope.testing.doctest.0.9.1 (2010-07-22)I found a more complete paragraph border patch from Yuan Hong. Now the DTD
is updated, the border supports a border radius and the tag-para.rml sample
has been updated.0.9.0 (2010-07-22)Upgraded to ReportLab 2.4. This required some font changes and several
generated PDFs did not match, since some default fonts changed.Upgraded to latest lxml. This only required a trivial change. Patch by Felix
Schwarz.ImplementedlinePlot3Ddirective. Patch by Faisal Puthuparackat.Added paragraph border support. Patch by Yuan Hong.Bug: Fixed version number in reference.pt. Patch by Felix Schwarz.Bug: Write PDF documents in binary mode. Patch by Felix Schwarz.0.8.0 (2009-02-18)Bug: Use python executable as a part of the subprocess command.Add support for RML’spageNumberelement.0.7.3 (2007-11-10)Make sure that the output dir is included in the distribution.0.7.2 (2007-11-10)Upgraded to work with ReportLab 2.1 and lxml 1.3.6.Fix sub-process tests for a pure egg setup.0.7.1 (2007-07-31)Bug: When the specified page size (within thepageInfoelement) was a
word or set thereof, the processing would fail. Thanks to Chris Zelenak for
reporting the bug and providing a patch.0.7.0 (2007-06-19)Feature: Added a Chinese PDF sample file totests/expectedunder the
namesample-shipment-chinese.pdf.Feature: Added another tag that is commonly needed in projects. The<keepTogether>tag will keep the child flowables in the same frame.
When necessary, the frame break will be automatic. Patch by Yuan Hong.Feature: Added the “alignment” attribute to theblockTabledirective. This attribute defines the horizontal alignment for a table that
is not 100% in width of the containing flowable. Patch by Yuan Hong.Feature: When creating Chinese PDF documents, the normal TTF for Chinese
printing is ‘simsun’. However, when bold text is neeed, we switch to
‘simhei’. To properly register this, we need thereportlab.lib.fonts.addMappingfunction. This is missing in the reportlab
RML specification, so a new directive has been defined:<addMapping faceName="simsun" bold="1" italic="0" psName="simhei" />Patch by Yuan Hong.Feature: TheparaandparaStyledirective now support the “wordWrap”
attribute, which allows for selecting a different wrod wrapping
algorithm. This is needed because some far-East Asian languages do not use
white space to separate words. Patch by Yuan Hong.Bug: Handle Windows drive letters correctly. Report and fix by Yuan Hong.0.6.0 (2007-06-19)Bug: Fixed setup.py to include all dependencies.Bug: Added test to show that a blocktable style can be applied multiple
times. A user reported that this is not working, but I could not replicate
the problem.Update: Updated the expected renderings to ReportLab 2.1. There were some
good layout fixes that broke the image comparison.0.5.0 (2007-04-01)Initial Release