<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- $Id: extending.xml 1298724 2012-03-09 07:55:31Z cbowditch $ -->
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.3//EN" "http://forrest.apache.org/dtd/document-v13.dtd">

<document>
  <header>
    <title>Apache™ FOP Design: Extensions</title>
    <version>$Revision: 1298724 $</version>
    <authors>
      <person name="Keiron Liddle" email="keiron@aftexsw.com"/>
    </authors>
  </header>

    <body>
<section id="intro">
  <title>Introduction</title>
<p>
Apache™ FOP provides an extension mechanism to add extra functionality. There
are a number of different types of extensions that apply to different
steps when converting FO into the rendered output.
  </p>
  </section>
<section>
  <title>Extensions</title>
  <p>
SVG Graphic - This applies to svg and any other xml document that
can be converted into svg in the output. All that is required is
the element mapping for the xml and a converter that changes the
document into svg. This conversion is done in the FO Tree. The
conversion is done by the top level element of the namespace
or in the case of an external image a Converter.
  </p>
  <p>
XML Document - Instead of converting the document into svg it
can be passed directly to the renderer. The renderer will need
to have a handler for the xml document. This handler can add
information directly to the output document.
  </p>
  <p>
Output Document - This is used to add document level information
to the output result. Such an extension will set information that
is passed to the output document. The area tree handles these
extensions and passs along the information to the renderer.
The extension may contain resolveable objects. The extension
can be passed to the renderer once resolve either immediately,
after the next page or at the end of the document. This is so that
the extension can be handled according to other associated data.
  </p>
  <p>
FO Area - This is where an extension creates an normal or extended
area in the Area Tree. This is useful when the normal FO objects
cannot create the area in the way that is needed.
  </p>
  <p>
Resolveable - In some cases it may require information to be
resolved for information such as page numbers. This can apply
to the XML Document, FO Area or output document extensions.
   </p>
  <ul>
<li>Add a string ['(Continued)'] to a table header if the table spans
multiple pages. These tables are part of the content and can start
anywhere in the page.</li>
  <li>Separate page number display for a subsection. ie. - master document
is page 4 of 7, but subsection is page 2 of 3.</li>
   </ul>
</section>
<section>
  <title>Examples</title>
  <p>
Plan - The plan extension is a simple SVG graphic extension.
Given a plan document either inside an InstreamForeignObject
or as an external graphic, it converts the plan document into
an svg graphic. The svg graphic is then passed through the
Area Tree to the Renderer. The Renderer then renders the svg
graphic as normal.
   </p>
  <p>
PDF Outline - This is output document extension. If rendering to
pdf and this extensionis used then the bookmark information is
passed to the pdf document. This information is then set on the
document.
   </p>
  <p>
PDF Additions - This can be done with an XML Document extension.
A simple xml document is defined that provides the appropriate
information. When the document is rendered a handler converts the
document into PDF markup.
   </p>
  <p>
For example:</p>
<source><![CDATA[<my:script-link script="app.execMenuItem('AcroSrch:Query');">
Search
</my:script-link>]]></source>
<p>
to result in a text box referencing the following PDF action:</p>
<source><![CDATA[<<
/S /JavaScript
/JS (app.execMenuItem("AcroSrch:Query");)
>>]]></source>

</section>
    <section id="status">
      <title>Status</title>
      <section id="status-todo">
        <title>To Do</title>
      </section>
      <section id="status-wip">
        <title>Work In Progress</title>
        <ul>
          <li>mathml extension</li>
          <li>another xml -&gt; svg extension</li>
          <li>svg text normal text if that can be handled otherwise stroked this is done automatically</li>
        </ul>
      </section>
      <section id="status-complete">
        <title>Completed</title>
        <ul>
          <li>svg now in an xml handler, FOP can be used without batik</li>
          <li>bookmark extension improved a bit - changed bookmark extension, now requires a wrapping element bookmark</li>
        </ul>
      </section>
    </section>
    </body>
</document>