From: (no author) <(no author)@unknown>
Date: Sun, 3 Mar 2002 00:16:11 +0000 (+0000)
Subject: This commit was manufactured by cvs2svn to create tag 'fop-0_20_3'.
X-Git-Tag: fop-0_20_3^0
X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b18a8b0cb353d541fe32d63c9227c52a69e700ad;p=xmlgraphics-fop.git
This commit was manufactured by cvs2svn to create tag 'fop-0_20_3'.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/tags/fop-0_20_3@194687 13f79535-47bb-0310-9956-ffa450edef68
---
diff --git a/CHANGES b/CHANGES
index 06e6efdee..650acf66d 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,30 @@
==============================================================================
Done since 0.20.2 release
+*** General
+- Added correct metrics for euro sign in standard fonts
+ (bug 2105 and bug 4654)
+ Submitted by: Rainer Garus
+ In a few seconds, you should be redirected to FOP 0.20.3
+ documentation. If you are not automatically redirected, please click
+ on the following link:
+ Fop 0.20.3
+ Redirecting to Documentation...
+
+ FOP 0.20.3 Release Notes
+
+
+The overall process is controlled by org.apache.fop.apps.Driver. +This class handles the FO Tree building, renderers, output and logging. +
++The process in general is that the FO document is sent to the tree +builder via SAX events. This creates an FO Tree. The FO Tree is then +handled by the layout processor which converts the FO Tree into an area +tree. This area tree is then given to the renderer and the renderer converts +the area tree into a stream of data containing the output document. +
++The class org.apache.fop.fo.FOTreeBuilder is responsible for +actually constructing the FO tree. The key SAX events used are
+startElement()
,
endElement()
and characters()
.
All formatting objects derive from abstract class +org.apache.fop.fo.FONode. The other FO classes inherit from +FONode as follows:
+ +
+This is a separate process. The render()
method in
+Driver is invoked (say,
+by CommandLine) with the laid-out AreaTree and a
+PrintWriter as arguments.
+This actually calls the render()
method in a specific implementation of
+the Renderer interface, typically PDFRenderer or
+AWTRenderer.
+
The code to implement the area tree will attempt to match the areas defined in the specification. A number of optimisations may be possible -for similar areas and groups of areas. -
Since the area tree will be used during the layout by the layout managers it will need to store information that affects the layout. The information such as spacing and keeps will be held in such a way that it can be -discarded once the layout is finalised. -
The area tree is a root element that has a list of page-viewport-areas. Each page viewport has a page-reference-area which holds the contents of the page. To handle the processing better FOP does not maintain a list at the root level but lets another class handle each page as it is added. -
A page is made up of five area regions. These are before, start, body, end and after. Each region has a viewport and contains the areas produced from the children in the FO object heirarchy. -
For the body area there are more subdivisions for before floats, footnotes and the main reference area. The main reference area is made from span areas which have normal flow reference areas as children. The flow areas are then created inside these normal flow reference areas. -
Since the layout is done inside a page, the page is created from the pagemaster with all the appropriate areas. The layout manager then uses the page to add areas into the normal flow reference areas and floats and footnotes. After the layout of the body region is complete then the other regions can be done. -
Block areas are created and/or returned by all top level elements in the flow. These areas have keep and spacing information that needs to be retained until the page is finalised. A block area is stacked with other block areas in a particular direction, it has a size and it contains either line areas made from a group of inline areas or block areas. -
A block area can also be split into two block areas by splitting between two line areas or splitting between two block areas (or groups) that are stacked in the block progression direction of the page. The split may also be in a child block area. -
A line areas is simply a collection of inline areas that are stacked in the inline progression direction. A line area has a height and width. It also contains information about floats and footnotes that are associated with the inline areas. -
A line area gets a set of inline areas added until complete then it is justified and vertically aligned. If the line area contains unresolved areas it will retain the justification information until all areas are resolved. -
There are a few different types of inline areas. All inline areas have a height. Their width may be variable until the line is finalised. -
Unresolved areas can reserve some space to allow for possible sizes once it is resolved. Then the line can be re-justified and finalised. -
Any subtree of the area tree should be cloneable so that for areas that are repeated the area tree can simply be copied rather than going through the layout again. This will only work if the width is the same. -
Resolveable areas may be converted into an unresolved form. -
The following class structure will be used to represent the area tree. -
The page area classes hold the top level layout of a page. The areas are created by the page master and should be ready to have flow areas added. -
The block areas typically hold either a set of line areas or a set of block areas. The child areas are usually stacked in a particular direction. -
Areas for tables and lists have their child block areas stacked in different ways. Lists also can have spacing between the block areas. -
The inline areas are used to make up a line area. An inline area typically has a height, width and some content. The alignment is used for block progression direction displacement and to determine the height of a line. -
The rendering of an area tree is done by rendering each page to a suitable output. The regions are rendered in order and each region is contained by a viewport. -
The relevent structures that will need to be rendered are: Page Viewport @@ -165,8 +155,8 @@ Span Block Line Inline -
The renderer will need to be able to:
An abstract renderer will be able to handle the generic positioning of child areas, iterating through areas that have child areas. -
+This is the design for the external interface when FOP is to be embedded +inside another java application. +
+
+Common places where FOP is embedded is in a report production application
+of a server side application such as
+The FO Tree is an internal representation of the input FO document. +The tree is created by building the elements and attributes from +the SAX events. +
++The FO Tree is used as an intermediatory structure which is converted +into the area tree. The complete FO tree should not be held in memory +since FOP should be able to handle FO documents of any size. +
+ ++The class inheritance described above only describes the nature of the +content. Every FO in FOP also has a parent, and a Vector of children. The +parent attribute (in the Java sense), in particular, is used to enforce +constraints required by the FO hierarchy. +
+ +
+FONode, among other things, ensures that FO's have a parent, that they
+have children, that they maintain a marker of where the layout was up to
+(for FObj's it is the child number, and for FOText's it is the character
+number), and that they have a layout()
method.
+
+An FO maker is read from a hashmap lookup using the namespace and +element name. This maker is then used to create a new class that +represents an FO element. This is then added to the FO tree as a child +of the current parent. +
+ ++Properties (recall that FO's have properties, areas have traits, and XML +nodes have attributes) are also a concern of FOTreeBuilder. It +accomplishes this by using a PropertyListBuilder. There is a +separate PropertyListBuilder for each namespace encountered +while building the FO tree. Each Builder object contains a hash of +property names and their respective makers. It may also +contain element-specific property maker hashes; these are based on the +local name of the flow object, ie. table-row, not +fo:table-row. If an element-specific property mapping exists, +it is preferred to the generic mapping.
+The base class for all
+properties is Property, and all the property makers extend
+Property.Maker. A more complete discussion of the property
+architecture may be found in
+FOP supports the handlingof foreign XML. +The XML is converted internally into a DOM, this is then available to +the FO tree to convert the DOM into another format which can be rendered. +In the case of SVG the DOM needs to be created with Batik, so an element +mapping is used to read all elements in the SVG namespace and pass them +into the Batik DOM. +
++It is possible to add extensions to FOP so that you can extend the ability of +FOP with respect to render output, document specific information or extended +layout functionality. +
+
+
+The information here is still in the early stage, some information
+may be wrong or misleading. In general there is not a broad enough
+input and it is lacking in depth of information.
+
+The redesign is mainly focusing on some particular process involved +with the layout process when converting the FO tree into the Area Tree. +
++The main aim for FOP is to comply with the spec and to be able to +process files of any size. +
++In achieving this aim we need to understand the problem and break it +into small problems that can be solved. +
++
The aim of the layout system is to be self contained and allow for easy changes or extensions for future development. For example the line breaking should be decided at a particular point in the process that makes it easier to handle other languages. -
The layout begins once the hierarchy of FO objects has been constructed. Note: it may be possible to start immediately after a block formatting object has been added to the flow but this is not currently in the scope of the layout. It is also possible to layout all pages in a page sequence after each page sequence has been added from the xml. -
The layout process is handled by a set of layout managers. The block level layout managers are used to create the block areas which are added to the region area of a page. -
The layout managers are set up from the hierarchy of the formatting object tree. A manager represents a hierachy of area producing objects. A manager is able to handle the block area(s) that it creates and organise or split areas for page breaks. -
Normally any object that creates a block area will have an associated layout manager. Other cases are tables and lists, these objects will also have layout managers that will manager the group of layout managers that make up the object. -
A layout manager is also able to determine height (min/max/optimum) and keep status. This will be used when organising the layout on a page. The manager will be able to determine the next place a break can be made and then be able to organise the height. -
A layout manager is essentially a bridge between the formatting objects and the area tree. It will keep a list of line areas inside block areas. Each line area will contain a list of inline areas that is able to be adjusted if the need arises. -
The objects in the area tree that are organised by the manager will mostly contain the information about there layout such as spacing and keeps, this information will be thrown away once the layout for a page is finalised. -
The managers are created by the page sequence. The top level manager is the Page manager. This asks the flow to add all managers in this page sequence. -
For block level objects they have a layout manager. Neutral objects don't represent any areas but are used to contain a block level area and as such these objects will ask the appropriate child to create a layout manager. -
Any nested block areas or inline areas may be handled by the layout manager at a later stage. -
Block area layout managers are used to create a block area, other block level managers may ask their child layout managers to create block areas which are then added to the area tree (subset). -
A manager is used to add areas to a page until the page is full, then the manages contain all the information necessary to make the decision about page break and spacing. A manager can split an area that it has created will keep a status about what has been added to the current area tree. -
Once the Page layout manager, belonging to the page sequence, is ready then we can start laying out each page. The page sequence will create the current page to put the page data, the next page and if it exists a last page. -
The current page will have the areas added to it from the block layout managers. The next page will be used when splitting a block that goes over the page break. Note: any page break overrides the layout decided here. The last page will be necessary if the last block area is added to this page. The size of the last page will be considered and the areas will be added to the last page instead. -
The first step is to add areas to the current page until the area is full and the lines of the last block area contain at least n(orphans) and at least n(orphans) + n(widows) in total. This will only be relevant for areas at the start or end of a particular reference area. -
+
The spacing between the areas (including spacing in block areas inside an inline-container) will be set to the minimum values. This will allow the page to have at least all the information it needs to organise the page properly. -
This should handle the situation where there are keeps on some block areas that go over the end of the page better. It is possible that fitting the blocks on the page using a spacing between min and optimum @@ -131,71 +132,68 @@ next page and the spacing being between optimum and max. So if the objects are placed first at optimum then you will need to keep going to see if there is a lower keep further on that has a spacing that is closer to the optimum. -
The spacing and keep information is stored so that the area positions and sizes can be adjusted. -
The page is vertically justified so that it distributes the areas on the page for the best result when considering keeps and spacing. -
First the keeps are checked. The available space on the page may have changed due to the presence of before floats or footnotes. The page break will need to be at a height <= the available space on the page. -
A page break should be made at the first available position that has the lowest keep value when searching from the bottom. Once the first possible break is found then the next possible break, with equally low keep value, is considered. If the height of the page is closer to the optimal spacing then this break will be used instead. -
Keep values include implicit and explicit values when trying to split a block area into more than one area. Implicit keeps may be such things as widows/orphans. -
If the page contains before floats or footnotes then as each area or line -area is removed the float/footnote should also be removed. This will +area is removed the float/footnote should also be removed. This will change the available space and is a one way operation. The footnote -should be removed first as a footnote may be placed on the next page. +should be removed first as a footnote may be placed on the next page. The lowest keep value may need to be reassessed as each conditional area is removed. -
The before float and footnote regions are managed so that the separator regions will be present if it contains at least one area. -
Once the areas for the page are finalised then the spacing will need to be adjusted. The available height on the page is compared with the min and max spacing. All of the spacing in all the areas on the page is then adjusted by the appropriate percentage value. -
In the case of multi-column pages the column breaks and eventually the page break must be found in a slightly different way. -
The columns need to be layed out completely from first to last but this can only be done after a rough estimate of all the elements on the page in case of before floats or footnotes. -
So first the complete page is layed out with all columns filled with areas and the spacing at a minimum. Then if there are any before floats or footnotes then the availabe space is adjusted. @@ -203,181 +201,152 @@ Then each the best break is found for each column starting from the first column. If any before floats or footnotes are removed as a result of the new breaks and optimised spacing then all the columns should still be layed out for the same column height. -
After the region body has been finished the static areas can be layed out. The width of the static area is set and the height is inifinite, that is all block areas should be placed in the area and their visibility is controlled be other factors. -
The area tree for the region body will contain the information about markers that may be necessary for the retrieve marker. -
The ordering of the area tree must be adjusted so that the areas are before, start, body, end and after in that order. The body region should be in the order before float, main then footnote. -
Creating a line areas uses a similair concept. Each inline area is placed across the available space until there is no room left. The line is then split by considering all keeps and spacing. -
Each word (group of adjacent character inline areas) will have keeps based on hyphenation. The line break is at the lowest keep value starting from the end of the line. -
Once a line has been layed out for a particular width then that line is fixed for the page (except for unresolved page references). -
The before float region and footnote region are handled by the page layoutmanger. These regions will handle the addition and removal of the separator regions when before floats/footnotes area added and removed. -
If a float anchor is present in a particular line area then the available space for that line (and other in the block) will be reduced. The side float adds to the height of the block area and this height also depends on the clear value of subsequent blocks. The keep status of the block is also effected as there must be enough space on the page to fit the side float. -
+
Once the layout of the page is complete there may be unresolved areas. -
Page number citations and links may require following pages to be layed out before they can be resolved. These will remain in the area tree as unresolved areas. -
As each page is completed the list of unresolved id's will be checked and if the id can be resolved it will be. Once all id's are resolved then the page can be rendered. -
Each page contains a map of all unresolved id's and the corresponding areas. -
In the case of page number citations. The areas reserves the equivalent of 3 number nines in the current font. When the area is resolved then the area is adjusted to its proper size and the line area is re-aligned to accomodate the change. -
Any formatting object that has an ID or any inline link defines an area that will be required when rendering and resolving id references. -
This area is stored in the parent area and may be a shape that exists in more than one page, for example over a page break. This shape consists of the boundary of all inline (or block) areas that the shape is defined for. -
This is the definition of all inline areas that will exist in the area. -
instream-foreign-object, external-graphic, inline-container -
These areas have a fixed width and height. They also have a viewport. -
leader, inline space -
These areas have a fixed height but the width may vary. -
character -
This is an simple character that has fixed properties according to the current font. There are implicit keeps with adjacent characters. -
float anchor, footnote anchor -
This area has no size. It keeps the position for footnotes and floats and has a keep with the associated inline area. -
page-number-citation -
A page number area that needs resolving, behaves as a character and has the space of 3 normal characters reserved. The size will adjust when the value is resolved. -
The block area has info about the following:
Once the layout has been finalised then this information can be discarded. -
Contains inforamtion about all the block areas in the body, before area and footer area. -
Has a list of the unresolved page references and a list of id refences that can be used to obtain the area associated with that id. -
Here a few layout possibilities areas explored to determine how the layout process will handle these situations. -
All blocks (including nested) are placed on the page with minimum spacing and the last block has the minimum number of lines past the page end. The lowest keep value is then found within the body area limits. Then the next equally low keep is found to determine if the spacing will be closer to the optimum values. -
After filling the page with the block areas then the new body height is used to find the best position to break. Before each line area or block area is remove any associated before floats and footnotes are removed. @@ -445,11 +408,10 @@ for a different breaking point. Areas are removed towards the new breaking point until the areas fit on the page. When finding the optimum spacing the removal of before floats and footnotes must also be considered. -
First the page is filled with all columns for the intial page area. Then each column is adjusted for the new height starting from the first column. The best break for the column is found then the next @@ -457,18 +419,20 @@ column is considered, any left over areas a pre-pended to the next column. Once all the columns are finished then all the columns are adjusted to fit in the same height columns. This handles the situation where before floats or footnotes may have been removed. -
If in the process of adding areas to a page it is found that there are no more areas in the flow then this page will need to be changed to the last page (if applicable). The areas are then placed on a last page. -
FOP should be able to handle very large documents. A document can be supplied using SAX and the information should be passed entirely through the system, from fo elements to rendered output as soon as possible. -
A top level block area, immediately below the flow, can be added to the page layout as soon as the element is complete. -
The fo elements used to construct a page can be discarded as soon as the layout for the page is complete. Some information may be stored in the area tree of the page in order to handle unresolved page references and links. -
Once the layout of a page has been completed, all elements are fully resolved, then the page can be rendered. Some renderers may support out of order rendering of pages. -
The main problem that will remain is that any page with forward references will need to be stored until the refence is resolved. -This means that the information contained in the page should be +This means that the information contained in the page should be as minimal as possible. -
Line areas can be optimised once the layout for the line has been finalised. Consecutive characters with the same properties can be combined into a "word" to hold the information with limited overhead. -
If there are a large number of pages where forward references cannot be resolved the a method of writing a page onto disk could be used to save memory. The easiest way to achieve this is to make the page and all children serializable. -
The property datatypes are defined in the +org.apache.fop.datatypes package, except Number and String which are java +primitives. The FOP datatypes are:
+The org.apache.fop.fo.Property class is the superclass for all
+Property subclasses. There is a subclass for each kind of property
+datatype. These are named using the datatype name plus the word
+Property, resulting in NumberProperty, StringProperty, and so
+on. There is also a class EnumProperty which uses an int
+primitive to hold enumerated values. There is no corresponding Enum
+datatype class.
The Property class provides a "wrapper" around any possible +property value. Code manipulating property values (in layout for +example) usually knows what kind (or kinds) of datatypes are +acceptable for a given property and will use the appropriate accessor.
+The base Property class defines accessor methods for all FO property +datatypes, such as getNumber(), getColorType(), getSpace(), getEnum(), +etc. It doesn't define +accessors for SVG types, since these are handled separately (at least +for now.) In the base Property class, all of these methods return +null, except getEnum which returns 0. Individual subclasses return a value of the appropriate type, +such as Length or ColorType. A subclass may also choose to return a +reasonable value for other accessor types. For example, a +SpaceProperty will return the optimum value if asked for a Length.
+The Property class contains a nested class called +Maker. This is the base class for all other property Makers. It +provides basic framework functionality which is overridden by the +code generated by properties.xsl from the *properties.xml files. In +particular it provides basic expression evaluation, using +PropertyParser class in the org.apache.fop.fo.expr package.
+Other Property subclasses such as LengthProperty define their own +nested Maker classes (subclasses of Property.Maker). These handle +conversion from the Property subclass returned from expression +evaluation into the appropriate subclass for the property.
+For each generic or specific property definition in the +properties.xml files, a new subclass of one of the Maker classes is +created. Note that no new Property subclasses are created, only new +PropertyMaker subclasses. Once the property value has been parsed and +stored, it has no specific functionality. Only the Maker code is +specific. Maker subclasses define such aspects as keyword +substitutions, whether the property can be inherited or not, which +enumerated values are legal, default values, corresponding properties +and specific datatype conversions.
+In the properties xml files, one can define generic property +definitions which can serve as a basis for individual property +definitions. There are currently several generic properties defined in +foproperties.xml. An example is GenericColor, which defines basic properties +for all ColorType properties. Since the generic specification doesn't include +the inherited or default elements, these should be set in each property +which is based on GenericColor. Here is an example:
+
+
+ <property type='generic'>
+ <name>background-color</name>
+ <use-generic>GenericColor</use-generic>
+ <inherited>false</inherited>
+ <default>transparent</default>
+ </property>
+
A generic property specification can include all of the elements +defined for the property element in the DTD, including the description +of components for compound properties, and the specification of +keyword shorthands.
+ +Generic property specifications can be based on other generic +specifications. +An example is GenericCondPadding template which is based on the +GenericCondLength definition but which extends it by adding an inherited +element and a default value for the length component.
++Generic properties can specify enumerated values, as in the +GenericBorderStyle template. This means that the list of values, which +is used by 8 properties (the "absolute" and "writing-mode-relative" +variants for each BorderStyle property) is only specified one time.
++When a property includes a "use-generic" element and includes no other +elements (except the "name" element), then no class is generated for the +property. Instead the generated mapping will associate this +property directly with an instance of the generic Maker.
+
+A generic class may also be hand-coded, rather than generated from the
+properties file.
+Properties based on such a generic class are indicated by the
+attribute ispropclass='true'
on the
+use-generic element.
This is illustrated by the SVG properties, most of +which use one of the Property subclasses defined in the +org.apache.fop.svg +package. Although all of these properties are now declared in +svgproperties.xml, no specific classes are generated. Classes are only +generated for those SVG properties which are not based on generic +classes defined in svg.
+Properties may be defined for all flow objects or only for
+particular flow objects. A PropertyListBuilder object will always look
+first for a Property.Maker for the flow object before looking in the
+general list. These are specified in the
+element-property-list
section of the properties.xml
+files. The localname
element children of this element specify for
+which flow-object elements the property should be registered.
NOTE: All the properties for an object or set of objects +must be specified in a single element-property-list element. If the +same localname appears in several element lists, the later set of +properties will hide the earlier ones! Use the ref +functionality if the same property is to be used in different sets of +element-specific mappings. +
+A property element may have a type attribute with the value
+ ref
. The
+ content of the name child element is the name of the referenced
+ property (not its class-name!). This indicates that the property
+ specification has
+ already been given, either in this same specification file or in a
+ different one (indicated by the family
attribute). The
+ value of the family attribute is XX where the file
+ XXproperties.xml defines the referenced property. For
+ example, some SVG objects may have properties defined for FO. Rather
+ than defining them again with a new name, the SVG properties simply
+ reference the defined FO properties. The generating mapping for the
+ SVG properties will use the FO Maker classes.
Some properties have both absolute and +writing-mode-relative forms. In general, the absolute forms +are equivalent to CSS properties, and the writing-mode-relative forms +are based on DSSSL. FO files may use either or both forms. In +FOP code, a request for an absolute form will retrieve that value if it +was specified on the FO; otherwise the corresponding relative property +will be used if it was specified. However, a request for a relative +form will only use the specified relative value if the corresponding +absolute value was not specified for that FO. +
+Corresponding properties are specified in the properties.xml files
+using the element corresponding
, which has at least one
+propval
child and may have a propexpr
child,
+if the corresponding
+value is calculated based on several other properties, as for
+start-indent
.
+
NOTE: most current FOP code accesses the absolute variants +of these properties, notably for padding, border, height and width +attributes. However it does use start-indent and end-indent, rather +than the "absolute" margin properties. +
+The XSL script propmap.xsl
is used to generate
+property mappings based on
+both foproperties.xml and svgproperties.xml. The mapping classes
+in the main fop packages simply load these automatically generated
+mappings. The mapping code still uses the static
+"maker" function of the generated object to obtain a Maker
+object. However, for all generated classes, this method returns an
+instance of the class itself (which is a subclass of Property.Maker)
+and not an instance of a separate nested Maker class.
For most SVG properties which use the SVG Property classes directly, +the generated mapper code calls the "maker" method of the SVG Property +class, which returns an instance of its nested Maker class.
+The property generation also handles element-specific property +mappings as specified in the properties XML files.
+For any property whose datatype is Enum
or which
+contains possible enumerated values, FOP code may need to access
+enumeration constants. These are defined in the interfaces whose name
+is the same as the generated class name for the property,
+for example BorderBeforeStyle.NONE
. These interface classes
+are generated by the XSL script enumgen.xsl
. A separate
+interface defining the enumeration constants is always generated for
+every property which uses the constants, even if the constants
+themselves are defined in a generic class, as in BorderStyle.
If a subproperty or component of a compound property has enumerated
+values, the constants are defined in a nested interface whose name is
+the name of the subproperty (using appropriate capitalization
+rules). For example,
+the keep properties may have values of AUTO or FORCE or an integer
+value. These are defined for each kind of keep property. For example,
+the keep-together property is a compound property with the components
+within-line, within-column and within-page. Since each component may
+have the values AUTO or FORCE, the KeepTogether interface defines
+three nested interfaces, one for each component, and each defines
+these two constants. An example of a reference in code to the constant
+is KeepTogether.WithinPage.AUTO
.
Some XSL FO properties are specified by compound datatypes. In the FO file,
+these are defined by a group of attributes, each having a name of the
+form property.component
, for example
+space-before.minimum
. These are several compound
+datatypes:
These are described in the properties.xml files using the element
+compound
which has subproperty
children. A subproperty element is much
+like a property element, although it may not have an inherited
child
+element, as only a complete property object may be inherited.
+
Specific datatype classes exist for each compound property. Each
+component of a compound datatype is itself stored as a Property
+object. Individual components may be accessed either by directly
+performing a get operation on the name, using the "dot" notation,
+eg. get("space-before.optimum")
; or by using an accessor on the compound
+property, eg. get("space-before").getOptimum()
.
+In either case,
+the result is a Property object, and the actual value may be accessed
+(in this example) by using the "getLength()" accessor.
+
+A render is primarily design to convert a given area tree into the output +document format. It should be able to produce pages and fill the pages +with the text and graphical content. Usually the output is sent to +an output stream. +
++Some output formats may support extra information that is not available +from the area tree or depends on the destination of the document. +
++Currently some of FOP is being re-written so that the layout can be handled +properly without the problems that have been encountered and to make +it possible to handle keeps/breaks and spacing better. +
++ +
++Technically the user agent is FOP in the role of determining the +output format and when resolving various attributes. The user +agent is represented by a class that is available to others to +specify how FOP should behave. +
+The user agent is used by the formatting process to determine certain user definable values. -
It will enable the customisation of values for generating and rendering the document. -
The user agent must be available to the layout processor and the renderer. Users can supply their own user agent or use the default one for a particular renderer. -
The user agent needs to be made available to the property resolution layout process and the renderer. -
Standard Features:
Interactive Features: