blob: 1d4f72d044ec3ab8c53c5812cb0ba727a7a72ef8 [file] [log] [blame]
<?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$ -->
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.3//EN" "http://forrest.apache.org/dtd/document-v13.dtd">
<document>
<header>
<title>Apache™ FOP Design: SVG</title>
<version>$Revision$</version>
</header>
<body>
<section id="intro">
<title>Introduction</title>
<p>SVG is rendered through Apache™ Batik.</p><p>The XML from the XSL:FO document
is converted into an SVG DOM with batik. This DOM is then set as the Document
on the Foreign Object area in the Area Tree.</p><p>This DOM is then available to
be rendered by the renderer.</p><p>SVG is rendered in the renderers via an
XMLHandler in the FOUserAgent. This XML handler is used to render the SVG. The
SVG is rendered by using batik. Batik converts the SVG DOM into an internal
structure that can be drawn into a Graphics2D. So for PDF we use a
PDFGraphics2D to draw into.</p><p>This creates the necessary PDF information to
create the SVG image in the PDF document.</p><p>Most of the work is done in the
PDFGraphics2D class. There are also a few bridges that are plugged into batik
to provide different behaviour for some SVG elements.</p>
</section>
<section>
<title>Text Drawing</title>
<p>Normally batik converts text into a set of curved
shapes. </p><p>This is handled as any other shapes when rendering to the output. This
is not always desirable as the shapes have very fine curves. This can cause the
output to look a bit bad in PDF and PS (it can be drawn properly but is not by
default). These curves also require much more data than the original
text.</p><p>To handle this there is a PDFTextElementBridge that is set when
using the bridge in batik. If the text is simple enough for the text to be
drawn in the PDF as with all other text then this sets the TextPainter to use
the PDFTextPainter. This inserts the text directly into the PDF using the drawString method on the PDFGraphics2D.</p><p>Text is considered simple if the
font is available, the font size is useable and there are no tspans or other
complications. This can make the resulting PDF significantly
smaller.</p>
</section>
<section>
<title>PDF Links</title>
<p>To support links in PDF another batik
element bridge is used. The PDFAElementBridge creates a PDFANode which inserts
a link into the PDF document via the PDFGraphics2D.</p><p>Since links are positioned on the page without any transforms then we need to transform the
coordinates of the link area so that they match the current position of the a
element area. This transform may also need to account for the svg being
positioned on the page.</p>
</section>
<section>
<title>Images</title>
<p>Images are normally drawn
into the PDFGraphics2D. This then creates a bitmap of the image data that can
be inserted into the PDF document. </p><p>As PDF can support jpeg images then another
element bridge is used so that the jpeg can be directly inserted into the PDF.</p>
</section>
<section>
<title>PDF Transcoder</title>
<p>Batik provides a mechanism to
convert SVG into various formats. Through FOP we can convert an SVG document
into a single paged PDF document. The page contains the SVG drawn as best as
possible on the page. There is a PDFDocumentGraphics2D that creates a
standalone PDF document with a single page. This is then drawn into by batik in
the same way as with the PDFGraphics2D.</p>
</section>
<section>
<title>Other Outputs</title>
<p>When rendering to AWT the SVG is simply drawn onto the
awt canvas using batik.</p><p>The PS Renderer uses a similar technique as the
PDF Renderer.</p><p>The SVG Renderer simply embeds the SVG inside an svg
element.</p>
</section>
</body>
</document>