rml2pdf Userguide
rml2pdf Userguide
1. Introduction ...................................................................................................................... 4
1.1. ReportLab PLUS ...................................................................................................... 4
1.2. Installation and Use .................................................................................................. 4
1.3. What is RML? .......................................................................................................... 7
1.4. What is this document?............................................................................................. 7
1.5. Who is this document aimed at?............................................................................... 7
1.6. Conventions used in this document .......................................................................... 7
Page 2
RML User Guide Document generated on 2017/06/19 20:18:43
Page 4
RML User Guide Document generated on 2017/06/19 20:18:43
1. Introduction
ReportLab's product suite allows direct creation of rich PDF reports on web or application servers in real time.
The tools run on any platform, can actively acquire data from any source (XML, flat files, databases,
COM/Corba/Java), place no limits on the output, and facilitate electronic delivery and archival. The ReportLab
suite lets you define your own business rules to automatically create custom online reports, catalogs, business
forms, and other documents
RML2PDF is a central component of the toolkit: a translator which converts high level XML markup into PDF
documents. Report Markup Language describes the precise layout of a printed document, and RML2PDF
converts this to a finished document in one step. In a dedicated reporting application, other components of our
toolkit handle data acquisition and preparation of the RML document.
RML2PDF on its own also fills a key technology gap. Our full toolkit relies heavily on the Python scripting
language. Nevertheless we recognize that IT departments and software houses have their own distinct skill sets
and development tools. A company may already have developed a rich 3-tier architecture with the key business
data in Java or COM objects on an application server. All they need is the formatting component. They can use
exactly the same techniques they use to generate HTML (XSLT, JSP, ASP or anything else) to generate an
RML file, and the program turns this into a finished document. Fast.
Unlike a number of other formatting languages, RML aims squarely at corporate needs. Paragraph, table and
page styles are kept in independent 'stylesheets', allowing reuse and global changes across a family of
documents. The table model has been designed for efficient rendering of business data. And a plug-in
architecture lets you easily develop and add in custom vector graphics or page templates within the same tool
set.
RML2PDF can also work in tandem with our PageCatcher product. PageCatcher is a support tool which extracts
graphical elements from PDF files for inclusion in documents generated by RML2PDF or the ReportLab core
API. Since any external program with the ability to print can produce PDF files, this means that a ReportLab
document can include graphical elements created by virtually any program. These imported elements can be
combined freely with text or graphics drawn directly into the document. For example an application can import
pages from a government tax form and draw text in the spaces provided to fill in the form. The resulting
document can then be combined with a cover letter at the beginning and supporting tabular data at the end -- all
in a single PDF document.
http://www.reportlab.com/software/installation/
RML2PDF is a compiled Python programming language module. It can be used with options from a command
line, and also has a programmable API interface and may be used as a component of a larger Python language
installation. Since Python integrates with a wide variety of other languages, it is also possible to access
RML2PDF from C and C++ programs, COM and many other environments.
RML2PDF is delivered as part of ReportLab's 'rlextra' package and licensed under the name ReportLab PLUS.
This package depends on our 'reportlab' package and some other open source libraries, all detailed on the above
Page 5
RML User Guide Document generated on 2017/06/19 20:18:43
installation page.
RML2PDF requires a license key file to work in production mode. Without the license key each page produced
by RML2PDF will be visibly marked as an "evaluation" copy, and the file will be annotated invisibly as
produced for evaluation purposes as well. With a valid license key file present, RML2PDF will run in
production mode and the PDF file generated will contain the licensing information. You can purchase a
ReportLab PLUS license using your user account on our website http://www.reportlab.com. Once we issue you
a '.pyc' license file you will need to install it somewhere on your PYTHONPATH so that rml2pdf can find it.
On Windows, .pyc files are normally associated with the most-recently-installed Python interpreter, so you
could execute this...
After completing successfully the rml2pdf program will return to a command prompt. The output PDF file
should be created in the current working directory.
There are two main ways the 'go' function can be used - either to generate the resulting PDF file on disk in the
file system, or to generate it in memory (useful for web applications returning the PDF directly to the user).
This example uses the 'go' function to create the output PDF file on disk:
rml = getRML() # Use your favorite templating laguage here to create the RML string
output = '/tmp/output.pdf'
rml2pdf.go(rml, outputFileName=output)
This is an example Django web application view generating a PDF in memory and returning it as the result of
an HTTP request:
def getPDF(request):
"""Returns PDF as a binary stream."""
# Use your favourite templating language here to create the RML string.
# The generated document might depend on the web request parameters,
# database lookups and so on - we'll leave that up to you.
Page 6
RML User Guide Document generated on 2017/06/19 20:18:43
rml = getRML(request)
buf = cStringIO.StringIO()
rml2pdf.go(rml, outputFileName=buf)
buf.reset()
pdfData = buf.read()
response = HttpResponse(mimetype='application/pdf')
response.write(pdfData)
response['Content-Disposition'] = 'attachment; filename=output.pdf'
return response
xmlInputText must be a string which contains the RML specification for the PDF document to be
generated.
outputFileName when specified overrides any output file name specified in the xml input text. You
may also pass in a file-like object (e.g. a StringIO, file object or web request buffer), in which case
nothing is written to disk.
outDir (output directory) parameter when present specifies the directory in which to place the output
file.
dtdDir is an optional DTD directory parameter which specifies the directory containing the DTD for
the current version of RML.
passLimit of None means "keep trying until done", of 3 means, "try 3 times then quit".
permitEvaluations when false disallows the evalString tag for security (e.g. web apps).
ignoreDefaults 1 means "do one pass and use the default values where values are not found".
pageCallBack is a callback to execute on final formatting of each page - used for counting number
of pages.
progressCallBack is a cleverer callback; see the progressCB function in
reportlab/platypus/doctemplate.
preppyDictionary if set to a dictionary indicates that the xmlInputText should be
preprocessed using preppy with the preppyDictionary as argument. If preppyDictionary is not
None and preppyIterations is >1 then the preppy preprocessing will be repeated
preppyIterations times (max of 3) with the same dict, to generate, e.g., table of contents.
preppyIterations - see preppyDictionary.
dynamicRml is an optional boolean field for whether the RML can be dynamically altered.
dynamicRmlNameSpace is for use with dynamicRml. It's a dictionary which you can add
variables to for processing.
encryption if set it must be an encryption object, for example:
rlextra.utils.pdfencrypt.StandardEncryption("User", "Owner",
canPrint=0, canModify=0, canCopy=0, canAnnotate=0).
Page 7
RML User Guide Document generated on 2017/06/19 20:18:43
saveRml is useful for debugging dynamically generated RML. Specify a filename where the RML
should be saved.
parseOnly if set to True, will only parse the RML and not generate a PDF.
It is also possible to call rml2pdf from other programming languages (such as C++) by using standard methods
for calling a python callable. See the Python Language Embedding and Extension manuals.
For further information regarding the installation of your version of RML2PDF please see the release notes and
READMEs that come with the package.
RML documents can be written automatically by a program or manually using any word processor that can
output text files (e.g. using a "Save as Text" option from the save menu). Since RML documents are basic text
files, they can be created on the fly by scripts in Python, Perl, or almost any other language.
RML makes creating documents in PDF as simple as creating a basic web page - RML is as easy to write as
HTML, and uses "tags" just like HTML. It is much easier than trying to write PDF programmatically.
This document has been generated from RML. If you need another example of RML in action, look at the file
"rml_user_guide.rml" to see how this file was produced.
You do not have to be employed as a programmer or have extensive programming skills for this guide to make
sense. We have tried to keep it as simple as possible and to minimise confusion.
constant width
Throughout this User Guide, we'll be using a constant width typeface to highlight any literal
element of RML (such as tag names or attributes for tags) when they appear in the text.
8 point Courier
Page 8
RML User Guide Document generated on 2017/06/19 20:18:43
A smaller constant width font is used for code snippets (short one or two line examples of what RML
commands look like) and code examples (longer examples of RML which usually have an illustration
of the output they produce).
Page 9
RML User Guide Document generated on 2017/06/19 20:18:43
Attribute values must be enclosed in quotation marks. (e.g. you would have to use <document
filename="outfile.pdf">, since you couldn't get away with <document
filename=outfile.pdf>
A non-empty element must have both an opening and a closing tag. (e.g. a <document> tag must be
matched by a matching </document> tag). "Empty" elements are those that don't have any content,
and are closed with a "/>" at the end of the same tag rather than having a separate closing tag. (e.g.
<getName id="Header.Title"/>)
Tags must be nested correctly. (i.e. "<b><i>text</b></i>" isn't valid, but
"<b><i>text</i></b>" is.)
On the whole, whitespace is ignored in RML. Except inside strings, you can format and indent your
RML documents in whatever way you consider most readable. (Inside text strings, whitespace is seen
as equivalent to a single space and line breaks are added automatically as needed during formatting.
Other than that, what you type is what is displayed on the page).
RML is case-sensitive. "Upper Case" is different from "upper case", "UPPER CASE" and "UpPeR
CaSe". The capitalization in the tag names is important.
This is called the prolog - you can think of it as the document 'header'.
Page 10
RML User Guide Document generated on 2017/06/19 20:18:43
<!DOCTYPE... "rml.dtd">
This line tells the parser where the Document Type Definition is located. The DTD formally specifies
the syntax of RML.
For documents written in RML, the DTD should always be the current version of rml.dtd. (The rml
DTD should always be called rml.dtd.
Unlike other dialects of XML, RML does not allow you to provide relative paths to the DTD, nor a full
URL. It must always be the name of the DTD, which must live in the same directory as the exe or
python program rml2pdf.
This makes it easy to predict where the RML DTD will be and prevents you using an old DTD that
happens to be sitting around your disk somewhere. It also allows us to make sure that when you create
a file with RML, the PDF document will be created in the same directory as the RML file, and to allow
relative pathnames in the document tag.
The prolog section is common to all XML documents. In addition to this, RML requires another line following
the prolog:
"<document filename="outfile.pdf">"
This line gives the name that you want the output PDF file created with. This line also starts the
document proper - and must be matched by a </document> tag as the last line in the document, in the
same way that an HTML file is bracketed by <HTML> and </HTML>.
The filename you give can just be a simple filename, a relative path (eg ..\..\myDoc.pdf will
create it in the directory two levels up from the one your RML document is in), or a full pathname (eg
C:\output_files\pdf\myProject\myDocument.pdf or
/tmp/user1/myScratchFile.pdf ). If you just supply a filename, the output file will be
created in the same directory as your RML file. (The same principle works with anywhere else you may
need to give a filename - they are relative to where the document lives on your disk, not to where
rml2pdf is).
The <document> tag has three other attributes. compression specifies whether the produced PDF should
be compressed if at all possible. It can take the values 0 | 1 | default for off, on or use the site-wide
default (as specified in reportlab_rl_config). invariant determines whether the produced PDF should be
invariant with respect to the date and the exact contents. It can take the values 0 | 1 | default for off, on
or use the site-wide default (as specified in reportlab_rl_config). debug determines whether debugging/logging
mode should be used during document production. It can take the values 0 | 1 for off or on.
Page 11
RML User Guide Document generated on 2017/06/19 20:18:43
For very simple documents, you need the prolog, followed by a stylesheet and any number of pageDrawings.
A pageDrawing is a graphical element on the page, or simple text string (i.e. it is just placed onto the page in
the location you specify, and no attempt is made to check if it flows off the page).
EXAMPLE 1
<stylesheet>
</stylesheet>
<pageDrawing>
<drawCentredString x="4.1in" y="5.8in">
Hello World.
</drawCentredString>
</pageDrawing>
</document>
Page 12
RML User Guide Document generated on 2017/06/19 20:18:43
This is the most basic RML document you can get. It is the traditional "Hello World". All it does is place the
string of text "Hello World" into the middle of your A4 page. Not very useful in the real world, but enough to
show you how simple RML can be.
Notice how it does have a stylesheet, but it is empty. Stylesheets are mandatory, but they don't need to
actually contain anything. Also notice how in the drawCenteredString tag, the co-ordinates are enclosed
in quotation marks - they are attributes, and so need to live inside quotes. And if you look at the
drawCenteredString tag, these attributes are inside the tag (actually inside the angle brackets), then the
content of the string comes after it, then the tag is closed by its matching </drawCenteredString> tag. All
tags with content need their matching closing tag - the <document> and <stylesheet> tags are also parts
of matching pairs.
One last thing to notice is the DOCTYPE line - for all these examples, we are assuming that the DTD is in the
same directory as the example file itself. This may not always be the case.
For a more complex RML document, you can use the more powerful template/stylesheet/story form of
document. In this, a file contains the following three sections:
a template
a stylesheet
a story
The template tells rml2pdf what should be on the page: headers, footers, any graphic elements you use as a
background.
The stylesheet is where the styles for a document are set. This tells the parser what fonts to use for paragraphs
and paragraph headers, how to format tables and other things of that nature.
The story is where the "meat" of the document is. Just like in a newspaper, the story is the bit you want people to
read, as opposed to design elements or page markup. As such, this is where headers, paragraphs and the actual
text is contained.
EXAMPLE 2
<template>
<pageTemplate id="main">
<frame id="first" x1="72" y1="72" width="451" height="698"/>
</pageTemplate>
</template>
<stylesheet>
</stylesheet>
Page 13
RML User Guide Document generated on 2017/06/19 20:18:43
<story>
<para>
This is the "story". This is the part of the RML document where
your text is placed.
</para>
<para>
It should be enclosed in "para" and "/para" tags to turn it into
paragraphs.
</para>
</story>
</document>
The <pageTemplate>, <pageGraphics>, <frame> and <paraStyle> tags will all be covered in more
detail later on in this guide.
Paragraphs start with a <para> tag and are closed with a </para> tag. Their appearance can be controlled
with the <paraStyle> tag.
RML allows you to use comments in the RML code. These are not displayed in the output PDF file. Just like in
HTML, they start with a "<!--" and are terminated with a "-->". Unlike other tags, comments cannot be
nested. In fact, you can't even have the characters "--" inside the <!-- --> section.
Page 14
RML User Guide Document generated on 2017/06/19 20:18:43
When an RML element has co-ordinates, the co-ordinate origin is the lower left corner. In the case of elements
in a pageGraphic, the origin of the lower left corner of the page. For elements within an
<illustration>, the origin is the lower left corner of the bounding box declared by the
<illustration>.
These co-ordinates (and any other measurements in an RML document) can be given in one of four units. Inches
use the term 'in', centimetres use the term 'cm', and millimetres use the term 'mm'. If no unit is specified, RML
will assume that you are giving a measurement in points - one point is 1/72 of an inch. You can also explicitly
use points with the term 'pt'.
As an example, the following pairs of co-ordinates all refer to the same point. Notice that there is no space
between the number and any unit that follows it.
(4.5in, 1in)
(11.43cm, 2.54cm)
(324, 72)
You can mix and match these units within RML, though it generally isn't a good idea to do so. The co-ordinate
pair (3.5in, 3.5cm) is valid, and won't confuse the RML parser - but it may well confuse you.
The CMYK or subtractive method follows the way a printer mixes three pigments (cyan, magenta, and yellow)
to form colors. Because mixing chemicals is more difficult than combining light there is a fourth parameter for
darkness. A chemical combination of the CMY pigments almost never makes a perfect black - instead
producing a muddy brown - so, to get black printers use a direct black ink rather than use the CMY pigments.
The name CMYK comes from the name of the four colors used: Cyan, Magenta, Yellow and "Key" - a term
sometimes used by printers to refer to black.
Because CMYK maps more directly to the way printer hardware works it may be the case that colors specified
in CMYK will provide better fidelity and better control when printed.
The color names which RML recognizes are mostly drawn from the HTML specification. (For a list of these
color names recognized by RML, see Appendix A).
[NOTE: Currently, while RML supports specifying colors by CMYK value, rml2pdf hasn't yet implemented it.
If you try, you well get a ValueError and the error message "cmyk not implemented yet"].
Page 15
RML User Guide Document generated on 2017/06/19 20:18:43
Fontname-style
where fontname is the name of the font (e.g. Courier), and the style is its appearance (eg, Oblique,
BoldOblique).
The only fonts supplied with Adobe's Acrobat Reader are the "14 standard fonts". These 14 standard fonts are:
Courier
Courier-Bold
Courier-BoldOblique
Courier-Oblique
Helvetica
Helvetica-Bold
Helvetica-BoldOblique
Helvetica-Oblique
Symbol
Times-Bold
Times-BoldItalic
Times-Italic
Times-Roman
ZapfDingbats
Custom fonts can also be used in your document. RML supports TrueType and Type 1 fonts. In order to use
them, make sure they are on the appropriate path and then register them in the <docinit> section at the top of
the RML file.
Use the <registerTTFont> and <registerFont> tags to register them. To use a common set of fonts
together as bold, italic etc., you need to put them into a common grouping using the
<registerFontFamily> tag.
An example of how to use these tags with different font types and styles can be found in the file
rml2pdf/test/test_005_fonts.rml
DrawString has a pair of companions. DrawRightString and drawCentredString both work in the
same way, but right justify the string and center it, respectively.
Page 16
RML User Guide Document generated on 2017/06/19 20:18:43
To set the font that you want a piece of text to be, you need to use the <setFont> tag. This has two arguments
which are required - you need to give it the name of the font, and the size you want it displayed at.
To use all the drawString commands, you need to use a tag called <pageGraphics>. This tag appears at
the start of a RML document, in the pageTemplate section. pageGraphics are the graphics that have to
do with a whole page (rather than just individual illustrations, as we will see later). pageGraphics can be
used to provide a background to a page, to place captions or other textual information on a page, or to provide
logos or other colorful elements. Whatever you use them for, they are always anchored to a spot on the page -
they do not wrap or flow with any text you might put into paragraphs.
Page 17
RML User Guide Document generated on 2017/06/19 20:18:43
The basic types of shape that RML allows you to use are:
rect (rectangle), circle, and ellipse.
A rect needs to have a list of attributes passed to it:
- the co-ordinates for the bottom left hand corner,
- its width and height,
It also has optional fill and stroke attributes, and a round attribute, which tell it if the corners should be
rounded off.
The following example shows various combinations of attributes for each of the basic shapes. Notice how this
example starts with the XML definition - you can get away with not using it, but it is still better to make sure it
is there.
Page 18
RML User Guide Document generated on 2017/06/19 20:18:43
EXAMPLE 3
<template>
<pageTemplate id="main">
<pageGraphics>
<!-- set the font and fill colour for the title. -->
<fill color="red"/>
<setFont name="Helvetica" size="24"/>
<!-- Use drawCentredString to place a title on the page -->
<drawCentredString x="297.5" y="800">
Simple Text and Graphics with RML.
</drawCentredString>
<fill color="red"/>
<!-- look at the output - though a fill color is set, no fill -->
<!-- is produced, since fill is set to "no" for the circle -->
<circle x="127.5" y="672.75" radius="1 in" fill="no"
stroke="yes"/>
<fill color="green"/>
<stroke color="black"/>
<circle x="297.5" y="672.75" radius="1 in" fill="yes"
stroke="no"/>
Page 19
RML User Guide Document generated on 2017/06/19 20:18:43
<fill color="blue"/>
<stroke color="black"/>
<circle x="467.5" y="672.75" radius="1 in" fill="yes"
stroke="yes"/>
<fill color="black"/>
<setFont name="Helvetica" size="9"/>
<drawCentredString x="127.5" y="567.5">
Circle - with stroke, but no fill.
</drawCentredString>
<drawCentredString x="297.5" y="567.5">
Circle - with fill, but no stroke.
</drawCentredString>
<drawCentredString x="467.5" y="567.5">
Circle - with both stroke and fill.
</drawCentredString>
<fill color="red"/>
<ellipse x="77" y="382.25" width="177" height="552.25"
fill="no" stroke="yes"/>
<fill color="green"/>
<stroke color="black"/>
<ellipse x="247" y="382.25" width="347" height="552.25"
fill="yes" stroke="no"/>
<fill color="blue"/>
<stroke color="black"/>
<ellipse x="417" y="382.25" width="507" height="552.25"
fill="yes" stroke="yes"/>
<fill color="black"/>
<drawCentredString x="127.5" y="357">
Ellipse - with stroke, but no fill.
</drawCentredString>
<drawCentredString x="297.5" y="357">
Ellipse - with fill, but no stroke.
</drawCentredString>
<drawCentredString x="467.5" y="357">
Ellipse - with both stroke and fill.
</drawCentredString>
<fill color="black"/>
<drawCentredString x="127.5" y="199.1">
Rect - with stroke, but no fill.
</drawCentredString>
<drawCentredString x="297.5" y="199.1">
Rect - with fill, but no stroke.
</drawCentredString>
Page 20
RML User Guide Document generated on 2017/06/19 20:18:43
<fill color="black"/>
<drawCentredString x="127.5" y="41.25">
Rect - with stroke and round, but no fill.
</drawCentredString>
<drawCentredString x="297.5" y="41.25">
Rect - with fill and round, but no stroke.
</drawCentredString>
<drawCentredString x="467.5" y="41.25">
Rect - with stroke, fill and round.
</drawCentredString>
</pageGraphics>
<frame id="first" x1="0.5in" y1="0.5in" width="20cm"
height="28cm"/>
</pageTemplate>
</template>
<stylesheet>
</stylesheet>
<story>
<para></para>
</story>
</document>
Inside the tag for a shape (such as rect), fill and stroke simply tell rml2pdf whether those qualities should
be turned on. Should there be a fill, or not? Should there be a stroke, or not? That is why the argument is
Boolean - "yes" or "no" (though "1" or "0" are also allowed).
The fill and stroke tags do a different job. The only argument that these tags are allowed is a color. If there
are no fill or stroke tags in a document, both the fill and the stroke for all shapes default to black. If you
have a fill tag before a shape, it allows you to change the color that that shape is filled with. Similarly, a
stroke tag before a shape allows you to set the color that the outline of that shape will be drawn in. If there is
no fill or stroke tag in front of a shape, it will be filled and stroked with the most recently defined fill or
stroke - or failing that, the default black.
Page 21
RML User Guide Document generated on 2017/06/19 20:18:43
This means that you can use one fill tag to refer to many shapes, while changing the stroke for each of
them. Or vice versa.
Another brief example of how the fill and stroke tags look:
<fill color="olivedrab"/>
<stroke color="khaki"/>
If you want to draw more than one line, you can keep passing <lines> more sets of 4 co-ordinates. <lines>
then draws those other separate lines on the page. The lines in a <lines> command are just lumped together in
one <lines> tag for your convenience. (If you want lines that follow on from each other, look at the
"Advanced figures" section later in this manual).
<lines>
2.5in 10.5in 3.5in 10.5in
</lines>
And this starts with the same line, then draws an extra couple of lines below it:
<lines>
2.5in 10.5in 3.5in 10.5in
2.5in 10.25in 3.5in 10.25in
2.5in 10in 3.5in 10in
</lines>
It doesn't matter how you arrange the sets of co-ordinates, but it helps to keep it human-readable if you keep
co-ordinates to do with the same line on the same line of RML. This second example could have been written
like this (but it would be much harder to follow):
<lines>
2.5in 10.5in 3.5in 10.5in 2.5in 10.25in 3.5in 10.25in 2.5in 10in 3.5in 10in
</lines>
One more thing to notice before we move on is that these co-ordinates are separated by spaces. They are not
separated by commas as you might expect.
As well as just drawing lines, there are a number of attributes you can modify to change the appearance of lines.
This is done with the <lineMode> tag.
The most obvious attribute to <lineMode> is width. You can give <lineMode> a number for the width
attribute to change the line width to that number of points.
Page 22
RML User Guide Document generated on 2017/06/19 20:18:43
The join attribute to <lineMode> adjusts how what happens when lines meet. They can either come to a
point, or the vertex can be rounded or squared off into a bevelled join. The possible values for join are round,
mitered, or bevelled.
The cap attribute to <lineMode> adjusts how the ends of lines appear. The end of a line can have a square
end exactly at the vertex, a square end that is extended so it is over the vertex, or a half circle - a rounded cap.
These possible values for cap are default, square or round.
Both the join and cap attributes for <lineMode> are only really visible if the line you are applying them to
is thick.
Another attribute to <lineMode> is dash. This allows you to specify if the line is dotted or dashed. You
supply it a series of numbers (separated by commas), and it takes them as a pattern for how many pixels the line
is on for, and then how many pixels the line is off (i.e. not displayed) for. This can be a simple pattern such as
"1,2" (which gives you a plain dotted line) or "5,5" (which makes the lines sections equal with the spaces), or as
complex as "1,1,3,3,1,4,4,1" (a complex pattern of dots and dashes).
The following example shows examples of most of the attributes that you can use with <lines> and
<lineMode>. Notice how you can use more that one attribute to <lineMode> at the same time.
EXAMPLE 4
<template>
<pageTemplate id="main">
<pageGraphics>
Page 23
RML User Guide Document generated on 2017/06/19 20:18:43
<fill color="red"/>
<!-- notice that each of these "empty" tags are teminated -->
<!-- with a slash -->
<lineMode width="1"/>
<lines>1in 10.5in 2in 10.5in
2in 10.5in 1.5in 10in
1.5in 10in 1.5in 10.75in
</lines>
<fill color="black"/>
<setFont name="Helvetica" size="9"/>
<drawCentredString x="1.5 in" y="9.75 in">
width=1
</drawCentredString>
<lineMode width="5"/>
<lines>2.5in 10.5in 3.5in 10.5in
3.5in 10.5in 3in 10in
3in 10in 3in 10.75in
</lines>
<drawCentredString x="3 in" y="9.75 in">
width=5
</drawCentredString>
<lineMode width="10"/>
<lines>4in 10.5in 5in 10.5in
5in 10.5in 4.5in 10in
4.5in 10in 4.5in 10.75in
</lines>
<drawCentredString x="4.5 in" y="9.75 in">
width=10
</drawCentredString>
<lineMode width="15"/>
<lines>5.5in 10.5in 6.5in 10.5in
6.5in 10.5in 6in 10in
6in 10in 6in 10.75in
</lines>
<drawCentredString x="6 in" y="9.75 in">
width=15
</drawCentredString>
Page 24
RML User Guide Document generated on 2017/06/19 20:18:43
</drawCentredString>
Page 25
RML User Guide Document generated on 2017/06/19 20:18:43
Page 26
RML User Guide Document generated on 2017/06/19 20:18:43
</pageGraphics>
<frame id="first" x1="72" y1="72" width="451" height="698"/>
</pageTemplate>
</template>
<stylesheet>
</stylesheet>
<story>
<para></para>
</story>
Page 27
RML User Guide Document generated on 2017/06/19 20:18:43
</document>
Page 28
RML User Guide Document generated on 2017/06/19 20:18:43
5. Graphics vs Flowables
Both the basic graphical figures and the basic text operations we have seen so far share some properties. All of
them require you to specifically position them at a certain point on a page (or inside a frame) using co-ordinates.
In RML, operations which position elements explicitly on the page using X-Y co-ordinates and other geometric
parameters are called "graphics operations" (or just "graphics"). The other major group of tags in RML are the
"flowables".
Flowables (like paragraphs, spacers, and tables) can appear in a story (or in the <place> tag). Graphics
appear in <pageGraphics> and <illustration>. These two categories cannot be mixed: flowables are
positioned in sequence running down a frame until the frame has no more room and then placed on the next
frame (on the next page if necessary); graphics are explicitly positioned by co-ordinates.
Page 29
RML User Guide Document generated on 2017/06/19 20:18:43
A <template> is the section where the layout of a document is set out - both for the whole document and for
individual pages within it.
Up to now, we have just been using <template> without any options. But the <template> tag has a
number of optional attributes that you can use to set settings for the whole document:
pageSize sets the size of the page. This takes a pair of numbers for the width and the height of the page. If you
don't give it any numbers, it defaults to A4 (the international standard page size which differs from the American
standard page size of letter, but is a standard in other places such as the UK). While this is a sensible default, it's
usually best to explicitly specify a size. Common sizes are (21cm, 29.7cm) or (595, 842) for A4, (8.5in, 11in) for
letter, and (8.5in, 17in) for legal.
rotation sets the angular orientation of the page. This is a float or integer number that should be a multiple of
90. The default value is zero.
leftMargin and rightMargin set the horizontal margins for the page. topMargin and bottomMargin
set the vertical margins for the page.
You can also set the title of the document with the title attribute (which defaults to '(untitled)') and the author
with the author attribute (which defaults to '(unauthored)').
There are also the optional showBoundary and allowSplitting attributes, which can both be set to "0" or
"1" (or "true" and "false"). The showBoundary attribute is off by default, but when it is set to true, it shows
a black border around any frames on the page.
<template> allows you to set options for the whole document. The <pageTemplate> tag allows you to set
options for individual pages. You can have more than one <pageTemplate> inside the template section. This
allows you to have different pageTemplates for each page that requires a different structure. For example,
the title page of a report could have a number of graphics on it while the rest of the pages are more
text-orientated.
Each <pageTemplate> tag must have the mandatory attribute id. This gives the template a name, and allows
both rml2pdf and you to refer to it by name.
The <pageTemplate> tag also allows you to override the rotation and pageSize set by the <template>
tag.
As well as these attributes, you can put any number of <pageGraphics> into a <pageTemplate>
(<pageGraphics> are the containers for the <drawString> and shape-drawing commands we saw
earlier).
In practice, you may have two <pageGraphics> sections inside a <pageTemplate>. The way this is
interperted by RML2PDF is that the first one is carried out before the contents of the story for that page, and the
second one is carried out after the story. This may be of use when you need some elements to overlap others, and
particularly useful when you are using the <includePdfPages> tag. IncludePdfPages places a number of
pages imported from another PDF file into your document, placing them over the content you already have
(including any header and footers you have designed). This may mean it obscures headers, footers or something
else you need on very page. The way around this is to place your headers and footers in a second pageGraphics
section, which ensures that it will appear over anything in your story. Provided you have sensibly defined frames
it won't appear over the main content of your page, but it will appear over the top of your included PDFs
Page 30
RML User Guide Document generated on 2017/06/19 20:18:43
allowing you to have the same look-and-feel for these pages as you do for the rest of your document.
(See section 8.8 ("Integrating with PageCatcher: catchForms, doForm and includePdfPages") for more info on
the <includePdfPages> tag.)
(When you are using text in <para></para> tags, you can use the <nextFrame/> tag to force it into the
next frame on the page. Look at the section on "Advanced text" later in this document for more details on this).
An additional attribute overlapAttachedSpace can be set to 0 or 1 to force the frame to overlap space that
is implicitly attached to flowables by their styles. See section 6.5 on styles. The default value for this attribute is
set using the site wide configuration for reportlab (in reportlab/rl_config.py).
That is what happens on pages with only one frame. On pages that have multiple frames, this tag acts as a
conditional frame break. If the space in the current frame isn't enough, it will break and place what follows in the
next frame rather than on the next page. The tag and its syntax still remain the same.
This tag is particularly useful with large tables, where you want the whole table to be presented on one page
rather than split between two. It can also be used where you have a collection of images, and you want them all
to be on the same page.
Examples:
<condPageBreak height="1in"/>
<condPageBreak height="72"/>
<storyPlace> takes 4 required attributes and one optional one. x, and y are the x and y co-ordinates for
where you want the flowables placed. width and height are the width and height of the flowable. Finally the
origin can be one of page|frame|local. If not specified local is assumed. The origin attribute
Page 31
RML User Guide Document generated on 2017/06/19 20:18:43
Examples:
<pto>
<pto_trailer>
<para textColor="blue" style="pto">
See you on next frame
</para>
</pto_trailer>
<pto_header>
<para textColor="blue" style="pto">
back from the previous frame
</para>
</pto_header>
<para style="h1">A header</para>
<para style="bt">
Many vast star fields in the plane of our Milky Way Galaxy
are rich in clouds of dust, and gas. First and foremost,
visible in the above picture are millions of stars, many
of which are similar to our Sun. Next huge filaments of
dark interstellar dust run across the image and block the
light from millions of more stars yet further across our Galaxy.
</para>
</pto>
The <keepInFrame> tag takes several attributes. maxWidth is the maximum width. If zero then the
available width will be used. maxHeight is the maximum height. If zero then the available height will be used.
frame if specified this should be the name or index of the frame in which the contents should be drawn. The
framechange takse place before widths etc are evaluated. mergeSpace if 1 then adjacent pre and post space
for the content elements will be merged. onOverflow this specifies the action to be taken if the contents is too
large. Allowed values are error ie raise an error, overflow just scrawl all over the page, shrink shrink the
contents to fit the allowed space, & overflow truncate the contents at the borders of the allowed space.
Page 32
RML User Guide Document generated on 2017/06/19 20:18:43
The example below shows how to cram star fields into a one inch square.
The <imageAndFlowables> tag takes several attributes. imageName the name of the image file or path.
imageWidth the width of the image; using 0 will cause the pixel size in points to be used. imageHeight the
height of the image; using 0 will cause the pixel size in points to be used. imageMask a transparency colour or
the word "auto"; this only works for image types that support transparency. imageLeftPadding space to be
used on the left of the image. imageRightPadding space to be used on the right of the image.
imageTopPadding space to be used on the top of the image. imageBottomPadding space to be used on
the bottom of the image. imageSide which side the image should go on; "left" or "right".
Example:
<imageAndFlowables imageName="../doc/images/replogo.gif"
imageWidth="141" imageHeight="90" imageSide="left">
<para style="h1">Test imageAndFlowables tag with paras</para>
<para style="style1">
We should have an image on the <b>right</b>
side of the paragraphs here.
</para>
<para style="style1">
Summarizing, then, we assume that the fundamental error of regarding
functional notions as categorial may remedy and, at the same time,
eliminate the levels of acceptability from fairly high (e.g. (99a)) to
virtual gibberish (e.g. (98d)). This suggests that the theory of
syntactic features developed earlier delimits a descriptive fact. We
have already seen that any associated supporting element is not quite
equivalent to the traditional practice of grammarians. From C1, it
follows that the theory of syntactic features developed earlier can be
defined in such a way as to impose irrelevant intervening contexts in
selectional rules. So far, a descriptively adequate grammar is rather
different from a general convention regarding the forms of the grammar.
</para>
</imageAndFlowables>
Page 33
RML User Guide Document generated on 2017/06/19 20:18:43
paragraph rather than having to type or cut-and-paste large blocks of text over and over for each paragraph.
Each stylesheet starts with the <stylesheet> tag. There may then be an optional initialisation section where
aliases can be set (bounded by the pair of tags <initialize></initialize>). After that come a number
of <paraStyle> tags - each one defining a style that you want to use for paragraphs. The <paraStyle> tag
must have an attribute name, and then may have as many optional attributes as you want, each one setting one
feature of the appearance of a paragraph.
Each one of these <paraStyle> tags is an empty element (i.e. it is closed with a "/>" rather than a separate
closing tag), but you might want to indent the tag so that each of the options is on a separate line. This makes it
easier to see what each style is defining (see the example below for how this looks).
One attribute for <paraStyle> that isn't the same as those used by <para> is the parent attribute. Once
you have defined a style using a <paraStyle> tag, you can use those settings as a basis for other styles.
parent allows one style to inherit from another.
The other attribute that isn't shared by the <para> tag is backColor. As you can probably guess, this
attribute sets a background color for the paragraph it is describing.
The following optional attributes for <paraStyle> are the same as those for the <para> tag - you can find
more description of them in the "Advanced text" section below:
fontName, fontSize, leading, leftIndent, rightIndent, firstLineIndent,
alignment, spaceBefore, spaceAfter, bulletFontName, bulletFontSize,
bulletIndent, textColor.
<stylesheet>
<initialize>
<alias id="style.normal" value="style.Normal"/>
</initialize>
<paraStyle name="h1"
fontName="Courier-Bold"
fontSize="12"
spaceBefore="0.5 cm"
/>
<paraStyle name="style1"
fontName="Courier"
fontSize="10"
/>
<paraStyle name="style2"
parent="style1"
leftIndent="1in"
/>
<paraStyle name="style7"
parent="style1"
leading="15"
leftIndent="1in"
rightIndent="1in"
/>
</stylesheet>
Page 34
RML User Guide Document generated on 2017/06/19 20:18:43
stylesheets also allow you to define styles for other tags - you can define styles for blockTables with the
<blockTableStyle> tag, or the various form creation elements (checkBoxes, letterBoxes and
textBoxes) with the boxStyle tag. Refer to the sections on blockTables and Form Field Tags later in
this document for details on how to use these.
Page 35
RML User Guide Document generated on 2017/06/19 20:18:43
7. Advanced text
7.1. Title
The <title> tag sets the title for a document, or a section of a document, and displays it on the page. By
default, this is set in a larger typeface than the body text (in a similar way that headers are). You can change the
way a title is set by setting a style called style.Title (in the stylesheet section of your document).
[Note: This tag does not affect what is displayed in the "title bar" at the top of a document.]
Example:
<stylesheet>
<paraStyle name="style.Title"
fontName="Courier-Bold"
fontSize="36"
leading="44"
/>
</stylesheet>
<story>
<title>This is the Title</title>
<para>
And it should be set in 36 pt Courier Bold.
</para>
</story>
To do this you place your text inside the story section of an RML document, and use the <para> and
</para> tags to tell the parser where each paragraph starts and ends.
As well as delineating where paragraphs begin and end, the <para> tag can also have a number of optional
attributes:
style:
If you have set up a style in the stylesheet section of a document, you can refer to them by name by using the
style attribute. For example, if you have defined a style called Normal, you can have your paragraph appear
in that style by using <para style="Normal">.
alignment:
How the text is aligned within the paragraph. It can be LEFT, RIGHT, CENTER (or CENTRE) or JUSTIFY.
fontName, fontSize:
Page 36
RML User Guide Document generated on 2017/06/19 20:18:43
fontName and fontSize set the name and size of the font that you want this paragraph displayed in. (This
can often be better done using the <paraStyle> tag inside a <stylesheet>, and then using the <style>
tag to apply it to that paragraph). Example: <para fontName="Helvetica" fontSize="12">
leading:
leading is used is used to alter the space between lines. In RML, it is expressed as the height of a line PLUS
the space between lines. So if you are using 10 point font, a leading of 15 will give you a space between lines of
5 points. If you use a number that is smaller than the size of font you are using, the lines will overlap.
leftIndent, rightIndent:
leftIndent and rightIndent apply space to the left or right of a paragraph which is in addition to any
margin you have set.
firstLineIndent:
firstLineIndent is used when you want your paragraph to have an additional indent on the first line - on
top of anything set with leftIndent.
spaceBefore, spaceAfter:
spaceBefore and spaceAfter, as you would expect, set the spacing before a paragraph or after it.
textColor:
This sets the color to be used in displaying a paragraph.
Inside the story, you can also do a number of things that you can't do with the drawString commands. For a
start, you can use bold, italics and underlining. If you are familiar with HTML, you will recognize these tags -
<i> and </i> start and stop italics, <b> and </b> start and stop the text being set as bold, and <u> and </u>
start and stop underlining.
<para>
<sub>This is subscript.</sub>
This is normal text.
<super>This is superscript.</super>
Page 37
RML User Guide Document generated on 2017/06/19 20:18:43
</para>
<para>
<sub size="6" rise="5">This is subscript.</sub>
This is normal text.
<super size="6" rise="5">This is superscript.</super>
</para>
produces this:
7.6. Lists
RML supports ordered and unordered lists, using the tags <ol> <ul> and <li>. They work in a similar way to
their HTML equivalents. A list item can be any normal flowable element but there can be only one such item
within a pair of list item tags. Lists can be nested.
WARNING: The contents of a list are flowable objects, and the list itself does not know what font sizes or
spacing you will use in the enclosed paragraphs. Therefore, if you want to get normal typography, it's very
important to define a <listStyle> with font names, size and spacing matching that of the <paraStyle> you use for
the enclosed text.
You should also be aware that RML's <para> tag already has a flexible feature named the `bullet` which can
provide bulleted, numbered and definition lists which match the corresponding text. In general lists should only
be used when you are transforming in a mapping from HTML, or when you need to place arbitrary flowables
such as tables or images in the body of a list.
Lists and list items can be styled using tag attributes or with <listStyle> tags in the stylesheet section. See the
rml.dtd for the full list of attributes on the <ul> <ol> and <li> tags using LIST_MAIN_ATTRS.
In ordered lists, you can use the following types of enumeration in the bulletType or start attributes:
Unordered lists can use bullet types of the following shapes by setting the 'start' attribute in <ul> or the 'value'
attribute in <li> tags:
bulletchar
square
disc
diamond
diamondwx
circle
Page 38
RML User Guide Document generated on 2017/06/19 20:18:43
blackstar
squarers
arrowhead
As a final possibility blank separated strings of the possible starts can be used to indicated that automatic depth
changes should be attempted.
The size, colour and position (indenting, space before/after etc.) of bullets and enumerations can be adjusted
with the relevant tag attributes. List item attributes override the attributes on <ol> or <ul> tags.
<story>
<ol bulletColor="red" bulletFontName="Times-Roman">
<li bulletColor="blue" bulletFontName="Helvetica">
<para>
Welcome to RML 1
</para>
</li>
<li>
<ul bulletColor="red" bulletFontName="Times-Roman" bulletFontSize="5" rightIndent="10">
<li bulletColor="blue" bulletFontName="Helvetica">
<para>
unordered 1
</para>
</li>
<li>
<para>
unordered 2
</para>
</li>
</ul>
</li>
</ol>
</story>
You can control the automatic switch of frames by using the <setNextFrame/> tag. The required name
attribute can be used to specify the name or index of the frame which you wish to switch to. The
<setNextFrame/> tag is an "empty" or "singleton" tag - it doesn't take any content. Put in
<setNextFrame name="F5"/> and your text will flow into the frame specified. It should appear outside
your paragraphs - between one </para> and the next <para> tag.
Page 39
RML User Guide Document generated on 2017/06/19 20:18:43
If you have defined more than one kind of template (by using <pageTemplate> in the template section at the
head of the RML document), you can also force RML into using a new template for the next page. You do this
by using the <setNextTemplate> tag. This tag has only one attribute - the mandatory one of name, which
tells RML which template it should use.
In practice, you would usually set the next template and then use a nextFrame:
<setNextTemplate name="yetAnotherTemplate"/>
<nextFrame/>
You can also pass a style to the <pre> tag. If you don't use the optional style attribute, anything between the
<pre> tag and the </pre> tag will appear in the default style for pre-formatted text. This uses a fixed width
"typewriter" font (such as courier), and is useful for things such as program listings, but may not be what you
want for your quotation or whatever. If you have already defined a style (in the stylesheet section of your
RML document), then you can make the <pre> tag use this for your pre-formatted text.
Example:
<xpre style="myStyle">
this is pre-formatted text.
</xpre>
The xpre is similar to the pre tag in that it preserves line breaks where they are placed in the text, but xpre
also permits paragraph annotations such as bold face and italics and font changes. For example, the following
mark-up
<xpre>
this is an <i>xpre</i> <b>example</b>
<font color="red">including red text!</font>
</xpre>
Example:
In physics, Planck's formula for black body radiation can be expressed as:
Page 40
RML User Guide Document generated on 2017/06/19 20:18:43
R<greek>l</greek>=(c/4) (8<greek>p</greek>/<greek>l</greek><super>4</super>)
[ (hc/<greek>l</greek>) 1/e<super>hc/<greek>l</greek>kT</super>-1 ]
For a table of the Greek letters used by the <greek> tag and their representations in RML, look in Appendix C
at the end of this manual.
This next example show features from several of the commands describes in the previous sections; such as the
use of frames, the options to the template tag, stylesheets, and so on. See the next section for
information on using the <name> and <getName> tags.
EXAMPLE 5
<pageTemplate id="main">
<pageGraphics>
</pageGraphics>
<frame id="titleBox" x1="2.5cm" y1="27.7cm" width="16cm"
height="1cm"/>
<frame id="columnOne" x1="2.5cm" y1="2.5cm" width="7.5cm"
height="24.7cm"/>
<frame id="columnTwo" x1="11cm" y1="2.5cm" width="7.5cm"
height="24.7cm"/>
</pageTemplate>
</template>
<stylesheet>
<initialize>
<name id="FileTitle" value="Example 5 - templates and
pageTemplates"/>
<name id="ColumnOneHeader" value="This is Column One"/>
<name id="ColumnTwoHeader" value="This is Column Two"/>
</initialize>
<paraStyle name="titleBox"
fontName="Helvetica-Bold"
fontSize="18"
spaceBefore="0.4 cm"
alignment="CENTER"
Page 41
RML User Guide Document generated on 2017/06/19 20:18:43
/>
<paraStyle name="body"
fontName="Helvetica"
fontSize="10"
leftIndent="5"
spaceAfter="5"
/>
</stylesheet>
<story>
<para style="titleBox">
<b><getName id="FileTitle"/></b>
</para>
<nextFrame/>
<condPageBreak height="144"/><h2>
<getName id="ColumnOneHeader"/>
</h2>
<para>
This is the contents for <b>column one</b>.
</para>
<para>
It uses the default style for paragraph.
</para>
<para>
Does it come out OK?
</para>
<para>
There now follows some random text to see how these paragraphs
look with longer content:
</para>
<para>
Blah blah morale blah benchmark blah blah blah blah blah blah
communication blah blah blah blah blah blah blah blah blah
blah stretch the envelope blah blah blah.
</para>
<para>
Blah blah blah blah blah blah blah blah blah blah blah blah
architect blah inter active backward-compatible blah blah blah
blah blah. Blah blah blah blah value-added.
</para>
<para>
Blah blah blah blah blah blah blah blah blah re-factoring
phase blah knowledge management blah blah. Blah blah blah blah
interactive blah vision statement blah.
</para>
<para>
Blah blah blah blah blah blah conceptualize blah downsize blah
blah blah blah. Blah blah blah blah blah blah blah blah blah
blah blah blah synergy client-centered vision statement.
</para>
<para>
Blah blah dysfunctional blah blah blah blah blah blah blah
appropriate blah blah blah blah blah blah blah blah
Page 42
RML User Guide Document generated on 2017/06/19 20:18:43
<nextFrame/>
<condPageBreak height="144"/>
<h2>
<getName id="ColumnTwoHeader"/>
</h2>
<para style="body">
This is the contents for <i>column two</i>.
</para>
<para style="body">
It uses the paragraph style we have called "body".
</para>
<para style="body">
Does it come out OK?
</para>
<para style="body">
There now follows some random text to see how these paragraphs
look with longer content:
</para>
<para style="body">
Blah OS/2 blah blah blah blah coffee blah blah blah blah
Windows blah blah blah blah blah blah blah. Blah blah blah
blah blah blah blah Modula-3 blah blah blah. Blah blah bug
report blah blah blah blah blah memory blah blah TeX TCP/IP
SMTP blah blah.
</para>
<para style="body">
Blah blah blah blah blah Em blah letterform blah blah blah
blah blah blah blah blah blah letterform blah blah. Blah blah
blah blah leader blah blah blah blah.
</para>
<para style="body">
Blah blah blah blah blah uppercase blah blah right justified
blah blah blah flush-right blah blah blah. Blah blah blah blah
blah blah spot-colour blah Em.
</para>
<para style="body">
Blah dingbat blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah. Blah blah blah blah blah drop-cap
blah blah blah blah blah blah blah.
</para>
</story>
</document>
Page 43
RML User Guide Document generated on 2017/06/19 20:18:43
The most robust technique is to include the standard Asian fonts Adobe specifies for use with Acrobat Reader.
These will already be installed on the end user's machine if they have a localized copy of Acrobat Reader, or
may be downloaded in the free "Asian Font Packs" from Adobe's site. In these cases there is no need to embed
any fonts or to have any special software on the server. The first stage is to declare the fonts you need in the
optional 'docinit' tag at the beginning of the document as follows:
<document filename="test_015_japanese.pdf">
<docinit>
<registerCidFont faceName="HeiseiMin-W3"/>
</docinit>
<template ...>
etc.
Note: The encName attribute of registerCidFont is deprecated: you should not use it with new
documents.
You may then declare paragraph styles, use string-drawing operations or blockTable fonts referring to the font
you have defined:
Page 44
RML User Guide Document generated on 2017/06/19 20:18:43
<paraStyle name="jtext"
fontName="HeiseiMin"
fontSize="12"
leading="14"
spaceBefore="12" />
The test directory includes a file test_015_japanese.rml containing a working simplified example in Japanese.
Warning: You will need to have a number of CMap files available on your system. These are files provided by
Adobe which contain information on the encodings of all the glyphs in the font. RML2PDF looks for these in
locations defined in the CMapSearchPath variable in the file reportlab/rl_config.py, which knows
where to find Acrobat Reader on most Windows and Unix systems. If you wish to use Asian fonts on another
system, you can copy these files (which may be redistributed freely) from a machine with Acrobat Reader on to
your server.
Editor's note at 28/12/2002 - there is a great deal of information on fonts which needs adding to this manual
including embedded Type 1 fonts and encodings and use of embedded subsetted TrueType fonts
Page 45
RML User Guide Document generated on 2017/06/19 20:18:43
8.1. pageNumber
As you'd expect from the name, this tag adds page numbers to your document. This has nothing tricky to
remember - all you have to do is put the a <pageNumber/> tag where you want the page number to appear.
<name> has three attributes: id and value are required, but type is optional. <getName> only has one
attribute (id), and this is required so that it knows which name to "yank".
<stylesheet>
<initialize>
<name id="YourVariableName"
value="Type anything you want between these quotes..."/>
</initialize>
</stylesheet>
<story>
<para>
<b><getName id="YourVariableName"/></b>
</para>
</story>
You can also use the <name> tag inside the story of a document. In this case, as well as setting the value for the
variable, it is also displayed on the page (i.e. the name has a "textual value").
<seq/>
<seqDefault id="myID"/>
<seqReset/> or <seqReset id="myID"/>
<seqChain order="id0 id1 id2...idn"/>
<seqFormat id="myID" value="i"/>
Page 46
RML User Guide Document generated on 2017/06/19 20:18:43
With <seqReset>, the id is an optional attribute. However, it is still best to use it to save confusion.
The <seqChain order="id0 id1 id2"/> tag is used to make multi sequence use easier. When
sequence id0 is changed sequence id1 is reset; likewise when sequence id1 is changed sequence id2 is reset
and so on for the identifiers in the order attribute.
The tag <seqFormat id="myID" value="i"/> is used to associate a numbering format to myID. The
allowed values for the value attribute are given in the table below.
Value Meaning
1 Decimal
i Lowercase Roman
I Uppercase Roman
a Lowercase Alphabetic
A Uppercase Alphabetic
EXAMPLE 6
<template>
<pageTemplate id="main">
<frame id="first" x1="72" y1="72" width="451" height="698"/>
</pageTemplate>
</template>
<stylesheet>
</stylesheet>
<story>
<h1>
seq in seq, seqDefault and seqReset
</h1>
<para>copied: <seq id="spam"/>, <seq id="spam"/>, <seq id="spam"/>.
Reset<seqReset id="spam"/>. <seq id="spam"/>, <seq id="spam"/>,
<seq id="spam"/>.</para>
<h2>
<i>simple use of seq</i>
</h2>
<para>
First seq: <seq/>
</para>
<para>
Second seq: <seq/>
</para>
<spacer length="6"/>
<para>
Page 47
RML User Guide Document generated on 2017/06/19 20:18:43
<seqReset/>
We have just done a <seqReset/>
</para>
<spacer length="6"/>
<para>
First seq after seqReset: <seq/>
</para>
<para>
second seq after seqReset: <seq/>
</para>
<spacer length="6"/>
<para>
If you are going to use multiple seq tags,
you need to use the "id" attribute.
</para>
<h2>
<i>Better use of seq</i>
</h2>
<para>
<seqDefault id="test"/>
We have just done a <seqDefault id="test"/>
</para>
<para>
<seqReset id="test"/>
We have just done a <seqReset id="test"/>
</para>
<spacer length="6"/>
<para>
First seq: <seq id="test"/>
</para>
<para>
Second seq: <seq id="test"/>
</para>
<spacer length="6"/>
<para>
<seqReset id="test"/>
We have just done a <seqReset id="test"/>
</para>
<spacer length="6"/>
<para>
First seq after seqReset: <seq id="test"/>
</para>
<para>
second seq after seqReset: <seq id="test"/>
</para>
<h2>
<i>Using two seqs independently</i>
</h2>
<para>
<seqReset id="testOne"/>
We have just done a <seqReset id="testOne"/>
</para>
<para>
<seqReset id="testTwo"/>
We have just done a <seqReset id="testTwo"/>
</para>
Page 48
RML User Guide Document generated on 2017/06/19 20:18:43
<spacer length="6"/>
<para>
First seq for testOne: <seq id="testOne"/>
</para>
<para>
Second seq for testOne: <seq id="testOne"/>
</para>
<spacer length="6"/>
<para>
First seq for testTwo: <seq id="testTwo"/>
</para>
<para>
Second seq for testTwo: <seq id="testTwo"/>
</para>
<spacer length="6"/>
<para>
<seqReset id="testOne"/>
We have just done a <seqReset id="testOne"/>
</para>
<spacer length="6"/>
<para>
First seq after seqReset for testOne: <seq id="testOne"/>
</para>
<para>
second seq after seqReset for testOne: <seq id="testOne"/>
</para>
<spacer length="6"/>
<para>
First seq after seqReset for testTwo: <seq id="testTwo"/>
</para>
<para>
second seq after seqReset for testTwo: <seq id="testTwo"/>
</para>
<spacer length="15"/>
<para>
Notice how resetting testOne doesn't affect testTwo at all.
</para>
</story>
</document>
Page 49
RML User Guide Document generated on 2017/06/19 20:18:43
One more sophisticated use for using these tags is for multiple page counters. If you have a document where you
need different sections numbered separately from the main body of a document (perhaps for introductory matter
such as the contents and preface of a book), this can be done with a named seq tag.
The page counter as used by the pageNumber tag is a 'unique value' which depends on the actual physical
number of pages. If rather than using a pageNumber tag, you instead use something like <seq
id="pageCounter"/> , you have the ability to use <seqReset id="pageCounter"/> in between
sections so that each chapter has pages numbered from the start of that chapter rather than the start of the
document. If you use a different template for each chapter, this can then give you page numbers in the format
"1-12" rather than just "12" (where you are on page 12 of the document, which is page 12 of chapter 1).
8.4. Entities
Page 50
RML User Guide Document generated on 2017/06/19 20:18:43
In example 6, we saw our first use of entities. In RML, you can't use the characters "<", ">" or "&" inside any
display elements such as drawString or para. If you do, rml2pdf will assume that they are tags and attempt
to interpret them. Since they won't be valid RML tags, you will just end-up getting an error message along the
lines of "Error: Start tag for undeclared element <YourNonValidTag>".
8.5. Aliases
Aliases allow you to assign more than one name to a paragraph style.
Example:
<alias id="alreadyDefinedStyleName" value="myNewStyleName"/>
You can give a more descriptive name to a style. So you can define a number of paragraph styles called things
like "ItalicBold" or "DesignerOneParagraphStyleTwo" in the stylesheet for your document.
You can then assign aliases to these styles using names that describe the role they fill in your document such as
"pictureCaption", "abstract", "acknowledgement" and so on.
If at any point you decide to change the style for that kind of paragraph, you can then change it in one alias
rather than in every individual paragraph that uses that style.
A CDATA section is started with the characters "<![CDATA[" and is closed off with the characters "]]>". It
can appear inside any flowable - though it is most useful inside a <pre> tag.
CDATA may be useful in places where you have large quantities of "<" and ">" characters that you want to
display in your PDF, and that you would rather not have to convert them all to "<" and ">" entities.
Quoting sections of RML, XML, or HTML code is an example of a good place to use CDATA - if you needed to
revise the code example at a later date, you would have to convert the characters in every tag into entities.
CDATA saves you having to do this.
However, you should only use CDATA when necessary. If you are using other XML tools, they will also ignore
anything inside a CDATA section.
Example:
Page 51
RML User Guide Document generated on 2017/06/19 20:18:43
<xpre>
<![CDATA[
Anything could go here. <non_existant_tags/>, "&" signs.
Whatever you want. RML ignores it.
]] >
</xpre>
plugInGraphic
A plugInGraphic identifies a function (callable) in a module which takes a canvas and a data string as
arguments and presumably draws something on the canvas using information in the data string.
Example:
import mymodule
mymodule.myfunction(canvas, "data string")
using the current canvas object.
<PlugInGraphic> has two mandatory attributes: module and function. It is used in the
<pageGraphics> section of your document.
plugInFlowable
A plugInFlowable identifies a function (callable) in a module which takes a canvas data string as an
argument and returns a flowable object :
Example:
import mymodule
flowable=mymodule.myfunction("data string")
story.append(flowable)
using the current canvas object.
plugInFlowable has two mandatory attributes: module and function. It is also used in the
<pageGraphics> section of your document.
often be a one-off design-time step. Once PageCatcher has extracted a page, it archives it in a data file as
formatted form data. (The default name for this file is "storage.data").
If you have full production versions of both RML2PDF and PageCatcher you can use the <catchForms> tag
to import all forms from a PageCatcher storage file for use in your RML document.
Example:
This example takes the form called PF0 (a page "caught" by PageCatcher and stored in the file storage.data) and
draws it into your document as a page backdrop.
<pageDrawing>
<catchForms storageFile="storage.data"/>
<doForm name="PF0"/>
</pageDrawing>
The <catchForms> tag is a drawing operation, and can occur anywhere in your RML document where a
<doForm> tag can occur. (For example, you can use a <catchForms> inside the flow of a story by using it
inside an <illustration>). The <catchForms> tag has one mandatory argument (storageFile) which
gives the name of the PageCatcher storage file to extract the form from.
One small point to remember is that if you are using multiple forms from the same data file, you only need to use
the actual <catchForms> tag once. To actually put the captured data into your document, you would use
multiple instances of the <doForm> tag. Notice how this works in the example below:
If you do use repeated <catchForms> tags to point at the same data file, you will get an error message similar
to the one below.
If this is the case, find the places where you are using the second and subsequent <catchForms> tags and
delete them, leaving only the <doForm> tags. (Of course, this doesn't apply to any doForms which are
pointing at other data files. They would still need their own initial <catchForms> tags).
[Note: For the <catchForms> tag to work, you must have PageCatcher installed. In addition, your
PageCatcher must be the full version with a .py or .pyc file. The *.exe version of PageCatcher will not work with
RML2PDF. If you get the error message "ImportError: catchForms tag requires the PageCatcher product
http://www.reportlab.com", then you either do not have PageCatcher installed, or have the wrong version].
In some circumstances, you may not know how many pages there will be in the PDF file you need to pageCatch.
This is the case which <includePdfPages> tag was designed for.
Page 53
RML User Guide Document generated on 2017/06/19 20:18:43
<includePdfPages> is a generic flowable, which means that it can appear at any point in the story.
<includePdfPages filename="mypdffile.pdf"/>
This will take the PDF file called "mypdffile.pdf", use pageCatcher behind the scenes and include every page in
the PDF file in your output. There is also an optional "pages" attribute. This can have either individual pages or
ranges. The following are all valid (providing the PDF file is long enough).
<includePdfPages filename="mypdffile.pdf"/>
<includePdfPages filename="mypdffile.pdf" pages="1"/>
<includePdfPages filename="mypdffile.pdf" pages="1,2,3"/>
<includePdfPages filename="mypdffile.pdf" pages="2,1,1,2,2"/>
<includePdfPages filename="mypdffile.pdf" pages="1-5"/>
<includePdfPages filename="mypdffile.pdf" pages="1,2,4-5"/>
There are a number of differences between this tag and the other PageCatcher related tags. Unlike the others,
includePdfPages doesn't require you to pre-pagecatch the file you intend to use (so saving you an additional
step). It also differs in that the imported PDF gets drawn "over the top" of your exiting document, rather than
being used as a background underneath your existing page. So if you have a header or footer in your page
template, the included PDF page will overwrite it.
When you have an includePdfPages tag in your RML file, RML outputs a page break before the first new page,
leaving you on the same page as the last imported one. This allows you to do template switching:
<setNextTemplate>
<setNextTemplate name="myIncludePagesTemplate"/>
<includePdfPages filename="mypdffile.pdf" pages="1,2,3"/>
<setNextTemplate name="myNormalTemplate"/>
<nextFrame/>
<para>
This text appears on the next normal (non-included) page of your
document)
</para>
This snippet switches to a new page template for use with your included pages, adds in the first three pages from
your PDF file, switches back to what is presumably the template you have been using throughout the rest of the
document, and outputs a line of text into the next "normal" page of your document. If you don't want any headers
or footers behind your PDF pages, define a page template called something like "blank" (in the template
section at the head pf your document) with a single frame and no decoration on it and use that. If you are content
for your included pages to appear over the template you have been using on the previous pages (if the included
pages don't have any headers and footers and have large enough margins not clash with the ones you are using in
your document, for example), then you can skip both of the setNextTemplate tags completely.
The nextFrame tag is used because the includedPdfPages places you at the top of the last included PDF
page. This allows you to flow paragraphs or other flowables down your last page. This may be useful if you want
to place text in a form, or use some other pre-prepared background for your text. If all you want to do is just drop
in a pre-made page, you need this nextFrame to kick you into the next normal page and continue with your
document normally
Page 54
RML User Guide Document generated on 2017/06/19 20:18:43
Look in section 7.6 ("Using multiple frames") for more info on the nextFrame and setNextTemplate
tags. Look at the file test\test_016_pagecatcher.rml for an example of this tag in use.
8.9. Outlines
It can go in either graphics or in a story. (Assigning outline levels to parts of your document (such as
paragraphs) allows you to build up a hierarchical structure for your document).
The level specifies how deep in the outline the entry appears. The default level is 0.
closed, if set, hides any children of this outline entry by default. Closed takes Boolean arguments.
Example:
A note about levels: in order to add a level 3 outline entry, the previous outline entry must be at least level 2
(2,3,4...). In other words, you can "move back" any number of levels, but you can only "move forward" one
level at a time.
All these form elements share a lot of features when it comes to what they look like in the document. They all
appear as a rectangular shape with some background and border colour, plus some width for the border itself.
They also have some sort of text label attached to this rectangle to describe the field's purpose in the context of
the report to the human reader. The text inside the field as well as the one in the attached label also should have
the usual properties like fontname and size and colour. All form field elements have a boxStyle attribute that
Page 55
RML User Guide Document generated on 2017/06/19 20:18:43
can be used to group attribute names and values and reuse them in many field elements with much less typing
effort.
But there are also specific features that distinguish these form elements from each other. A checkbox does not
contain text, but only a cross (when checked), and a textbox contains one or more lines of text with different
possible alignments, while letterboxes are used for single line mono-space text with visible subcompartments for
each letter.
Checkboxes
By default, checkboxes have a very simple style similar to UK bank application forms - an outer rectangle and a
cross which exactly fills it when checked. The attributes control the appearance.
It is also possible to supply your own pair of bitmap images which will be used instead of the default drawing
mechanism - this could be used to provide 3d effects, tick-and-cross icons or whatever is needed. To make use of
this, set the two attributes graphicOn and graphicOff to point to two bitmap files on the disk; these will be
used in preference to the default appearance. Note that they will be stretched to the boxWidth and boxHeight
stated, so it is important to set the same aspect ratio as the underlying image. Also, remember the printing intent
- a 24 pixel bitmap drawn to occupy a 12 point space on a form will be visibly grainy on a good quality printer,
but may be fine on an inkjet.
Because checkboxes do not contain text it can be argued that when they are to be displayed as checked the cross'
colour should be the same as the border colour. Equally well it can be argued that it should be the same colour
used for text in textboxes. To provide both options checkboxes have an additional colour attribute named
checkStrokeColor which will be used for the cross instead of the border colour if the former is provided.
Note that the label attached to a checkbox is limited to three lines of text now and always appears at the right
margin of the box, but this might be generalised in future versions. The label is expected to be vertically
centered with the box no matter how many lines it is composed of.
The following code creates a row of sample checkboxes providing different values for the most relevant
attributes:
Page 56
RML User Guide Document generated on 2017/06/19 20:18:43
line1="desc 1"
line2="desc 2"
checked="1"/>
desc 1
desc 1
desc 2
desc 2
desc 3
Textboxes
A textbox contains one, but often more lines of text, like in an address field. (Of course, it can also contain no
text at all, like for a signature field.) Sometimes it is not clear in advance exactly how much text will go into one
such field. Therefore, textbox fields in RML provide a means for automatically resizing the fontsize to shrink the
contained text by exactly what is needed to make it fit into the box. This is a two-step process that first tries to
shrink the fontsize to make the text fit horizontally. If that is not enough, it is further shrinked to make it also fit
vertically. This process is controlled using the attribute shrinkToFit.
Because human readers are very sensible to reading text and get quickly irritated when it does not feel "right",
there is a default amount of space (1 point) left between the text and any of the borders of the box, which will be
respected by the resizing mechanism. This is hardcoded now, but might become another attribute in the future.
The following code creates a row of sample textboxes illustrating different values for the most relevant
attributes: as well as the auto-resizing text feature:
Page 57
RML User Guide Document generated on 2017/06/19 20:18:43
The following code creates a row of sample textboxes illustrating the auto-resizing text feature:
Letterboxes
Letterboxes are intended for single-line text fields where each letter is contained in a subcell, clearly seperated
from neighbouring cells. This is often seen on official forms where people are expected to write letters of a
word at predefined positions. RML provides such letterboxes, too, and they behave mostly like textboxes, but
show some significant differences, too.
Usually, the overall width of a form field element is defined by the mandatory boxWidth attribute. For
letterboxes, though, this is an optional attribute and specifies the width of a subcell containing one letter. The
resulting width of the entire box is defined as a multiple of that boxWidth attribute with another one named
count, which is a mandatory attribute.
The following code creates a row of sample letterboxes showing basic attributes:
Page 58
RML User Guide Document generated on 2017/06/19 20:18:43
l e t t e r b o x e s
m o r e l e t t e r b
l e t t e r b o x e s
some label
l e t t e r b o x e s
some label
l e t t e r b o x e s
some label
l e t t e r b o x e s
There may also be instances where you want obvious dividers between each subcell, but you don't want entirely
separate boxes. Letterboxes have something that allows for this - the optional combHeight attribute.
In a 'standard' letterBoxes element (ie one where the combHeight isn't specified), the divider between each
individual subcell is a line which fills the whole height of the letterBoxes box. If you specify the combHeight,
you can vary the height of this line. This attribute must be a number between zero and one, where "0" means no
Page 59
RML User Guide Document generated on 2017/06/19 20:18:43
divider at all and "1" means one that is the whole height of the letterboxes element (and therefore "0.25" is a
quarter of the height and so on).
The following code creates a row of sample letterboxes showing the combHeight attribute in use:
combHeight
c o m b c o m b c o m b c o m b
As we've already mentioned, checkBox, textBox and letterBoxes all allow you to re-use styles in a
similar way to the way you can re-use styles with paragraphs with the boxStyle tag. Like the other style tags
(paraStyle and blockTableStyle), boxStyle lives in the stylesheet section, near the start of your
document.
name:
This is the required attribute which allows you to refer this style by name.
alias:
An optional attribute which allows you to refer to your style by another name.
parent:
If this is supplied, it must refer to the name of another style. This style with then inherit from the style named.
fontName:
An optional attribute, this refers to the font to be used for the main contents of letterboxes or a textbox - it is
ignored for checkBoxes.
fontSize:
This optional attribute sets the size for the main contents of letterboxes or a textbox - it is ignored for
checkBoxes.
Page 60
RML User Guide Document generated on 2017/06/19 20:18:43
alignment:
For letterboxes or a textbox, this optional attribute sets the alignment of the contents of the box. It may be either
LEFT, RIGHT, CENTER or CENTRE. It is ignored for checkBoxes.
textColor:
An optional attribute that sets the colour for the main contents in the letterboxes or textbox.
labelFontName:
The (optional) tag specifying the font to be used for the label of the letterboxes, textbox or checkBox.
labelFontSize:
The (optional) tag specifying the size of the font to be used for the label of the letterboxes, textbox or checkBox.
labelAlignment:
The (optional) specifying the alignment of the label - may be LEFT, RIGHT, CENTER or CENTRE
labelTextColor:
An optional attribute specifying the colour to be used for the text of the label of an textBox, letterBox or
checkBox.
boxFillColor:
An optional tag specifying the colour to be used for the background for a textBox, letterBox or checkBox.
boxStrokeColor:
An optional tag specifying the colour to be used for the lines making up a textBox, letterBox or checkBox.
cellWidth:
An optional tag, specifying the width of a "cell" in a form element. Must be a measurment, but may 'in', 'cm',
'mm'or 'pt' - see the section on 'Coordinates and measurements' for more details on measurements.
cellHeight:
An optional tag, specifying the width of a "cell" in a form element. Must be a measurment, but may 'in', 'cm',
'mm'or 'pt'
Some Examples
As an example of them in use, let's set up two boxStyles, and see what effect they have on letterBoxes,
textBoxes and a checkBox.
<boxStyle name="special1"
labelFontName="Helvetica"
fontSize="10"
alignment="RIGHT"
textColor="red"
fontName="Helvetica"
labelFontSize="10"
labelAlignment="RIGHT"
labelTextColor="blue"
boxStrokeColor="red"
boxFillColor="pink"/>
<boxStyle name="special2"
parent="special1"
fontName="Courier"
Page 61
RML User Guide Document generated on 2017/06/19 20:18:43
fontSize="12"
textColor="green"
labelFontName="Courier"
labelFontSize="12"
labelTextColor="green"
boxFillColor="yellow"
boxStrokeColor="red"/>
Barcodes
One other tag that may often find use on forms is the barCode tag. As its name implies, this creates a barcode
in one of a number of different symbologies.
The three attributes you need to supply for this tag are x and y to position it on the page and code to inform
rml2pdf which form of barcode you require.
This is a brief example of what a barcode tag looks like in use, and what it actually produces:
This table shows you the allowed names for the code attribute, along with an example of the barcode produced.
Code 11 Code11
Code 39 Standard39
Code93 Standard93
Page 62
RML User Guide Document generated on 2017/06/19 20:18:43
I2of5 I2of5
MSI MSI
textField
textField Attributes
Attribute Meaning Default
name the radio's group (ie parameter) name None
borderWidth as it says 1
tooltip The text to display when hovering over the widget None
Page 63
RML User Guide Document generated on 2017/06/19 20:18:43
checkboxField
checkboxField Attributes
Attribute Meaning Default
name the radio's group (ie parameter) name None
borderWidth as it says 1
tooltip The text to display when hovering over the widget None
radioField
radioField Attributes
Attribute Meaning Default
name the radio's group (ie parameter) name None
selected if True this radio is the selected one in its group False
borderWidth as it says 1
tooltip The text to display when hovering over the widget None
fieldFlags Blank separated field flags (see below) noToggleToOff required radio
Page 64
RML User Guide Document generated on 2017/06/19 20:18:43
radioField Attributes
Attribute Meaning Default
relative if true obey the current canvas transform False
choiceField
choiceField Attributes
Attribute Meaning Default
name the radio's group (ie parameter) name None
borderWidth as it says 1
tooltip The text to display when hovering over the widget None
listboxField
listboxField Attributes
Attribute Meaning Default
name the radio's group (ie parameter) name None
Page 65
RML User Guide Document generated on 2017/06/19 20:18:43
listboxField Attributes
Attribute Meaning Default
fontSize The size of font to be used 12
borderWidth as it says 1
tooltip The text to display when hovering over the widget None
Button styles
The button style argument indicates what style of symbol should appear in the button when it is selected. There
are several choices
check
cross
circle
star
diamond
note that the document renderer can make some of these symbols wrong for their intended application. Acrobat
reader prefers to use its own rendering on top of what the specification says should be shown (especially when
the forms hihlighting features are used
Widget shape
The shape argument describes how the outline of the checkbox or radio widget should appear you can use
circle
square
the renderer may make its own decisions about how the widget should look; so Acrobat Reader prefers circular
outlines for radios.
Border style
The borderStyle argument changes the 3D appearance of the widget on the page alternatives are
solid
dashed
inset
bevelled
underlined
fieldFlags Argument
The fieldFlags arguments can be an integer or a string containing blank separate tokens the values are shown in
the table below. For more information consult the PDF specification.
Page 66
RML User Guide Document generated on 2017/06/19 20:18:43
comb make a comb style text based on the maxlen value 1<<24
annotationFlags Argument
PDF widgets are annotations and have annotation properties these are shown in the table below
nozoom The annotation will notscale with the rendered page 1<<3
RGB, CMYK and the use of 'spot colors' such as Pantone can be allowed or disallowed using the 'colorSpace'
parameter to the document tag, which can be set to the following values:
MIXED - The default. As in RML versions before 2.5, rgb, cmyk, spot colors and 'named' colors can
all be used.
RGB - Permits only the use of RGB colour values.
CMYK - Permits only the use of CMYK colour values.
Page 67
RML User Guide Document generated on 2017/06/19 20:18:43
SEP - 'Spot Colors' only - all colour values must define a 'spotName' value.
SEP_BLACK - spot colors, plus shades of grey only.
SEP_CMYK - spot colors plus cmyk values only.
The use of any color definitions outside the specified type will result in an exception when you try to compile
the document, thereby ensuring that, for instance, a document can be produced for CMYK or spot color printing
without containing any RGB color definitions.
Any 'named' colours (see appendix A or 'reportlab/lib/colors.py') for black or shades of grey are automatically
converted to cmyk/rgb as required. So you can use lowercase 'black' as a color in all models except 'SEP'.
However, any other RML 'named' colors such as 'aqua' or 'hotpink' will not be converted.
Page 68
RML User Guide Document generated on 2017/06/19 20:18:43
RML provides several features that support cross referencing and page number calculations. The name and
NamedString tags allow forward referencing and the evalString tag allows computations of page
numbers (or other computations) inside an RML text. Furthermore these techniques may be combined with
preprocessing methods, such as XSL, the C preprocessor, or the Preppy preprocessor to allow the convenient
construction of structures such as tables of contents, indices or bibliographies.
The name tag does not permit other tags inside the string it names in this manner.
Elsewhere, the RML text may substitute the page number for the introduction using the construct
<name id="Introduction"
default="this is a default placeholder, used if Introduction is undefined."/>
...and this reference to the Introduction name may occur before the Introduction name is defined. For
example the reference may occur at the beginning of the document in the Table of Contents. Whenever a name is
referenced before it has been defined the default attribute must be present. In order to prevent possible
formatting anomalies the default value should be approximately the same size as the expected final value.
On the first pass the default value for any undefined name is used for formatting the document (and it may
under some circumstances effect the placement of the page breaks). On the second the program uses the
resolved value determined on the first pass where the name is referenced.
It is also possible to have a chain of references which requires more than one pass to resolve, such as:
Page 69
RML User Guide Document generated on 2017/06/19 20:18:43
...
<namedString id="c"><pageNumber/> is where C is defined</namedString>
By default RML2PDF will fail in this case also, but it is possible to invoke the main processing function
RML2PDF.go to allow additional formatting passes. For example as in:
rml2pdf.go(xmlInputText, passLimit=3)
to request that the processor execute a maximum of 3 formatting passes before signalling an error if more
unresolved names remain.
WARNING: A document that requires two formatting passes will take about twice as long to generate as a
document that requires only one. For time critical applications it is best to avoid the need for extra formatting
passes if they are not needed.
RML documents that do not have references to names before they are defined will not require more than one
formatting pass.
<para><font color="crimson">
The last page is <getName id="LASTPAGENO" default="-999"/>
One less than that is
<evalString default="XXXX">
<getName id="LASTPAGENO" default="-999"/> - 1
</evalString>.
The current page is <pageNumber/>.
And there are
<evalString default="XXXX">
<getName id="LASTPAGENO" default="-999"/> - <pageNumber/>
</evalString>
pages to go.
</font></para>
Performs arithmetic calculations (subtractions) using the current page number and a forward reference to the
LASTPAGENO, which is presumably defined on the last page. In the context of this document the paragraph
evaluates to the following.
The last page is 1 One less than that is 0. The current page is 70. And there are -69 pages to go.
An RML document can make use of arbitrary arithmetic calculations using the evalString tag, but in
practice addition + and subtraction - over page numbers are the most useful.
For example to directly add a new section to the this document in RML text it would be necessary to add a new
table of contents entry at the top, something like this:
<para style="contents2">
<getName id="chapterNumber"/>.<seq id="sectionNumber"/>
Installation
Page 70
RML User Guide Document generated on 2017/06/19 20:18:43
</para>
<condPageBreak height="144"/>
<h2>
<getName id="chapterNumber"/>.<seq id="sectionNumber"/>
Installation and Use
</h2>
<para>
RML2PDF is available in several formats: [etcetera...]
</para>
And unless the creator takes great care it may be necessary to adjust various section or chapter numbers in other
entries as well.
To avoid this complexity this document is not directly written in RML per se, but is written using a text
preprocessor called preppy which automatically builds the table of contents and inserts the appropriate entries
at the top (while keeping track of chapter and section numbers).
For very complex documents using a preprocessor of some sort may be advisable.
Page 71
RML User Guide Document generated on 2017/06/19 20:18:43
10.1. curves
We have seen how you can use the <lines> tag to create a number of straight lines with one command. Not all
the lines you want to draw will be straight, which is why we have the <curves> tag.
Like <lines>, <curves> must appear in the pageGraphics section of your template. Unlike lines,
you need to specify 4 points as X-Y co-ordinate pairs (i.e. you need to feed curves sequences of 8 numbers at
a time, rather than the 4 you need for lines).
The curves tag produces a Bezier curve. Bezier curves are named after the French mathematician, Pierre
Bzier, and are curves that utilize at least three points to define a curve. RML curves use the two endpoints (or
"anchor points") and two "nodes".
In RML, if you give a curve 4 control points (which we shall call (x1,y1), (x2,y2), (x3,y3), and (x4, y4)), the
start point of the curve will be specified by (x1,y1) and the endpoint specified by (x4,y4). The line segment
from (x1,y1) to (x2,y2) forms a tangent to the curve. The line segment from (x3,y3) to (x4,y4) also forms a
tangent to the curve. If you look at an illustration of a Bezier curve, you will see that the curve is entirely
contained within the convex figure with its vertices at the control points.
Example:
<template>
<pageTemplate id="main">
<pageGraphics>
<curves>
198 560
198 280
396 280
396 560
Page 72
RML User Guide Document generated on 2017/06/19 20:18:43
</curves>
</pageGraphics>
<frame id="first" x1="0.5in" y1="0.5in" width="20cm" height="28cm"/>
</pageTemplate>
</template>
10.2. paths
To connect lines and curves you need to use the <path> tag. This allows you to make complex figures.
Like the other graphics in RML, <path> lives in the <pageGraphics> section at the start of the document.
Initially, you must give a <path> tag x and y attributes to tell it the co-ordinates for the point where this path is
going to start. You may also at the same time give it attributes called stroke and fill (which do the same as
their counterparts for the basic shapes such as rect and circle), and an additional one called close. If the
close attribute is set to "yes" or "1", then once the path is completed, the stroke is finished off by painting a
line from the last point given to the first point, enclosing the figure. You may specify attribute autoclose to
be one of the values none, pdf or svg; these values alter how automatic closing of sub-paths is handled. The
default none just leaves the renderer to handle filling as does pdf, but in the latter case all-subpaths are forced
to be closed if fill is set. The last value svg fills and strokes separately (stroke last).
Finally you can control how filling of complex shapes is handled by specifying attribute fillrule to be one of
the values none, even-odd or non-zero. The default none means let the pdf canvas decide, but that is
currently equivalent to even-odd. For further information on fill rules consult a graphics primer.
The <path> tag has its paired </path> tag. Between these two tags, you can have a number of things.
Page 73
RML User Guide Document generated on 2017/06/19 20:18:43
EXAMPLE 7a
<template>
<pageTemplate id="main">
<pageGraphics>
<fill color="red"/>
<stroke color="black"/>
<path x="247" y="72" fill="yes" stroke="yes" close="yes">
247 172
147 172
147 272
247 272
247 372
347 372
347 372
347 272
447 272
447 172
347 172
347 72
<!-- This completes the first shape: a red cross.-->
<moveto>267 572</moveto>
<!-- This moves the "pen position" -->
Page 74
RML User Guide Document generated on 2017/06/19 20:18:43
<curvesto>
147 585
147 687
297 792
<stylesheet>
</stylesheet>
<story>
<para></para>
</story>
</document>
This example has used the 'template/stylesheet/story' form of document. But the story is empty, and we haven't
used the stylesheet at all. The following example shows how we can use the 'pageDrawing' form.
EXAMPLE 7b
<stylesheet>
</stylesheet>
<pageDrawing>
<fill color="red"/>
<stroke color="black"/>
<path x="247" y="72" fill="yes" stroke="yes" close="yes">
247 172
147 172
147 272
247 272
247 372
347 372
347 372
347 272
Page 75
RML User Guide Document generated on 2017/06/19 20:18:43
447 272
447 172
347 172
347 72
<moveto>267 572</moveto>
277 612
<curvesto>
147 585 147 687 297 792
447 687 447 585 317 612
</curvesto>
327 572
</path>
</pageDrawing>
</document>
10.3. grids
The <grid> is a graphics tag, and hence lives in the PageGraphics section of your RML document. It
produces a grid of lines. It takes two arguments - xs which is a list of x co-ordinates (separated by commas), and
ys which is a comma-separated list of y co-ordinates.
Example:
10.4. Translations
In a graphic operation (i.e. a pageGraphic or an illustration), <translate> moves the origin of the
drawing.
<translate> takes two optional attributes: dx and dy. Both can be given in any unit that RML understands.
dx is the distance that the to be moved in the X axis, and dy is the distance it is to be moved in the Y axis. They
are optional to allow you to only give one of the pair - so moving the origin in only one direction.
Examples:
Page 76
RML User Guide Document generated on 2017/06/19 20:18:43
X
X
50 pt
50 pt
<illustration>
<lines>
16 40 116 40
16 40 16 140
156 40 256 40
156 40 156 140
</lines>
<setFont name="Times-Roman" size="12"/>
<fill color="black"/>
<drawCentredString x="58" y="12">Original</drawCentredString>
</illustration>
10.5. scaling
<scale>, as its name suggests, allows you to stretch or shrink a graphic.
Page 77
RML User Guide Document generated on 2017/06/19 20:18:43
The <scale> tag takes two optional attributes: sx and sy. sx is how much to scale the X axis, and sy> is
how much to scale the Y axis. The scaling does not have to be proportional - omitting one allows you to change
the scaling in one direction only. And you can shrink the shape as well as scale it up - an sx or sy of "2"
doubles the size of it, but an sx or sy of "0.5" halves it.
Scale factors can also be negative. Using an sx of -1 and an sy of 1 produces a mirror image.
Examples:
X
Original
X sx=2 sy=2
Figure 14: An example of the <scale> tag in use
10.6. rotations
The <rotate> tag allows allows you to rotate a graphic.
<rotate> takes one mandatory attributes called degrees, which is the number of degrees to rotate the
object. A positive number for degrees rotates it anti-clockwise, a negative number rotates it clockwise.
When using <rotate>, objects are rotated around the current origin. If you want to rotate a specific element of
a pageGraphic or illustration, you will have to use a translate to move the origin before you do
the rotate.
If you translate to the middle of the page, rotate by 90 degrees and then draw the string "hello", the "hello"
will appear starting in the middle of the page going upwards.
Examples:
This is what a <rotate> looks like with degrees set to 45 and -45:
Page 78
RML User Guide Document generated on 2017/06/19 20:18:43
P
P
Original degrees=45
Figure 15: A rotate with a positive value for degrees.
P
P
Original degrees=- 45
Figure 16: A rotate with a negative value for degrees.
10.7. Skew
<skew> is a transform which distorts both axes of a graphic. It is non-orthagonal - in other words, it is a
transformation that does not preserve right angles.
<skew> has two mandatory attributes: alpha and beta. Both are angles - look at the example below to see
how they work.
Example:
Page 79
RML User Guide Document generated on 2017/06/19 20:18:43
beta
X X alpha
x' = ax + cy + e
y' = bx + dy + f
For example to specify a=1, b=1.2, c=1.3, d=1.4, e=1.5 and f=1.6 write
[NOTE: All the examples from this section are gathered together in the file example_8.rml].
Page 80
RML User Guide Document generated on 2017/06/19 20:18:43
If performing multiple operations, use the order "translate -> rotate -> scale or skew"
whenever possible. Using a different order may result in the axes being distorted or other results that
lead to an ugly output that isn't what you were trying to do.
The <image> tag goes in the <pageGraphics> section at the head of your RML document. It has 5
attributes, 3 of which are mandatory and two of which are optional. The file attribute tells rml2pdf the name
of the input file that you want to incorporate into your document, the x and y attributes give the co-ordinates for
the bottom left hand corner of where the image will be placed on the page. The optional width and height
attributes allow you to specify how big it should be on the page - this means that you can over-ride the normal
size of the file and display it at any size that is appropriate. (The x, y, width and height attributes can all be
gives in points, mm, cm or inches).
Be very careful when using the width and height attributes. If misused, these attributes can lead to you
having a distorted, ugly and out of proportion picture in your final document. Whenever possible, you should use
a paint application (e.g. Paintshop Pro, Photoshop, Graphics Converter, GIMP) to save the file at the correct size,
and use the correct height and width attributes to the <image> tag. Using larger files and re-sizing inside
RML will also lead to the output PDF file being bloated and larger than it needs to be.
<pageGraphics>
<image file="myFile.gif" x="72" y="72"/>
<image file="myFile.gif" x="369" y="72" width="80" height="80"/>
<image file="myFile2.jpg" x="72" y="493"/>
<image file="myFile2.jpg" x="369" y="493" width="80" height="80"/>
</pageGraphics>
The <textField> tag goes in the <pageGraphics> section at the at the start of the RML document. It has
the following optional attributes: id (the field name), value (the field initial value), x (the field x coordinate),
y (the field y coordinate), width (the field width), height (the field height), maxlen (maximum allowd
number of field characters) & multiline (whether the field may contain more than one line).
As a convenience the attributes may instead be specified using <param> tags within the body of the
<textField> tag. The name attribute of the <param> tag should be one of the above attribute names. If no
value attribute or <param> is seen then the contents of the <textField> becomes the initial value of the
field.
Page 81
RML User Guide Document generated on 2017/06/19 20:18:43
We have seen how graphics and flowables do not mix in RML. The only exceptions to this are the <place>
tag, and the <illustration> tag. <place> allows you to put a flowable inside a pageGraphic or
illustration. You can include a paragraph inside a grid, or a table inside a path.
<place> takes 4 attributes, all of which are required. x, and y are the x and y co-ordinates for where you want
the flowable placed. width and height are the width and height of the flowable.
Example:
<pageGraphics>
<place x="10.5cm" y="10.5cm" width="9cm" height="9cm">
<para>Your flowables would go here.</para>
</place>
</pageGraphics>
illustration
You can think of an <illustration> as like one of the illustrations in a book. It is a "box" of space on the
page which can contain any of the graphics that you would normally expect to find in a <pageGraphics> tag.
The position of this box depends purely on its place in the story, which means that it can appear anywhere on the
page depending on the paragraphs and other flowables around it. This is in contrast to the pageGraphics
which are always placed in a specific place (measured from the origin).
graphicsMode
You can think of a <graphicsMode> tag as an <illustration> without a size. It allows you to insert
arbitrary graphics operations into a story without using up any space. The <graphicsMode> tag takes an
origin attribute which can take the values local, frame or page to specify the coordinate origin to be
used. Value local means relative to the position where the <graphicsMode> tag is in the current frame,
frame means relative to the frame it is in and page means relative to the page (ie absolute).
Example:
Page 82
RML User Guide Document generated on 2017/06/19 20:18:43
Notice the symmetry: the <place> tag lets you use flowables within a <pageGraphic>; the
<illustration> tag lets you do graphics operations in a box within the flow of the <story> (or any
story-like context such as a table cell).
The following example shows the use of both place and illustration:
EXAMPLE 9
<template>
<pageTemplate id="main">
<pageGraphics>
<grid xs="1cm,2cm,3cm,4cm,5cm,10cm,20cm" ys="1cm,2cm,3cm,4cm,5cm,10cm,20cm"/>
<place x="10.5cm" y="10.5cm" width="9cm" height="9cm">
<title>This is a use of <i>place</i></title>
<spacer length="15"/>
<para>
This is a flowable. In this case, it is in a <para>
tag, but it could be any flowable. It has been placed
inside a grid, but you could put it inside any graphic or
pageGraphics. Using the place tag, you can have complete
control over where you want your flowables to appear.
</para>
<spacer length="12"/>
Page 83
RML User Guide Document generated on 2017/06/19 20:18:43
<para>
You can include Greek: <greek>abgd</greek>.
</para>
<spacer length="12"/>
<blockTable>
<tr>
<td>Or</td><td>even</td>
</tr>
<tr>
<td>a</td><td>blockTable.</td>
</tr>
</blockTable>
</place>
</pageGraphics>
<frame id="first" x1="72" y1="72" width="451" height="698"/>
</pageTemplate>
</template>
<stylesheet>
<paraStyle name="style.Title"
fontName="Courier-Bold"
fontSize="24"
leading="36"
/>
</stylesheet>
<story>
<title>Example 9</title>
<para>
This is a page which shows you how illustrations, grids and the place tag work.
</para>
<illustration width="90" height="90">
<fill color="red"/>
<circle x="45" y="45" radius="30" fill="yes"/>
<setFont name="Times-Roman" size="8"/>
<drawString x="0" y="0">This is an illustration</drawString>
</illustration>
<para>
The red circle you can see is an <i>illustration</i>, not a <i>pageGraphic</i>.
</para>
<illustration width="75" height="75">
<fill color="teal"/>
<circle x="30" y="30" radius="30" fill="yes"/>
<stroke color="darkslategray"/>
<grid xs="15,30,45" ys="5,10,15,20,25,30,35,40,45,50"/>
</illustration>
<para>
So is the teal colored one.
</para>
<para>
These are all flowables in the story.
</para>
</story>
</document>
Page 84
RML User Guide Document generated on 2017/06/19 20:18:43
10.13. spacer
<spacer> is another tag which does just what the name suggests. A <spacer> inserts an empty element into
the page to force other elements downwards or sideways. The spacer tag has two attributes - length is
mandatory and refers to the length down the page, and width is optional.
Example:
To produce a spacer 15 points in height and one inch wide, you could do the following:
Your form would appear in the pageGraphics section of your RML document (inside the pageTemplate).
<doForm> also appears in the pageGraphics section.
The <form> tag has one attribute - a mandatory one called name which identifies the form.
The <doForm> tag executes the sequence of graphical operations defined with a <form> tag. It also has only
one mandatory attribute called name.
Example:
<pageGraphics>
<form name="myForm">
<drawString x="0" y="24">
Your graphic operations would go here.
</drawString>
<drawString x="0" y="12">
There would probably be a lot of them to make up something useful.
</drawString>
</form>
<doForm name="myForm"/>
</pageGraphics>
The benefits are dramatically cut file sizes, reduced production time and apparently even speeding things up on
the printer. If you are going to be using PDF files in any situation where people will be downloading them,
massively reduced file sizes will be appreciated by your users. These advantages become even more obvious
with multiple similar documents. If you are dealing with a run of 5000 repetitive forms - perhaps payslips or
single-page invoices - you only need to store the backdrop once and simply draw the changing text on each
page.
Page 85
RML User Guide Document generated on 2017/06/19 20:18:43
forms should be used whenever you have a graphic that is used repeatedly. It may be something as small as
your company logo or some sort of symbol you want to flag interesting bits of text with, or something as large as
a whole page backdrop. As long as you use it repeatedly, it's worth using a form to do it.
forms don't even have to be created in RML. You can use another application (such as Adobe Illustrator or
Word) and distil the output to PDF. You can then use our PageCatcher product to generate the forms, which can
then be used from RML.
Page 86
RML User Guide Document generated on 2017/06/19 20:18:43
11.1. Introduction
WARNING - this is an advanced topic, intended for programmers trying to deal with difficult layout cases. The
tags documented here have the potential to cause hard-to-understand exceptions if not used correctly!
Conditional formatting allows you to include expressions in your RML text which are evaluated or executed
when the pdf is actually being built. This means that you can vary the content of your document depending on
conditions (such as where you are on the page) which you do not know in advance.
For instance, you may be including dynamic content in your document which is likely to be of variable length.
You could use the value of one of the document's internal formatting variables to include or exclude certain
content, based on the remaining height of a page or the current page number. One common use is in the case of
creating documents for printing: these could be 'padded out' with optional content, to make sure that they are
always a 4-page spread. Another useful application would be deciding whether there is space to include a large
image or diagram in the present location.
Basic programming primitives (assignment, loop, if, while etc.) have been made available as tags. These can be
given expressions which can use your own variables, as well as built-in ones available during rendering. All
expressions must be valid python literal expressions.
availableWidth and availableHeight give you the remaining height and width of the current frame.
11.2. Tags
The <docIf>, <docElse> and <docWhile> tags allow you to control which content is included and
excluded - while, or if, a condition is true or false.
The <docPara> tag allows you to include the value of an expression in the output text. This is useful for
debugging document layouts (e.g. temporarily inserting paragraphs like "you are [3] inches down the [left] frame
of the [chapter_first_page] template on page [19]"), but you can also use it to display facts you stored earlier.
The value can be formatted using Python format strings - see the test case above for details.
The <docAssert> tag allows you to test an expression and raise an exception if it is not true. This can be a
useful quality assurance technique. As with the docPara example for debugging, you can include assertions like
"I should now be at the top of page 3" or "I should now be in the footer frame".
11.3. Operators
When using docIf or docWhile tags, you can use the following operators to evaluate your conditions:
Page 87
RML User Guide Document generated on 2017/06/19 20:18:43
However, bear in mind that the 'greater than' and 'less than' operators must be written in RML as > and <
11.4. Examples
Some sample code demonstrating several of the conditional formatting tags:
As an example of a practical use of conditional formatting, supposing you wanted all your documents to be a
certain number of pages. You could use the value of doc.page to decide whether to include or exclude an
external 'filler' pdf in your output, and so pad the size of your document:
11.5. Reference
Conditional formatting is implemented with the following tags:
<docElse>
these tags allow flow control while or if the 'cond' attribute evaluates to true. See the example above.
Page 89
RML User Guide Document generated on 2017/06/19 20:18:43
12. Printing
This chapter covers things you will need to know when creating documents for professional printing. Many
development projects start off targeting an electronic document, which users will either keep on disk, or print
out on an office or home printer. Once you start targeting professional printing presses, things get more
complicated. We have tried to write this in a manner accessible to developers with little prior knowledge of
print; apologies to professional printers for anything we have 'glossed over' too lightly! The topics covered in
this chapter are...
Crop Marks
Bleed
CMYK colours
Overprint/knockout control
Colour separations
Pagination
To automatically create crop marks, use the 'useCropMarks' attribute of the <docinit> tab. This will enlarge
the underlying page and draw the needed marks.
<docinit useCropMarks="1"/>
The intent is that it's reasonable easy now to have a single template which generates print and web versions of
the same document, wrapping an <if> statement around the extra attribute in your favourite templating system,
without needing to recalculate all the frame and graphics positions for every element on the page.
There is also a separate <cropMarks> tag which you can use within the <docinit> tag, if you wish to
modify the page size increase, colour, length, dash pattern and so on for the crop marks; however, we've found
the defaults to work fine.
Page 90
RML User Guide Document generated on 2017/06/19 20:18:43
12.2. Bleed
Following on from the above, remember that printers often cut the paper to size. In addition, if they are creating
a booklet, they sometimes have to allow for the thickness of inner pages, so they need a little flexibility in where
to make the cut. If you have a design with solid colour 'straight to the edge' of the page, cutting can sometimes
leave a very fine white line where the colour runs out. Therefore, when a designer wants an area of colour to go
'straight to the edge', they work on a slightly larger page size, and allow the colour to overflow or 'bleed out'. In
general printers often ask for at least 3mm of bleed, or about 8 points. So, if you needed to draw a blue
background on an A4 sized page (595x842 points), you would be well advised to draw the rectangle from x=-10
to x=+605 - ten points bigger than needed. This will be completely invisible to an end user in a document
created for the web; but when you turn on crop marks and the page is enlarged, it will be visible.
There are no features in RML to automatically detect areas of colour near the edge of the page and 'add bleed';
it's your job to do it.
This also applies to bitmap images. If an image runs to the edge of the page, it needs to be sized to very slightly
overflow so that it can be cut without risking a white edge.
The majority of printed material is produced using the CMYK process. Many Pantone colours have good,
well-known CMYK equivalents.
RML allows you to specify colours as CMYK or by spot name, and also provides a mechanism for ensuring that
your document sticks to a particular set of colour definition types.
Starting in ReportLab 2.5, a colorSpace attribute can be defined in the <document> tag. This is a declaration
of your intent, and it lets us carry out some useful checks on your behalf. It will raise an error if you accidentally
use a colour that is not allowed in your colorSpace. Then, to declare a CMYK colour, use the <color> tag,
within the <docinit> section at the top:
Page 91
RML User Guide Document generated on 2017/06/19 20:18:43
</docinit>
Note that each colour component ranges from 0 to 1, not 0 to 100; you can use any floating point number in
between. Designers tend to think in terms of 0-100, but we have chosen to follow the PDF specification.
The 'id' is a string you specify. You will then be able to refer to these colours by name elsewhere in a document
- for example, you can then set a table cell background or paragraph style to be "BLUE".
The colorSpace attribute is particularly important when dealing with blacks. Many objects in our framework
have a default colour of black, and this is an RGB black 'under the hood'. If you set the colorSpace, our
framework will 'auto-convert' blacks for you; thus if a table's gridlines or a chart axis is normally drawn in black
or a shade of grey (implemented originally as RGB), it will be autoconverted to CMYK black or grey. Many
printing presses are able to handle RGB and autoconvert blacks these days, but printers will appreciate it if the
PDFs are pure CMYK as it won't raise alarms in their proofing tools.
Printers can often handle RGB images in a print job, but it's best to check with them first
When working with separated colours (see below), the printing mechanics are a little different as each colour is
really a bottle of ink; but again, a statement of intent is needed when they overlap - does the top colour replace
what's underneath, or allow both to be laid down on the page?
The overprint-versus-knockout choice is rarely used, and works in slightly different ways for CMYK and for
separated colours - see the section below. Designers will know when they need it, and the developer merely
needs to set a flag.
Some PDF viewing software can simulate this effect on screen (Adobe Reader is one of them); it's necessary to
go into the preferences and check a box to see how the document would appear when printed. The default for is
usually to for the topmost colour to knock out the colour underneath.
<overprint mode="overprint"> turns on overprint for the drawing operations that follow. You can
then set this property to its original value with <overprint mode="knockout"> when you want to go
back into the default knock-out mode.
Page 92
RML User Guide Document generated on 2017/06/19 20:18:43
The sample first example above shows cyan, magenta and yellow circles overlapping one another, set to
overprint and rendered in Acrobat Professional. Without overprint set in the second example, the inks do not
mix on top of each other. Instead, the circles on top knock-out the areas that they cover underneath.
We mentioned above that a colorSpace attribute can be defined in the <document> tag. There are two more of
these "color spaces" which will be useful for those who are going to use spot colours: 'SEP' will only let you use
spot colours you define, and 'SEP_CMYK' will let you define spot colours to use along with the normal CMYK
process colours.
If using SEP_CMYK, our framework will again 'auto-convert' blacks for you; thus if a table's gridlines or a
chart axis is normally drawn in black or a shade of grey (implemented originally as RGB), it will be
autoconverted to CMYK black or grey.
An equivalent CMYK colour value needs to be supplied along with a spot name for each printing plate. The
CMYK values are usually just to provide an on screen representation and do not need to be accurate, more
important is the spot name which is a string that printers can identify the ink such as 'PANTONE 288 CV' or
'PMS_288'. Your printer may advise you on what spot names to use.
You will need to define your spot colours in the <docinit> section of your document. The 'id' is what you will
use later in the document to refer to that colour, 'CMYK' allows you to see an approximation of your colour in a
PDF reader, 'spotName' is how the printer will identify which ink to use for the plate. There is also an optional
'density' attribute which allows you to print with a thinner (or half-tone) layer of ink. If you set a density lower
than 1.0, you don't need to fiddle with the CMYK values for on-screen preview; we do that for you.
Page 93
RML User Guide Document generated on 2017/06/19 20:18:43
If you have access to Adobe Acrobat Professional or other print pre-flight tool you will be able to preview each
of the plates separately and the inks that are used.
The overprint tag is perhaps even more useful when working with spot colours; for example, we have worked
with pie charts where the overall document was limited to black and a specific Pantone blue, and the designer
was able to create some new tints by stacking the blue and black on top of each other.
12.7. Pagination
A document that is intended to be printed as a bound booklet on a press must always have a page count that is a
multiple of four. Even with a different binding technique, documents laid out for print may make use of left and
right facing pages which "go together". RML documents with dynamic content will in many cases be of highly
variable length, and not guided by the designer's "common sense".
It is possible to use the conditional formatting tags in RML to add extra pages and pad out your document to the
required length as necessary. For example, we maintain one solution which has a number of optional half-page
and full-page advertisements which can be used to ensure the right pagination occurs. See the 'Conditional
Formatting' chapter of this guide for more information on this technique.
Page 94
RML User Guide Document generated on 2017/06/19 20:18:43
So, the simplest blockTable in RML will look something like this:
<blockTable>
<tr>
<td>This</td><td>is</td>
</tr>
<tr>
<td>a</td><td>blockTable.</td>
</tr>
</blockTable>
This is
a blockTable.
In this short example, we are just using plain old vanilla text in the table cells. But we can do more.
<blocktable> allows you to use paragraphs and the <para> tag. This means that you can use bold, italics,
colors, fonts, greek... anything you can use in a paragraph. And you can use multiple paragraphs inside a table
cell.
The main thing that makes this slightly more complex than a very simple table is the fact that you must give
rowHeights and colWidths to the <blockTable> to use paras. This makes sense - paragraphs fit into
the available space on a page. In a table, they must fit into the available space in that cell. If you haven't defined
how high and wide that cell will be, then there is no way for rml2pdf to know how to make it flow in that cell. (If
you get an error message saying "Flowables cell can't have auto width", then this is the thing to check - you have
probably omitted the rowHeights or colWidths).
When you are using paragraphs inside a table, you must not put any text outside the <para>...</para>
tags. The only exception to this rule is whitespace - you can put spaces and tabs outside the <para> tag, but
Page 95
RML User Guide Document generated on 2017/06/19 20:18:43
nothing else.
One other thing to be aware of is that if you use a para inside a table, it will ignore the text attributes you have
used for that table and instead use the attributes for paragraphs. This can be a plus, (since it allows you to use
already defined paragraph styles) but can take you by surprise if weren't expecting it.
<blockTable
rowHeights="1.25cm,1.25cm"
colWidths="4cm,4cm"
>
<tr>
<td>
<para>
This is a <b>more</b> complex <font color="red">blocktable</font>.
</para>
</td>
<td>
<para>
This is a more <i>complex</i> blocktable.
</para>
</td>
</tr>
<tr>
<td>
<para>
<font face="Helvetica">This is a more complex blockTable.</font>
</para>
</td>
<td>
<para>
This is <greek>a</greek> more <font color="blue"><i>complex</i></font>
blockta<greek>b</greek>le.
</para>
</td>
</tr>
</blockTable>
style
blockTables can have a style set in the stylesheet in the same way as paragraphs can. If you have set
a style for your blockTable, you can refer to it by name with this attribute and apply it to your table.
(More details on how to do it appear in the section on the <blockTableStyle> tag below).
colWidths
If you use this attribute, it takes a comma-separated list of the width of each column in your
blockTable. This allows you to vary the widths to match the width of the content of each column. If
you do use it, you should be careful to make sure that there is one width given for every column in your
table.
rowHeights
Page 96
RML User Guide Document generated on 2017/06/19 20:18:43
As colWidths is to columns, rowHeights is to rows. It also takes a comma-separated list, in this case for
the heights of the rows in your table.
repeatRows
If you have a large table that splits over multiple pages, you may well want certain information
appearing on all of them. Column headers are one example of this sort of information. The
repeatRows attribute allows you to do this.
repeatRows takes a single number as an argument or a ',' separated list of numbers. In the case of a
single number the rows up to and including this row are repeated as "headers" on each section of the
table that appears on a new page. If a list of rows is given then this is a zero based list of rows to repeat.
So if the list (1,) is given then the first table header will have rows 0 & 1 and any succeeding split table
will have the original second row as header. This allows for the first appearance of a table to have
additional rows which may be unwanted later.
The <blockTableStyle> tag is a container for a number of other tags, and needs to be paired with a
terminal </blockTableStyle> tag. This works in the same way as <styleSheet></styleSheet>,
<pageGraphics></pageGraphics>, and other tags of that sort.
For all of the attributes in blockTableStyle, they refer to a square or rectangular "block" inside the table.
This can be as many or as few cells as you want - not necessarily a single cell. This "block" aspect to the
attributes is reflected in their names, and gave the table style its name for consistency. (It was felt that since most
of these attributes started with "block...", the table tag should itself be called blockTable to keep things
simple).
The way the block is described may seem unusual to you if you are not used to programming. The x and y
co-ordinates are still given as X,Y (or if you like "Row,Column", rather than the spreadsheet "A1" model), but
the numbering starts from 0 rather than 1. This makes the top left-hand cell (0,0). As well as this, the numbers
may also be negative. If this is the case, then rml2pdf will count backwards from the end of the last cell. So
(-1,-1) is the bottom right hand cell in a table, (-2,-2) is the one up and to the left of that, and so on.
blockFont
blockfont sets the font to be used in a block of your table.
It has one mandatory attribute: name.
It has four optional attributes: size, leading, start and stop.
blockTextColor
This sets the color that will be used for the text in a block of your table.
It has one required attribute: colorName.
It has two optional attributes: start and stop.
blockLeading
This sets the leading that will be used for the text in a block of your table.
It has one required attribute: length.
It has two optional attributes: start and stop.
blockAlignment
This sets the alignment of the text in a block of your table.
It has one required attribute: value. (This can be LEFT, RIGHT, CENTER, or CENTRE).
It has two optional attributes: start and stop.
blockValign
Page 97
RML User Guide Document generated on 2017/06/19 20:18:43
This sets how the contents of a block of cells in your table are aligned in the vertical direction.
It has one required attribute: value. (This can be TOP, MIDDLE, or BOTTOM, and defaults to
BOTTOM).
It has two optional attributes: start and stop.
blockLeftPadding
This sets the padding (i.e. blank space) between the contents of a cell and left-hand edge of the cell (for
a block of cells in your table).
It has one required attribute: length.
It has two optional attributes: start and stop.
blockRightPadding
This sets the padding between the contents of a cell and right-hand edge of the cell (for a block of cells
in your table).
It has one required attribute: length.
It has two optional attributes: start and stop.
blockBottomPadding
This sets the padding between the contents of a cell and bottom edge of the cell (for a block of cells).
It has one required attribute: length.
It has two optional attributes: start and stop.
blockTopPadding
This sets the padding between the contents of a cell and top edge of the cell (for a block of cells).
It has one required attribute: length.
It has two optional attributes: start and stop.
blockBackground
This sets the color to be used for the background for a block of cells in your table.
It has one required attribute: colorName.
It has two optional attributes: start and stop.
lineStyle
This allows you to use lines to border your table.
It has two required attributes: kind (with the options of GRID, BOX, OUTLINE, INNERGRID,
LINEBELOW, LINEABOVE, LINEBEFORE and LINEAFTER), and colorName (which must be the
name of a color).
It has three optional attributes: thickness, start and stop.
Putting strings into table cells is quicker than using paragraphs. Paragraphs need to work out when to 'wrap' text,
strings don't. So you should avoid using paragraphs inside tables unless you really need to (or you don't mind
things slowing down).
When you are doing a big database report, wherever possible use separate smaller tables to contain parts of your
data rather than one huge table. If you don't use many 'mini-tables' to contain small groups of rows but instead
decide to do a big 1,000-row table, you will notice a significant loss of speed in the generation of your output
PDF.
This also makes it much easier to design complex grouped reports; for each group header, footer or detail block
you can design one table style and keep them all independent of each other.
Page 98
RML User Guide Document generated on 2017/06/19 20:18:43
The following few pages show a number of examples of blockTables. Each one shows a page with the RML
listing, followed by a separate page with the result of that table. Each listing contains comments to point out
what each tag involved with the blockTable is doing.
Page 99
RML User Guide Document generated on 2017/06/19 20:18:43
Notice the various ways of specifying a region within the table. Also notice the way we have defined heights for
the rows and widths for the columns in the blocktable tag.
EXAMPLE 10
<template>
<pageTemplate id="main">
<pageGraphics>
</pageGraphics>
<frame id="first" x1="72" y1="72" width="451" height="698"/>
</pageTemplate>
</template>
<stylesheet>
<blockTableStyle id="myBlockTableStyle">
<!-- This sets a font for every cell from the start of the -->
<!-- second row down to the bottom right hand corner -->
<blockFont name="Courier-Bold" start="0,1" stop="-1,-1"/>
<!-- This sets a font for the first row -->
<blockFont name="Helvetica-BoldOblique" size="24" start="0,0" stop="3,0"/>
<!-- This sets a textColor for all the text in the table -->
<blockTextColor colorName="black"/>
<!-- This sets a background color for the first row -->
<blockBackground colorName="red" start="0,0" stop="3,0"/>
<!-- This sets a background color for the rest of the table -->
<blockBackground colorName="cornsilk" start="0,1" stop="-1,-1"/>
</blockTableStyle>
</stylesheet>
<story>
Page 100
RML User Guide Document generated on 2017/06/19 20:18:43
<blockTable style="myBlockTableStyle"
rowHeights="3.5cm,2cm,2cm,2cm,2cm,2cm,2cm"
colWidths="4cm,4cm,4cm,4cm">
<tr>
<td>Cell 0,0</td><td>Cell 1,0</td><td>Cell 2,0</td><td>Cell 3,0</td>
</tr>
<tr>
<td>Cell 0,1</td><td>Cell 1,1</td><td>Cell 2,1</td><td>Cell 3,1</td>
</tr>
<tr>
<td>Cell 0,2</td><td>Cell 1,2</td><td>Cell 2,2</td><td>Cell 3,2</td>
</tr>
<tr>
<td>Cell 0,3</td><td>Cell 1,3</td><td>Cell 2,3</td><td>Cell 3,3</td>
</tr>
<tr>
<td>Cell 0,4</td><td>Cell 1,4</td><td>Cell 2,4</td><td>Cell 3,4</td>
</tr>
<tr>
<td>Cell 0,5</td><td>Cell 1,5</td><td>Cell 2,5</td><td>Cell 3,5</td>
</tr>
<tr>
<td>Cell 0,6</td><td>Cell 1,6</td><td>Cell 2,6</td><td>Cell 3,6</td>
</tr>
</blockTable>
</story>
</document>
Page 101
RML User Guide Document generated on 2017/06/19 20:18:43
Page 102
RML User Guide Document generated on 2017/06/19 20:18:43
produces
fontName Courier
fontName Helvetica
fontSize 8
fontSize 14
fontColor red
fontColor blue
Page 103
RML User Guide Document generated on 2017/06/19 20:18:43
leading leading
is
16
leading leading
is
12
leftPadding 10
leftPadding 16
rightPadding 10
rightPadding 24
topPadding
10
topPadding
24
bottomPadding 10
bottomPadding 24
background pink
background lightblue
align left
align center
align right
- top
vAlign
-
-
vAlign middle
-
-
vAlign
- bottom
Page 104
RML User Guide Document generated on 2017/06/19 20:18:43
EXAMPLE 11
<template>
<pageTemplate id="main">
<pageGraphics>
</pageGraphics>
<frame id="first" x1="72" y1="72" width="451" height="698"/>
</pageTemplate>
</template>
<stylesheet>
<blockTableStyle id="myBlockTableStyle">
<!-- Set fonts -->
<blockFont name="Courier-Bold" size="10" start="0,1" stop="-1,-1"/>
<blockFont name="Helvetica-BoldOblique" size="10" start="0,0" stop="3,0"/>
<!-- This sets a textColor for all the text in the table -->
<blockTextColor colorName="black"/>
<!-- This sets the vertical alignment for one row -->
<blockValign value="TOP" start="0,0" stop="-1,0"/>
<!-- This sets the vertical alignment for one cell -->
<blockValign value="MIDDLE" start="2,2" stop="2,2"/>
</blockTableStyle>
</stylesheet>
<story>
<title>Example 11 - lines and alignment in tables</title>
<spacer length="1cm"/>
Page 105
RML User Guide Document generated on 2017/06/19 20:18:43
<blockTable style="myBlockTableStyle"
rowHeights="2cm,2cm,2cm,2cm,2cm,2cm,2cm"
colWidths="4cm,3cm,3cm,4cm"
>
<tr>
<td>(a=LEFT)(VA=TOP)</td>
<td>(VA=TOP)</td>
<td>(VA="TOP")</td>
<td>(a=RIGHT)(VA=TOP)</td>
</tr>
<tr>
<td>(a=LEFT)</td>
<td>1,1</td>
<td>Cell 2,1</td>
<td>(a=RIGHT)</td>
</tr>
<tr>
<td>(a=LEFT)</td>
<td>1,2</td>
<td>(VA=MIDDLE)</td>
<td>(a=RIGHT)</td>
</tr>
<tr>
<td>(a=LEFT)</td>
<td>1,3</td>
<td>(VA=MIDDLE)</td>
<td>(VA=MDL)(a=RIGHT)</td>
</tr>
<tr>
<td>(a=LEFT)</td>
<td>1,4</td>
<td>2,4</td>
<td>(a=RIGHT)</td>
</tr>
<tr>
<td>(a=LEFT)</td>
<td>1,5</td>
<td>2,5</td>
<td>(a=RIGHT)</td>
</tr>
<tr>
<td>(a=LEFT)</td>
<td>1,6</td>
<td>2,6</td>
<td>(a=RIGHT)</td>
</tr>
</blockTable>
<spacer length="15"/>
<para>a=value for <i>blockAlignment</i></para>
<para>VA=value for <i>blockValign</i></para>
<para><i>MDLE=MIDDLE for VA in cells 3,2 and 3,3</i></para>
</story>
</document>
Page 106
RML User Guide Document generated on 2017/06/19 20:18:43
(VA=MIDDLE) (VA=MDL)(a=RIGHT)
(a=LEFT) 1,2
(VA=MIDDLE) (VA=MDL)(a=RIGHT)
(a=LEFT) 1,3
Page 107
RML User Guide Document generated on 2017/06/19 20:18:43
EXAMPLE
<template>
<pageTemplate id="main">
<pageGraphics>
</pageGraphics>
<frame id="first" x1="72" y1="72" width="451" height="698"/>
</pageTemplate>
</template>
<stylesheet>
<blockTableStyle id="myBlockTableStyle">
<blockBackground colorName="silver" start="0,0" stop="-1,0"/>
<blockBackground colorName="darkslategray" start="0,1" stop="-1,1"/>
<blockBackground colorName="silver" start="0,2" stop="-1,2"/>
<blockBackground colorName="darkslategray" start="0,3" stop="-1,3"/>
<blockBackground colorName="silver" start="0,4" stop="-1,4"/>
<blockBackground colorName="darkslategray" start="0,5" stop="-1,5"/>
<blockAlignment value="CENTER"/>
<blockValign value="MIDDLE"/>
<!-- set the left and right padding for cells in first and -->
<!-- third columns remember, cell numbering starts from ZERO, not ONE -->
<blockLeftPadding length="20" start="0,0" stop="0,-1"/>
<blockRightPadding length="20" start="2,0" stop="2,-1"/>
<!-- set the top and bottom padding for cells in first and third rows -->
<blockBottomPadding length="40" start="0,0" stop="-1,0"/>
<blockTopPadding length="40" start="0,2" stop="-1,2"/>
<!-- set the top and bottom padding for the last row -->
<blockBottomPadding length="40" start="-1,4" stop="-1,4"/>
<blockTopPadding length="40" start="0,4" stop="0,4"/>
</blockTableStyle>
<paraStyle name="paddingTableStyle"
fontName="Helvetica-BoldOblique"
fontSize="10"
textColor="white"
Page 108
RML User Guide Document generated on 2017/06/19 20:18:43
alignment="CENTER"
/>
</stylesheet>
<story>
<title>Example 12 - images and padding in tables</title>
<spacer length="1cm"/>
<blockTable style="myBlockTableStyle"
rowHeights="166,28,166,28,166,28"
colWidths="161,161,161"
>
<tr>
<td>
<illustration width="141" height="90">
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
<td>
<illustration width="141" height="90">
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
<td>
<illustration width="141" height="90">
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
Page 109
RML User Guide Document generated on 2017/06/19 20:18:43
</tr>
<tr>
<td>
<para style="paddingTableStyle">
<b>blockLeftPadding</b> with <b>blockBottomPadding
</para>
</td>
<td>
<para style="paddingTableStyle">
just blockBottomPadding
</para>
</td>
<td>
<para style="paddingTableStyle">
<b>blockRightPadding</b> with <b>blockBottomPadding</b>
</para>
</td>
</tr>
<tr>
<td>
<illustration width="141" height="90">
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
<td>
<illustration width="141" height="90">
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
<td>
<illustration width="141" height="90">
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
Page 110
RML User Guide Document generated on 2017/06/19 20:18:43
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
</tr>
<tr>
<td>
<para style="paddingTableStyle">
<b>blockLeftPadding</b> with <b>blockTopPadding
</para>
</td>
</td>
<td>
<para style="paddingTableStyle">
just blockTopPadding
</para>
</td>
<td>
<para style="paddingTableStyle">
<b>blockRightPadding</b> with <b>blockTopPadding</b>
</para>
</td>
</tr>
<tr>
<td>
<illustration width="141" height="90">
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
<td>
<illustration width="141" height="90">
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
<td>
<illustration width="141" height="90">
Page 111
RML User Guide Document generated on 2017/06/19 20:18:43
<image file="images/replogo.gif"
x="0" y="0"
width="141" height="90"/>
<stroke color="deepskyblue"/>
<lineMode width="3"/>
<lines>
0 0 141 0
141 0 141 90
141 90 0 90
0 90 0 0
</lines>
</illustration>
</td>
</tr>
<tr>
<td>
<para style="paddingTableStyle">
blockLeftPadding with blockTopPadding
</para>
</td>
<td>
<para style="paddingTableStyle">
no padding
</para>
</td>
<td>
<para style="paddingTableStyle">
blockRightPadding with blockBottomPadding
</para>
</td>
</tr>
</blockTable>
</story>
</document>
Page 112
RML User Guide Document generated on 2017/06/19 20:18:43
Page 113
RML User Guide Document generated on 2017/06/19 20:18:43
Page 114
RML User Guide Document generated on 2017/06/19 20:18:43
Page 115
RML User Guide Document generated on 2017/06/19 20:18:43
Page 116
RML User Guide Document generated on 2017/06/19 20:18:43
Page 117
RML User Guide Document generated on 2017/06/19 20:18:43
Page 118
RML User Guide Document generated on 2017/06/19 20:18:43
Bezier curves
Named after the French mathematician Pierre Bzier, Bezier curves utilize at least three points to define a curve.
The endpoints are called the anchor points, while any other point is known as a node. The curves produced by
RML's <curves> tag are Bezier curves.
bitmap
A bitmap is a way of storing an image. In bitmaps, each pixel ("picture-cell") is stored as one or more bits of
data in a "map" consisting of rows and columns. This means that when you print them out at the size they were
created at they look fine, but shrinking or enlarging them leads to them looking blocky and ragged.
JPEG and GIF are both bitmapped graphics formats (as are BMP, PICT and PNG). You can use gifs and jpegs in
your RML document with the <image> tag.
see also "gif", "JPEG", "image"
Boolean
Named after the nineteenth-century mathematician George Boole, Boolean logic is a form of algebra in which
all values are reduced to either TRUE or FALSE (or 0 and 1).
CMYK
A way of specifying a color by its Cyan, Magenta, Yellow and Black ('Key') components. Usually used when
referring to pigments - such as in printing.
DTD
Document Type Definition. A term from XML that refers to the file that defines the legal building blocks of an
XML document, and the permissible ways to structure it.
empty elements
"Empty" elements are those tags that don't have any content, and are closed with a "/>" at the end of the same
tag rather than having a separate closing tag. (e.g. <getName id="Header.Title"/> doesn't have a
separate </getName> tag - the "/>" serves to close it so it doesn't need one). Empty elements are also
sometimes known as "singletons".
fill
In RML, the color that a graphic or text item is filled with (as opposed to that of its outline or stroke).
flowables
In RML, "flowables" are items which appear in a story (such as paragraph, spacer, and tables). Flowables are
positioned in sequence running down a frame until there is no more room left in that frame, when they are
placed in the next frame (or on the next page if necessary). They can not be mixed with graphics.
Flowables include the following tags:
para, blockTable, title, h1, h2, h3, spacer, illustration, pre and plugInFlowable.
see also "graphics"
GIF
GIF (Graphics Interchange Format) is a bit-mapped graphics file format created by CompuServe in 1987. It is
still in common use on the World Wide Web and many other places today.
You can use gifs in your RML document with the image tag.
see also "bitmap", "JPEG", "image"
graphics
In RML, "graphics" are items which can appear inside the pageGraphics and illustration tags. Unlike
flowables, graphics are explicitly positioned on the page by co-ordinates. They can not be mixed with flowables.
Page 119
RML User Guide Document generated on 2017/06/19 20:18:43
HTML
The Hyper-Text Markup Language. The language used for writing pages on the World Wide Web.
image
In RML, the "image" tag allows you to use existing graphics files in your document. Currently image supports
the GIF and JPEG formats - the two most common formats on the World Wide Web. Most paint applications
support both the GIF and JPEG standards.
see also "bitmap", "GIF", "JPEG"
JPEG
A lossy compression technique for color images created by the Joint Photographic Experts Group (JPEG).
Better for photos than the GIF format, it can use up to 24-bit color and reduce file sizes to about 5% of their
normal size. JPEG files are widely used on the World Wide Web and many other places.
(The JPEG format is sometimes known as JFIF, JFI, and JPG as well as JPEG).
You can use JPEG files in your RML document with the image tag.
see also "bitmap", "gif", "image"
jpg
See JPEG.
leading
Leading (pronounced "ledding") is the amount of vertical space allotted for a line of type - the distance between
the baseline of one line to the baseline of the next. The name comes from the way that printers used to use thin
strips of lead or brass to separate the lines of metal type.
In RML, leading can be supplied as an attribute for the para and paraStyle tags. It is expressed as the height
of the line plus the space between lines. So, for example, using a 12 point font with a leading of 18 gives you a
space between lines of 6 points.
You can also have negative leading. By giving a number smaller than the size of font you are using, you can
arrange it so that the lines overlap each other.
orthogonal
An adjective from mathematics meaning "relating to or composed of right angles".
A non-orthogonal transformation is one which does not preserve right angles. skew is a non-orthogonal
transformation.
PDF
The Portable Document Format. A format created by Adobe, this is a standard for electronic documents which is
platform-independent due to the freely available Acrobat reader. The PDF file format is a complex indexed
binary format, with a specification 600 pages long. (RML is much easier!)
RGB
A way of specifying a color by its Red, Green and Blue components. Usually used when referring to lights -
such as on a computer screen.
RML
Report Markup Language. An XML dialect, created by ReportLab, Inc, and and used by their software rml2pdf
to produce documents in PDF.
singletons
See "empty elements".
story
The part of an RML document where the main content of a document goes (if it uses the
"template/stylesheet/story" form). This is where text - split into paragraphs by <para> tags - is put.
Page 120
RML User Guide Document generated on 2017/06/19 20:18:43
stroke
In RML, the color of the outline of a graphic or text item (as opposed to that of its inside or fill.)
stylesheet
This is an obligatory part of an RML document. It is where the styles for paragraphs and blockTables are
defined (though it can be empty).
template
In those RML documents that use the "template/stylesheet/story" form, this is the part of the document where
any headers, footers, or background graphic elements are defined.
vanilla
Plain, ordinary, or standard [from the default flavor of ice cream in the U.S.]
In RML, you can put in letters, numbers, and punctuation in places which allow you to use "vanilla text", but
tags such as <para> or <b> are not allowed.
whitespace
For programmers, whitespace refers to all the characters that appear as blanks on your screen. This includes the
space and tab characters, linefeeds, carriage returns, and other more specialised characters.
For designers, whitespace is any areas on a page that aren't the content - the bits that are free of text or artwork.
XML
The Extensible Markup Language - a document processing standard set by the World Wide Web Consortium
(W3C) - the people who defined the standard for HTML.
Page 121
RML User Guide Document generated on 2017/06/19 20:18:43
<greek>a</greek> <greek>A</greek>
<greek>b</greek> <greek>B</greek>
<greek>c</greek> <greek>C</greek>
<greek>d</greek> <greek>D</greek>
<greek>e</greek> <greek>E</greek>
<greek>f</greek> <greek>F</greek>
<greek>g</greek> <greek>G</greek>
<greek>h</greek> <greek>H</greek>
<greek>i</greek> <greek>I</greek>
<greek>j</greek> <greek>J</greek>
<greek>k</greek> <greek>K</greek>
<greek>l</greek> <greek>L</greek>
<greek>m</greek> <greek>M</greek>
<greek>n</greek> <greek>N</greek>
<greek>o</greek> <greek>O</greek>
<greek>p</greek> <greek>P</greek>
<greek>q</greek> <greek>Q</greek>
<greek>r</greek> <greek>R</greek>
<greek>s</greek> <greek>S</greek>
<greek>t</greek> <greek>T</greek>
<greek>u</greek> <greek>U</greek>
<greek>v</greek> <greek>V</greek>
<greek>w</greek> <greek>W</greek>
<greek>x</greek> <greek>X</greek>
<greek>y</greek> <greek>Y</greek>
<greek>z</greek> <greek>Z</greek>
Page 122
RML User Guide Document generated on 2017/06/19 20:18:43
document
<document
filename="myfile.pdf" string required
compression="0|1|default" PDF compression (default)
invariant="0|1|default" PDF invariance (default)
debug="0|1" Debug document production (0)
userPass="uuserpw" Encryption user password
ownerPass="ownerpw" Encryption owner password
encryptionStrength="128|40" Encryption strength optional
defaults to 128
permissions="print annotate..." Encryption permissions optional
allowed are print copy modify annotate
default is print
>
<template...>...</template>
<stylesheet...>...</stylesheet>
<story...>...</story>
</document>
document
<document
filename="myfile.pdf" string required
>
<stylesheet>...</stylesheet>
<pageInfo>...</pageInfo> optional
<pageDrawing>...</pageDrawing> one or more
</document>
The document tag is the root tag for RML docuoments. Every RML document must contain on and only one
document tag. There are two forms for a document: the story form and the pageDrawing form.
Page 123
RML User Guide Document generated on 2017/06/19 20:18:43
docinit
<docinit
pageMode UseNone|UseOutlines|UseThumbs|FullScreen
pageLayout SinglePage|OneColumn|TwoColumnLeft|TwoColumnRight
useCropMarks (yes | no | 0 | 1 | true | false)
>
<alias ... />
<color ... />
<name ... />
<namedString> ... </namedString>
<outlineAdd> ... </outlineAdd>
<registerType1Face ... />
<registerFont ... />
<registerCidFont ... />
<registerTTFont ... />
<registerFontFamily ... />
<logConfig ... />
<cropMarks ... />
<startIndex ... />
</docinit>
template
<template
pageSize="(8.5in, 11in)" pair of lengths
rotation="270" page angular orientation (multiple of 90, default 0)
firstPageTemplate="main" page template id
leftMargin="1in" length
rightMargin="1in" length
topMargin="1.5in" length
bottomMargin="1.5in" length
showBoundary="false" truth value
allowSplitting="true" truth value
title="my title" string
author="yours truly" string
>
<pageTemplate...> ...</pageTemplate> 1 or more
</template>
Page 124
RML User Guide Document generated on 2017/06/19 20:18:43
stylesheet
<stylesheet>
<initialize>...</initialize> optional
<paraStyle ... /> (any number
<listStyle ... /> ...
<blockTableStyle>...</blockTableStyle> of styles)
</stylesheet>
story
<story>
<para>...</para> (Sequence of
... top level
<illustration>...</illustration> flowables)
</story>
pageInfo
<pageInfo
pageSize="(8.5in,11in)" pair of lengths required
/>
pageDrawing
<pageDrawing>
<drawString ...> ...</drawString> (Sequence of
... graphical
<place ...>...</place> operations)
</pageDrawing>
pageGraphics
<pageGraphics>
<drawString ...> ...</drawString> (Sequence of
... graphical
<place>...</place> operations)
</pageGraphics>
Page 125
RML User Guide Document generated on 2017/06/19 20:18:43
graphicsMode
<graphicsMode
origin="page|local|frame" drawing origin
>
<drawString ...> ...</drawString> (Sequence of
... graphical
<place ...>...</place> operations)
</graphicsMode>
illustration
<illustration
height="1.2in" measurement required
width="5in" measurement required
>
<drawString ...> ...</drawString> (Sequence of
... graphical
<place ...>...</place> operations)
</illustration>
pre
<pre
style="myfavoritestyle" string paragraph style name
>
Preformatted Text also string forms (getname)
</pre>
Page 126
RML User Guide Document generated on 2017/06/19 20:18:43
xpre
<xpre
style="myfavoritestyle" string paragraph style name
>
Paragraph text which may contain intraparagraph markup
</xpre>
plugInFlowable
<plugInFlowable
module="mymodule" string required
function="myfunction" string required
>
string data for plug in unformatted data
</plugInFlowable>
Table Elements
blockTable
<blockTable
style="mytablestyle" string style name
rowHeights="(23, 20, 30, 10)" sequence of measurement
colWidths="50, 90, 35, 11" sequence of measurement
repeatRows="2" repeat two rows when split (or tuple of zero based rows to re
>
<tr>...</tr> (rows of
<tr>...</tr> same length)
...
</blockTable>
tr
<tr>
<td>...</td>
<td>...</td>
...
</tr>
Page 127
RML User Guide Document generated on 2017/06/19 20:18:43
td
<td
fontName="Helvetica" stringform font name
fontSize="12" stringform font size
fontColor="red" stringform font color
leading="12" stringform line spacing
leftPadding="3" cell left padding
rightPadding="3" cell right padding
topPadding="3" cell top padding
bottomPadding="3" cell bottom padding
background="pink" background color
align="right" cell horizontal alignment
vAlign="bottom" vertical alignment
lineBelowThickness bottom line thickness
lineBelowColor bottom line color
lineBelowCap bottom cap (butt | round | square)
lineBelowCount bottom line count
lineBelowSpace bottom line spacing
lineAboveThickness topline thickness
lineAboveColor top line colour
lineAboveCap top cap (butt | round | square)
lineAboveCount top line count
lineAboveSpace top line spacing
lineLeftThickness left line thickness
lineLeftColor left line color
lineLeftCap left line cap (butt | round | square)
lineLeftCount left line count
lineLeftSpace left line spacing
lineRightThickness right line thickness
lineRightColor right line color
lineRightCap right line cap (butt | round | square)
lineRightCount right line count
lineRightSpace right line spacing
>
string of string form
or sequence of flowable
</td>
Page 128
RML User Guide Document generated on 2017/06/19 20:18:43
docAssert
<docAssert
cond="i==3" condition string required
format string
format="The value of i is %(__expr__)"
/>
docAssign
<docAssign
var="i" string
expr="availableWidth" expression string
/>
docElse
<docElse/>
docIf
<docIf
cond="i==3" condition string
/>
docExec
<docExec
stmt="i-=1" statement string
/>
docPara
<docPara
expr="availableWidth" expression string
format string
format="The value of i is %(__expr__)"
style="" string
escape="yes" (yes | no | 0 | 1)
/>
Page 129
RML User Guide Document generated on 2017/06/19 20:18:43
docWhile
<docWhile
cond="i==3" condition string
/>
drawing
<drawing
baseDir="../" path string
module="python_module" string
function="module_function" string
hAlign="CENTER" center|centre|left|right|CENTER|CENTRE|LEFT|RIGHT
showBoundary="no" (0|1|yes|no)
/>
widget
<widget
baseDir="../" path string
module="python_module" string
function="module_function" string
name="somename" string
initargs="someinitargs" string
/>
Paragraph-like Elements
para
<para
style="myfavoritstyle" string paragraph style name
>
Paragraph text which may contain
intraparagraph markup
</para>
Page 130
RML User Guide Document generated on 2017/06/19 20:18:43
title
<title
style="myfavoritstyle" string paragraph style name
>
Paragraph text which may contain
intraparagraph markup
</title>
h1
<h1
style="myfavoritstyle" string paragraph style name
>
Paragraph text which may contain
intraparagraph markup
</h1>
h2
<h2
style="myfavoritstyle" string paragraph style name
>
Paragraph text which may contain
intraparagraph markup
</h2>
h3
<h3
style="myfavoritstyle" string paragraph style name
>
Paragraph text which may contain
intraparagraph markup
</h3>
h4
<h4
style="myfavoritstyle" string paragraph style name
>
Paragraph text which may contain
intraparagraph markup
</h4>
Page 131
RML User Guide Document generated on 2017/06/19 20:18:43
h5
<h5
style="myfavoritstyle" string paragraph style name
>
Paragraph text which may contain
intraparagraph markup
</h5>
h6
<h6
style="myfavoritstyle" string paragraph style name
>
Paragraph text which may contain
intraparagraph markup
</h6>
a
<a
color="blue" string color name
fontSize="12" stringform font size
fontName="Helvetica" string font name
name="somename" string
backColor="cyan" string color string
href="someurl" string
>
Link name
</a>
evalString
<evalString
imports="someimports" string
default="somedefault" string
/>
Intra-Paragraph Markup
Page 132
RML User Guide Document generated on 2017/06/19 20:18:43
i
<i>
Paragraph text which may contain
intraparagraph markup
</i>
b
<b>
Paragraph text which may contain
intraparagraph markup
</b>
font
<font
face="Helvetica" string font name
color="blue" string color name
size="34" fontsize measurement
>
Paragraph text which may contain
intraparagraph markup
</font>
greek
<greek>
Paragraph text which may contain
intraparagraph markup
</greek>
sub
<sub
rise="5" optional: baseline shifts -rise (or -0.5*font size)
size="6" optional: font size for subscript (font size - 2 or 0.8*font size)
>
Paragraph text which may contain
intraparagraph markup
</sub>
Page 133
RML User Guide Document generated on 2017/06/19 20:18:43
sup
<sup
rise="5" optional: baseline shifts rise (or 0.5*font size)
size="6" optional: font size for superscript (font size - 2 or 0.8*font siz
>
Paragraph text which may contain
intraparagraph markup
</sup>
super
<super
rise="5" optional: baseline shifts rise (or 0.5*font size)
size="6" optional: font size for superscript (font size - 2 or 0.8*font siz
>
Paragraph text which may contain
intraparagraph markup
</super>
strike
<strike/>
sup
<sup/>
seq
<seq
id="SecNum" string
template="%(Ch)s.%(SecNum)s" string
/>
seqDefault
<seqDefault
id="SecNum" string
/>
Page 134
RML User Guide Document generated on 2017/06/19 20:18:43
seqReset
<seqReset
id="SecNum" string
/>
seqChain
<seqChain
order="id id id id" string
/>
seqFormat
<seqFormat
id="seqId" string
value="format char" (1|i|I|a|A)
/>
onDraw
<onDraw
name="somename" string
label="somelabel" string
/>
br
<br/>
bullet
<bullet
bulletColor="blue" string color name
bulletFontName="" string
bulletFontSize="1in" measurement
bulletIndent="1in" measurement
bulletOffsetY="1in" measurement
/>
Page 135
RML User Guide Document generated on 2017/06/19 20:18:43
link
<link
destination="somedestination" string
color="blue" string color name
/>
setLink
<setLink
destination="somedestination" string
color="blue" string color name
/>
unichar
<unichar
name="somename" string
code="somecode" string
/>
nextFrame
<nextFrame
name="frameindex" int or string frame index
/>
setNextFrame
<setNextFrame
name="frameindex" int or string frame index required
/>
nextPage
<nextPage
name="templatename" string template name optional
/>
Page 136
RML User Guide Document generated on 2017/06/19 20:18:43
setNextTemplate
<setNextTemplate
name="indextemplate" string template name required
/>
condPageBreak
<condPageBreak
height="10cm" measurement required
/>
storyPlace
<storyPlace
x="1in" measurement required
y="7in" measurement required
width="5in" measurement required
height="3in" measurement required
origin="page" "page", "frame", or "local" optional
>
<para>...</para> (Sequence of
... top level
<table>...</table> flowables)
</storyPlace>
keepInFrame
<keepInFrame
maxWidth="int" maximum width or 0
maxHeight="int" maximum height or 0
frame="frameindex" optional frameindex to start in
mergeSpace="1|0" whether padding space is merged
onOverflow="error|overflow|"
...... |shrink|truncate" over flow behaviour
id="name" name for identification purposes
>
<para>...</para> (Sequence of
... top level
<table>...</table> flowables)
</keepInFrame>
Page 137
RML User Guide Document generated on 2017/06/19 20:18:43
imageAndFlowables
<imageAndFlowables
imageName="path" path to image file or url
imageWidth="float" image width or 0
imageHeight="float" image height or 0
imageMask="color" image transparency color or "auto"
imageLeftPadding="float" space on left of image
imageRightPadding="float" space on right of image
imageTopPadding="float" space on top of image
imageBottomPadding="float" space on bottom of image
imageSide="left" hrizontal image location left|right
>
<para>...</para> (Sequence of
... top level
<table>...</table> flowables)
</imageAndFlowables>
pto
<pto>
<pto_trailer>...</pto_trailer> optional
<pto_header>...</pto_header> optional
<para>...</para> (Sequence of
... top level
<table>...</table> flowables)
</pto>
pto_trailer
<pto_trailer>
Only in PTO
<para>...</para> (Sequence of
... top level
<table>...</table> flowables)
</pto_trailer>
pto_header
<pto_header>
Only in PTO
<para>...</para> (Sequence of
... top level
<table>...</table> flowables)
</pto_header>
Page 138
RML User Guide Document generated on 2017/06/19 20:18:43
indent
<indent
left="1in" measurement optional
right="1cm" measurement optional
>
<para>...</para> (Sequence of
... top level
<table>...</table> flowables)
</indent>
frameBackground
<frameBackground
color="pink" color optional
left="1in" measurement optional
right="1cm" measurement optional
start="1" boolean optional
/>
fixedSize
<fixedSize
width="1in" measurement optional
height="1cm" measurement optional
>
<para>...</para> (Sequence of
... top level
<table>...</table> flowables)
</fixedSize>
Page 139
RML User Guide Document generated on 2017/06/19 20:18:43
drawRightString
<drawRightString
x="1in" measurement required
y="7in" measurement required
>
text to draw or string forms
</drawRightString>
drawCentredString
<drawCentredString
x="1in" measurement required
y="7in" measurement required
>
text to draw or string forms
</drawCentredString>
drawCenteredString
<drawCenteredString
x="1in" measurement required
y="7in" measurement required
>
synonym for drawCentredString
</drawCenteredString>
ellipse
<ellipse
x="1in" measurement required
y="7in" measurement required
width="5cm" measurement required
height="3cm" measurement required
fill="true" truth value
stroke="false" truth value
/>
Page 140
RML User Guide Document generated on 2017/06/19 20:18:43
circle
<circle
x="1in" measurement required
y="7in" measurement required
radius="3cm" measurement required
fill="true" truth value
stroke="false" truth value
/>
rect
<rect
x="1in" measurement required
y="7in" measurement required
width="5cm" measurement required
height="3cm" measurement required
round="1.2cm" measurement
fill="true" truth value
stroke="false" truth value
/>
grid
<grid
xs="1in 2in 3in" measurements required
ys="7in 7.2in 7.4in" measurements required
/>
lines
<lines>
1in 1in 2in 2in quadruples of
1in 2in 2in 3in measurements
1in 3in 2in 4in representing
... line segments
</lines>
Page 141
RML User Guide Document generated on 2017/06/19 20:18:43
curves
<curves>
1in 1in 2in 2in 2in 3in 1in 3in octtuples of
1in 2in 2in 3in 2in 4in 1in 4in measurements
1in 3in 2in 4in 2in 5in 1in 5in representing
... Bezier curves
</curves>
image
<image
file="cute.jpg" string required
x="1in" measurement required
y="7in" measurement required
width="5cm" measurement
height="3cm" measurement
/>
place
<place
x="1in" measurement required
y="7in" measurement required
width="5in" measurement required
height="3in" measurement required
>
<para>...</para> (Sequence of
... top level
<illustration>...</illustration> flowables)
</place>
doForm
<doForm
name="logo" string required
/>
Page 142
RML User Guide Document generated on 2017/06/19 20:18:43
includePdfPages
<includePdfPages
filename="path" string required: path to included file
pages="1-3,6" string optional: , separated page list
template="name" string optional: pagetemplate name
outlineText="text" string optional: text for outline entry
outlineLevel="1" int optional: outline level default 0
outlineClose="0" int optional: 0 for closed outline entry
leadingFrame="no" bool optional: no if you don't want a pa
isdata="yes" bool optional: true if filename is a page
orientation="auto" string optional: 0 90 180 270 auto landsc
sx="0.9" float
sy="0.9" float
dx="2in" measurement
dy="2in" measurement
degrees="45" angle in degrees
/>
textField
<textField
id="name" name of field required
value="initial" field initial value optional
x="34" x coord
y="500" y coord
width="72" width
height="12" height
maxlen="1200" maximum #chars
multiline="0/1" 1 for multiline text
>
value text or <param> tags
param value or attributes allowed not both
</textField>
textAnnotation
<textAnnotation>
annotaion text or <param> tags
params may adjust the annotation
</textAnnotation>
Page 143
RML User Guide Document generated on 2017/06/19 20:18:43
plugInGraphic
<plugInGraphic
module="mymodule" string required
function="myfunction" string required
>
string data for plug in unformatted data
</plugInGraphic>
path
<path
x="1in" measurement required
y="7in" measurement required
close="true" truth value
fill="true" truth value
stroke="false" truth value
autoclose="none" none|svg|pdf
fillrule="none" none|even-odd|non-zero
>
1in 6in measurement pairs
1in 7in representing points
... or path operations
</path>
barCodeFlowable
Page 144
RML User Guide Document generated on 2017/06/19 20:18:43
<barCodeFlowable
code="Code11" (I2of5 | Code128 | Standard93
required
| Extended93 | Standard39 | E
value="somevalue" string required
fontName="Helvetica" string font name
tracking="sometracking" string
routing="somerouting" string
barStrokeColor="blue" string color name
barFillColor="blue" string color name
textColor="blue" string color name
barStrokeWidth="1in" measurement
gap="1in" measurement
ratio="I2of5" string
bearers="" string
barHeight="1in" measurement
barWidth="1in" measurement
fontSize="12" stringform font size
spaceWidth="1in" measurement
spaceHeight="1in" measurement
widthSize="1in" measurement
heightSize="1in" measurement
checksum="-1" (-1 | 0 | 1 | 2)
quiet="yes" (yes | no | 0 | 1)
lquiet="yes" (yes | no | 0 | 1)
rquiet="yes" (yes | no | 0 | 1)
humanReadable="yes" (yes | no | 0 | 1)
stop="yes" (yes | no | 0 | 1)
/>
figure
<figure
showBoundary="no" (0|1|yes|no)
shrinkToFit="no" (0|1|yes|no)
growToFit="no" (0|1|yes|no)
scaleFactor="somescaleFactor" string
/>
Page 145
RML User Guide Document generated on 2017/06/19 20:18:43
imageFigure
<imageFigure
imageName="someimageName" string
imageWidth="1in" measurement
imageHeight="1in" measurement
imageMask="someimageMask" string
preserveAspectRatio="yes" (yes | no | 0 | 1)
showBoundary="yes" (yes | no | 0 | 1)
pdfBoxType="MediaBox" (MediaBox | CropBox | TrimBox | BleedBox | ArtBox)
pdfPageNumber="4" integer
showBoundary="no" (0|1|yes|no)
shrinkToFit="no" (0|1|yes|no)
growToFit="no" (0|1|yes|no)
caption="somecaption" string
captionFont="12" stringform font name
captionSize="1in" measurement
captionGap="somecaptionGap" string
captionColor="blue" string color name
spaceAfter="4" integer
spaceBefore="4" integer
(center|centre|left|right|CENTER|CENTRE|LEFT|RIGHT)
align="center|centre|left|right|CENTER|CENTRE|LEFT|RIGHT)"
/>
img
<img
src="somesrc" string
width="1in" measurement
height="1in" measurement
valign="top" (top|middle|bottom))
/>
Path Operations
moveto
<moveto>
5in 3in measurement pair
</moveto>
Page 146
RML User Guide Document generated on 2017/06/19 20:18:43
curvesto
<curvesto>
1in 1in 1in 4in 4in 4in sextuples of
2in 2in 2in 5in 5in 5in measurements for
... bezier curves
</curvesto>
closePath
<closePath/>
barCode
<barCode
x="1in" measurement required
y="1in" measurement required
code="Code 11" "Codabar", "Code11", required
"Code128", "I2of5"
"Standard39", Standard93",
"Extended39", "Extended93"
"MSI", "FIM", "POSTNET"
>
01234545634563 unformatted barcode data
</barCode>
checkBox
Page 147
RML User Guide Document generated on 2017/06/19 20:18:43
<checkBox
style="myboxstyle" string box style name
x="1in" measurement required
y="1in" measurement required
labelFontName="Helvetica" string font name
labelFontSize="12" fontsize measurement
labelTextColor="blue" string color name
boxWidth="1in" measurement
boxHeight="1in" measurement
checkStrokeColor="blue" string color name
boxStrokeColor="blue" string color name
boxFillColor="blue" string color name
lineWidth="1" measurement
line1="label text 1" string
line2="label text 2" string
line3="label text 3" string
checked="false" truth value
bold="false" truth value
graphicOn="cute_on.jpg" string file name
graphicOff="cute_off.jpg" string file name
/>
letterBoxes
Page 148
RML User Guide Document generated on 2017/06/19 20:18:43
<letterBoxes
style="myboxstyle" string box style name
x="1in" measurement required
y="1in" measurement required
count="10" integer required
label="label text" string
labelFontName="Helvetica" string font name
labelFontSize="12" fontsize measurement
labelTextColor="blue" string color name
labelOffsetX="1in" measurement
labelOffsetY="1in" measurement
boxWidth="1in" measurement
boxHeight="1in" measurement
combHeight="0.25" float
boxStrokeColor="blue" string color name
boxFillColor="blue" string color name
textColor="blue" string color name
lineWidth="1in" measurement
fontName="Helvetica" string font name
fontSize="12" fontsize measurement
>
box contents goes here unformatted data
</letterBoxes>
textBox
Page 149
RML User Guide Document generated on 2017/06/19 20:18:43
<textBox
style="myboxstyle" string box style name
x="1in" measurement required
y="1in" measurement required
boxWidth="1in" measurement required
boxHeight="1in" measurement required
labelFontName="Helvetica" string font name
labelFontSize="12" fontsize measurement
labelTextColor="blue" string color name
labelOffsetX="1in" measurement
labelOffsetY="1in" measurement
boxStrokeColor="blue" string color name
boxFillColor="blue" string color name
textColor="blue" string color name
lineWidth="1in" measurement
fontName="Helvetica" string font name
fontSize="12" fontsize measurement
align="left" "left", "right" or "center"
shrinkToFit="false" truth value
label="label text" string
>
box contents goes here unformatted data
</textBox>
stroke
<stroke
color="blue" string name required
/>
Page 150
RML User Guide Document generated on 2017/06/19 20:18:43
setFont
<setFont
name="Helvetica" string name required
size="1cm" measurement required
/>
form
<form
name="logo" string name required
>
<drawString ...> ...</drawString> (Sequence of
... graphical
<place ...>...</place> operations)
</form>
catchForms
<catchForms
storageFile="storage.data" string name required
/>
scale
<scale
sx="0.8" scale factor required
sy="1.3" scale factor required
/>
translate
<translate
dx="0.8in" measurement required
dy="1.3in" measurement required
/>
rotate
<rotate
degrees="45" angle in degrees required
/>
Page 151
RML User Guide Document generated on 2017/06/19 20:18:43
skew
<skew
alpha="15" angle in degrees required
beta="5" angle in degrees required
/>
transform
<transform>
1.0 0.3 six number affine
-0.2 1.1 transformation
10.1 15 matrix
</transform>
lineMode
<lineMode
width="0.2cm" measurement
dash=".1cm .2cm" measurements
join="round" "round", "mitered", or "bevelled"
cap="square" "default", "round", or "square"
/>
Style Elements
initialize
<initialize>
<alias.../> sequence of
<name.../> alias, name
<color.../> or color tags
</initialize>
paraStyle
Page 152
RML User Guide Document generated on 2017/06/19 20:18:43
<paraStyle
name="mystyle" string
alias="pretty" string
parent="oldstyle" string
fontname="Courier-Oblique" string
fontsize="13" measurement
leading="20" measurement
leftIndent="1.25in" measurement
rightIndent="2.5in" measurement
firstLineIndent="0.5in" measurement
spaceBefore="0.2in" measurement
spaceAfter="3cm" measurement
alignment="justify" "left", "right", "center" or "justify"
bulletFontName="Courier" string
bulletFontsize="13" measurement
bulletIndent="0.2in" measurement
textColor="red" string
backColor="cyan" string
/>
listStyle
<listStyle
name="myliststyle"" string
alias string
parent name of parent style
start number or bulletvalue or list of same
leftIndent measurement
rightIndent measurement
spaceBefore measurement
spaceAfter measurement
bulletAlign "left", "right" or "center"
bulletType measurement
bulletColor collor specification
bulletFontName='Zapf-Dingbats' string
bulletFontSize measurement
bulletOffsetY measurement
bulletDedent measurement
bulletDir rtl | ltr
bulletFormat string
/>
Page 153
RML User Guide Document generated on 2017/06/19 20:18:43
ul
<ul
style='mysliststyle' optional list style name
start number or bulletvalue or list of same
leftIndent measurement
rightIndent measurement
spaceBefore measurement
spaceAfter measurement
bulletAlign "left", "right" or "center"
bulletType measurement
bulletColor collor specification
bulletFontName='Zapf-Dingbats' string
bulletFontSize measurement
bulletOffsetY measurement
bulletDedent measurement
bulletDir rtl | ltr
bulletFormat string
>
<li>....</li>
.....
<li>....</li>
</ul>
ol
Page 154
RML User Guide Document generated on 2017/06/19 20:18:43
<ol
style='mysliststyle' optional list style name
start number or bulletvalue or list of same
leftIndent measurement
rightIndent measurement
spaceBefore measurement
spaceAfter measurement
bulletAlign "left", "right" or "center"
bulletType measurement
bulletColor collor specification
bulletFontName='Zapf-Dingbats' string
bulletFontSize measurement
bulletOffsetY measurement
bulletDedent measurement
bulletDir rtl | ltr
bulletFormat string
>
<li>....</li>
.....
<li>....</li>
</ol>
li
<li
style='mysliststyle' optional list style name
value number or bulletvalue to use
leftIndent measurement
rightIndent measurement
spaceBefore measurement
spaceAfter measurement
bulletAlign "left", "right" or "center"
bulletType measurement
bulletColor collor specification
bulletFontName='Zapf-Dingbats' string
bulletFontSize measurement
bulletOffsetY measurement
bulletDedent measurement
bulletDir rtl | ltr
bulletFormat string
>
<flowables............</flowables>
</li>
Page 155
RML User Guide Document generated on 2017/06/19 20:18:43
dl
<dl
ddLeftIndent measurement
ddRghtIndent measurement
>
<dt>...</dt> | <dd>...</dd>
.......
<dt>...</dt> | <dd>...</dd>
</dl>
dd|dt
<dd|dt>
<flowables............</flowables>
</dd|dt>
boxStyle
<boxStyle
name="mystyle" string required
alias="pretty" string
parent="oldstyle" string
fontname="Courier-Oblique" string
fontsize="13" measurement
alignment="left" "left", "right" or "center"
textColor="blue" string color name
labelFontName="Courier" string
labelFontSize="13" measurement
labelAlignment="left" "left", "right" or "center"
labelTextColor="blue" string color name
boxFillColor="blue" string color name
boxStrokeColor="blue" string color name
cellWidth="1in" measurement
cellHeight="1in" measurement
/>
blockTableStyle
Page 156
RML User Guide Document generated on 2017/06/19 20:18:43
<blockTableStyle
id="mytablestyle" string
>
<blockFont.../> table style
<blockLeading.../> block descriptors
...
</blockTableStyle>
blockFont
<blockFont
name="TimesRoman" string required
size="8" measurement
leading="10" measurement
start="4" integer
stop="11" integer
/>
blockLeading
<blockLeading
length="10" measurement required
start="4" integer
stop="11" integer
/>
blockTextColor
<blockTextColor
colorName="pink" string required
start="4" integer
stop="11" integer
/>
blockAlignment
<blockAlignment
value="left" "left", "right", or "center"
start="4" integer
stop="11" integer
/>
Page 157
RML User Guide Document generated on 2017/06/19 20:18:43
blockLeftPadding
<blockLeftPadding
length="0.2in" measurement required
start="4" integer
stop="11" integer
/>
blockRightPadding
<blockRightPadding
length="0.2in" measurement required
start="4" integer
stop="11" integer
/>
blockBottomPadding
<blockBottomPadding
length="0.2in" measurement required
start="4" integer
stop="11" integer
/>
blockTopPadding
<blockTopPadding
length="0.2in" measurement required
start="4" integer
stop="11" integer
/>
blockBackground
<blockBackground
colorName="indigo" string required
start="4" integer
stop="11" integer
/>
Page 158
RML User Guide Document generated on 2017/06/19 20:18:43
blockValign
<blockValign
value="left" "top", "middle", or "bottom"
start="4" integer
stop="11" integer
/>
blockSpan
<blockSpan
start="4" integer
stop="4" integer
/>
lineStyle
<lineStyle
kind="BOX" line command required
thickness="4" measurement required
colorName="magenta" string required
start="4" integer
stop="11" integer
count="2" integer
space="2" integer
dash="2,2" integer,integer
/>
The line command names are: GRID, BOX, OUTLINE, INNERGRID, LINEBELOW, LINEABOVE,
LINEBEFORE and LINEAFTER. BOX and OUTLINE are equivalent, and GRID is the equivalent of applying
both BOX and INNERGRID.
bulkData
<bulkData
stripBlock="yes" (yes | no)
stripLines="yes" (yes | no)
stripFields="yes" (yes | no)
fieldDelim="," string
recordDelim="," string
/>
Page 159
RML User Guide Document generated on 2017/06/19 20:18:43
excelData
<excelData
fileName="somefileName" string
sheetName="somesheetName" string
range="A1:B7" string
rangeName="somerangeName" string
/>
frame
<frame
id="left" string required
x1="1in" measurement required
y1="1in" measurement required
width="50cm" measurement required
height="90cm" measurement required
/>
pageGraphics
<pageGraphics/>
Page 160
RML User Guide Document generated on 2017/06/19 20:18:43
Special Tags
name
<name
id="chapterName" string required
value="Introduction" string required
/>
alias
<alias
id="footerString" string required
value="chapterName" string required
/>
getName
<getName
id="footerString" string required
/>
color
<color
id="footerString" string required
RGB="77aa00" hexidecimal red/green/blue values
/>
pageNumber
<pageNumber
countingFrom="2" integer
/>
outlineAdd
<outlineAdd
level="1" integer
closed="true" truth value
>
Chapter 1, section 2 outline entry text
</outlineAdd>
Page 161
RML User Guide Document generated on 2017/06/19 20:18:43
cropMarks
<cropMarks
borderWidth="36" integer
markWidth="0.5" float
markColor="green" color
markLength="18" integer
/>
startIndex
<startIndex
name="somename" string
offset="0" integer
format="ABC" 123|I|i|ABC|abc
/>
index
<index
name="somename" string
offset="0" integer
format="ABC" 123|I|i|ABC|abc
/>
showIndex
<showIndex
name="somename" string
dot="-" string
style="somestyle" string
tableStyle="sometablestyle" string
/>
bookmark
<bookmark
name="somename" string
x="1in" measurement
y="1in" measurement
/>
Page 162
RML User Guide Document generated on 2017/06/19 20:18:43
bookmarkPage
<bookmarkPage
name="somename" string
fit="XYZ|Fit|FitH|FitV|FitR)" (XYZ|Fit|FitH|FitV|FitR)
top="1in" measurement
bottom="1in" measurement
left="1in" measurement
right="1in" measurement
zoom="somezoom" string
/>
join
<join
type="sometype" string
/>
length
<length
id="someid" string
value="4" integer
/>
namedString
<namedString
id="someid" string
type="sometype" string
default="somedefault" string
/>
param
<param
name="somename" string
/>
Page 163
RML User Guide Document generated on 2017/06/19 20:18:43
registerCidFont
<registerCidFont
faceName="VeraBold" font name string
encName="WinAnsiEncoding" string
/>
registerFont
<registerFont
name="somename" string
faceName="VeraBold" font name string
encName="WinAnsiEncoding" string
/>
registerFontFamily
<registerFontFamily
normal="VeraBold" font name string
bold="VeraBold" font name string
italic="VeraBold" font name string
boldItalic="VeraBold" font name string
/>
registerTTFont
<registerTTFont
faceName="VeraBold" font name string
fileName="somefileName" string
/>
registerType1Face
<registerType1Face
afmFile="DarkGardenMK.afm" string
pfbFile="DarkGardenMK.pfb" string
/>
Page 164
RML User Guide Document generated on 2017/06/19 20:18:43
restoreState
<restoreState/>
saveState
<saveState/>
setFont
<setFont
name="somename" font name string
size="1in" measurement
leading="4" integer
/>
setFontSize
<setFontSize
size="1in" measurement
leading="4" integer
/>
Log tags
log
<log
log="evel" (DEBUG | INFO | WARNING | ERROR | CRITICAL)
>
log message
</log>
debug
<debug>
debug message
</debug>
Page 165
RML User Guide Document generated on 2017/06/19 20:18:43
info
<info>
info message
</info>
warning
<warning>
warning message
</warning>
error
<error>
error message
</error>
critical
<critical>
critical message
</critical>
logConfig
<logConfig
level="DEBUG" (DEBUG | INFO | WARNING | ERROR | CRITICAL)
format string
format="The value of i is %(__expr__)"
filename="somefilename" string
filemode="WRITE" (WRITE | APPEND)
datefmt="somedatefmt" string
/>
Page 166