SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Downloaden Sie, um offline zu lesen
Professional reports
with SVG
Stefan Neufeind
SpeedPartner GmbH
2
About me
 Stefan Neufeind
 From Neuss (near Düsseldorf, Germany)
 Working for SpeedPartner GmbH
(consulting, development, administration)
 PEAR-developer
 Loves PHP / FOSS :-)
3
Agenda
 About SVG
 Support for SVG
 SVG and PHP
 PEAR::XML_SVG
 PEAR::Image_Canvas
 Reporting with PEAR::Image_Graph
 SVG ready for use?
 Links
4
About SVG
 Standard defined by W3C
 XML = eXtensible Markup Language
 For 2D vector-graphics
 Static and animated
 DOM (Document Object Model)
 Modifyable with ECMAScript, SMIL
 Event-handlers, ...
 Editable using a simple text-editor
5
About SVG
Types of objects:
 Vector shapes
 Lines, curves, ...
 Raster images
 e.g. PNG used in SVG-document
 Text
 Searchable, accessible, ...
6
About SVG
Features:
 Grouping, styling
 Transformations
 Clipping paths
 Alpha masks
 Filter effects
 Template objects
 Extensibility
7
About SVG
Profiles:
 SVG Tiny (SVGT)
 For restricted devices like cellphones
 SVG Basic (SVGB)
 For advances devices like PDAs
 Full SVG
8
About SVG
Namespaces:
 XML-namespace for SVG
 Usable together with other namespaces
 Allows mixing of XHTML, SVG, MathML,
XUL/XBL, ... in one document
9
About SVG
Timeline:
 SVG 1.0:
W3C Recommendation on 2001-09-04
 SVG 1.1:
W3C Recommendation on 2003-01-14
 SVG 1.1 Tiny / Basic:
W3C Recommendation on 2003-01-14
 SVG 1.2 Mobile (Tiny) / SVG 1.2 Full:
Still drafts
10
About SVG
Outlook to SVG 1.2:
 Flowing text and graphics
 Xforms
 Multiple pages
 Painting/Multimedia enhancements
11
About SVG
Competition to SVG:
 Flash (binary format)
 Not open (Format spec available for export)
 Large market share
 Poor accessibility
 VML (text format)
 Open, but Internet Explorer only
 XAML (text source compiled to binary)
 Published, but possibly not open
12
Support for SVG
 Content negotiation via HTTP
 Deliver SVG or convert on server
 Rasterization on server (for older browser)
 ImageMagick (quick but incomplete)
 Batik (complete but slow [Java])
 Standalone viewer / browser-plugin
13
Support for SVG
Standalone viewers / browser-plugins:
 Adobe SVG Viewer
 Free, MacOS/Windows Linux/Solaris
 Corel SVG viewer
 Free, Windows, no longer supported
 Apache Squiggle (part of Batik toolkit)
 Free, Java → Slow
 ...
14
Support for SVG
Native support:
 Opera browser
 SVG 1.1 Tiny since 8.0 beta 3
 Mozilla
 Firefox since 1.5 beta 1 (not on Linux yet)
 Mozilla SeaMonkey suite
 KDE
 Plugin for Konqueror (KSVG)
 Since 3.4 support for SVG wallpapers :-)
15
Support for SVG
Native support (continued):
 Apple Safari
 Porting of KSVG2 into WebCore in progress
 Amaya (W3C webbrowser/editor)
 Partial SVG support
 Apache Batik SVG toolkit
 For Java programs
16
Support for SVG
Mozilla support:
 included in latest builds
 native SVG-support:
 handles compound documents mixed of SVG,
MathML, XHTML, XUL (through namespaces)
 supports SVG dom
 allows using SVG in XBL (XUL binding
language) etc.
17
Support for SVG
Mozilla support (continued):
 currently supports basic shapes:
 beziers
 stroking and filling with opacity
 gradients
 scripting
 events
 most of the DOM
18
Support for SVG
Mozilla support (continued):
 target:
 full SVG 1.1 support
 specification-conform
 big areas lacking features:
 filters
 svg defined fonts
 declarative animations
19
SVG and PHP
PEAR-packages:
 XML_image2svg
 Converts JPEG, GIF of PNG to base64-
representation inside SVG-container
 Not really helpful?
 Old, seems unmaintained
 XML_svg2image
 Converts svg to JPEG or PNG
 Requires apache-batik via php-ext/java
20
SVG and PHP
PEAR-packages (continued):
 XML_SVG
 Object-oriented API to build SVG documents
 Based on SVG-library from Horde
 Low level abstraction “wrapper“ for SVG
 Image_Canvas
 High level of abstraction
 Interface to GD, SVG, PDF, ImageMap
(planned: Flash using MING / libSWF,
PDF using File_PDF / cPdfWriter, ...)
21
SVG and PHP
PEAR::XML_SVG – source:
<?php
require_once('XML/SVG.php');
$svg = &new XML_SVG_Document(
array('width' => 400, 'height' => 200));
$g = &new XML_SVG_Group(
array('style' => 'stroke:black',
'transform' => 'translate(200 100)'));
$g->addParent($svg);
// or: $svg->addChild($g);
22
SVG and PHP
PEAR::XML_SVG – source (continued):
$circle = &new XML_SVG_Circle(
array('cx' => 0, 'cy' => 0, 'r' => 100,
'style' => 'stroke-width:3'));
$circle->addChild(new XML_SVG_Animate(
array('attributeName' => 'r',
'attributeType' => 'XML',
'from' => 0, 'to' => 90,
'dur' => '3s', 'fill'=> 'freeze')));
23
SVG and PHP
PEAR::XML_SVG – source (continued):
$circle->addChild(new XML_SVG_Animate(
array('attributeName' => 'fill',
'attributeType' => 'CSS',
'from' => 'yellow', 'to' => 'red',
'dur' => '3s', 'fill'=> 'freeze')));
$g->addChild($circle);
$text = &new XML_SVG_Text(array(
'text' => 'SVG chart!', 'x' => 0,'y' => 0,
'style'=> 'font-size:20;
text-anchor:middle;'));
24
SVG and PHP
PEAR::XML_SVG – source (continued):
$text->addChild(new XML_SVG_Animate(
array('attributeName' => 'font-size',
'attributeType' => 'auto',
'from' => 50, 'to' => 30,
'dur' => '3s', 'fill'=> 'freeze')));
$g->addChild($text);
$svg->printElement();
?>
25
SVG and PHP
PEAR::XML_SVG – SVG:
<g style="stroke:black" transform="translate(200
100)">
<circle cx="0" cy="0" r="100"
style="stroke-width:3">
<animate attributeName="r"
attributeType="XML"
from="0" to="90" dur="3s" fill="freeze" />
<animate attributeName="fill"
attributeType="CSS" from="yellow" to="red"
dur="3s" fill="freeze" />
</circle>
26
SVG and PHP
PEAR::XML_SVG – SVG (continued):
<text x="0" y="0" style="font-size:20;
text-anchor:middle;">SVG chart!
<animate attributeName="font-size"
attributeType="auto" from="50" to="30"
dur="3s" fill="freeze" />
</text>
</g>
27
SVG and PHP
PEAR::XML_SVG – animated image:
transition
28
SVG and PHP
PEAR::Image_Canvas – source:
<?php
include_once 'Image/Canvas.php';
$Canvas =& Image_Canvas::factory('svg',
array('width' => 400, 'height' => 300));
$Canvas->setLineColor('black');
$Canvas->rectangle(array('x0' => 0,
'y0' => 0, 'x1' => 399, 'y1' => 299));
29
SVG and PHP
PEAR::Image_Canvas – source (continued):
$Canvas->setGradientFill(
array('direction' => 'horizontal',
'start' => 'red', 'end' => 'blue'));
$Canvas->setLineColor('black');
$Canvas->ellipse(array('x' => 199,
'y' => 149, 'rx' => 50, 'ry' => 50));
$Canvas->setFont(array('name' => 'Arial',
'size' => 12));
$Canvas->addText(array('x' => 0, 'y' => 0,
'text' => 'Demonstration of what
Image_Canvas do!'));
30
SVG and PHP
PEAR::Image_Canvas – source (continued):
// ... some more text-generation skipped ...
$Canvas->addVertex(
array('x' => 50, 'y' => 200));
$Canvas->addVertex(
array('x' => 100, 'y' => 200));
$Canvas->addVertex(
array('x' => 100, 'y' => 250));
$Canvas->setFillColor('red@0.2');
$Canvas->polygon(array('connect' => true));
31
SVG and PHP
PEAR::Image_Canvas – source (continued):
$Canvas->image(array('x' => 398, 'y' => 298,
'filename' => './pear-icon.png',
'alignment' => array(
'horizontal' => 'right',
'vertical' => 'bottom')));
$Canvas->show();
?>
32
SVG and PHP
PEAR::Image_Canvas – SVG:
<defs>
<linearGradient id="gradient_1" x1="0%"
y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-
color:rgb(255,0,0);"/>
<stop offset="100%" style="stop-
color:rgb(0,0,255);"/>
</linearGradient>
</defs>
<rect x="0" y="0" width="399" height="299"
style="stroke-width:1;stroke:rgb(0,0,0);
fill:none;"/>
33
SVG and PHP
PEAR::Image_Canvas – SVG (continued):
<ellipse cx="199" cy="149" rx="50" ry="50"
style="stroke-width:1;stroke:rgb(0,0,0);
fill:url(#gradient_1);"/>
<text x="0" y="12" style="font-
family:Arial;font-
size:12px;fill=rgb(0,0,0);">Demonstration of
what Image_Canvas do!</text>
...
<image xlink:href="data:image/png;base64,
iVBORw0..." x="398" y="298" width="32"
height="32" preserveAspectRatio="none"/>
34
SVG and PHP
PEAR::Image_Canvas – image:
35
PEAR::Image_Graph
 Drawing graphs in various ways
 Object-oriented, flexible, extendable
 Since v0.5. uses PEAR::Image_Canvas
as „driver model“ for output
 GD (PNG, JPEG, GIF, WBMP)
 Scalable Vector Graphics (SVG)
 PDF (using PDFLib)
 Optional: Data-preprocessors packages
 'Numbers_Words' and 'Numbers_Roman'
36
PEAR::Image_Graph
 Use factory-methods
 Not required – but allows “lazy includes“
require_once 'Image/Graph.php';
require_once 'Image/Canvas.php';
$Canvas =& Image_Canvas::factory('svg',
array('width' => 600, 'height' => 400));
$Graph =& Image_Graph::factory('graph', $Canvas);
// instead of
$Graph =& new Image_Graph($Canvas);
// ...
37
PEAR::Image_Graph
 Mind the ampersand (call by reference)
 Otherwise problems with modifying objects
// ...
$Plot =& $Graph->addNew
('line', &$Dataset);
// without ampersand the following
// would be impossible
$Plot->setLineColor('red');
// ...
38
PEAR::Image_Graph
 Adding elements to parents
// ...
$newElement =& Image_Graph::factory(
'some_element',
array($param1, $param2, &$param3)
);
$parentElement->add($newElement);
// better instead do:
$parentElement->addNew('some_element',
array($param1, $param2, &$param3));
// ...
39
PEAR::Image_Graph
Components of a graph:
 graph
 plotarea (to create the plots on)
 plot
 dataset (data to plot)
 additional elements (e.g. legend)
40
PEAR::Image_Graph
Simple example:
41
PEAR::Image_Graph
Simple example:
require_once 'Image/Graph.php';
require_once 'Image/Canvas.php';
$Canvas =& Image_Canvas::factory('svg',
array('width' => 600, 'height' => 400));
$Graph =& Image_Graph::factory('graph', $Canvas);
$Plotarea =& $Graph->addNew('plotarea');
$Dataset =& Image_Graph::factory('dataset');
$Dataset->addPoint('Denmark', 10);
$Dataset->addPoint('Norway', 3);
$Dataset->addPoint('Sweden', 8);
$Dataset->addPoint('Finland', 5);
$Plot =& $Plotarea->addNew('bar',&$Dataset);
$Graph->done();
42
PEAR::Image_Graph
Plotarea:
 Holds axis-layout
 Container for plots
 Standard-behaviour:
 X-axis textual ('Denmark','Sweden', ...)
 Y-axis linear
 Types:
 'axis' (linear), 'axis_log' (logarithmic),
 'Image_Graph_Axis_Category' (textual)
43
PEAR::Image_Graph
Graph types:
 'line', 'area', 'bar', 'smooth_line',
'smooth_area', 'pie', 'step', 'impulse', 'dot'
or 'scatter', 'radar',
Image_Graph_Plot_CandleStick,
Image_Graph_Plot_Band
Special modes:
 'normal', 'stacked', 'stacked100pct'
44
1. Adding a plotarea:
2. Adding a bar-plot:
PEAR::Image_Graph
$Plotarea =& $Graph->addNew('plotarea',
array('axis', 'axis_log'));
// ...
$Plot =& $Plotarea->addNew('bar', $Dataset);
// ...
45
Plottype-examples:
PEAR::Image_Graph
46
Data for plots:
 Directly giving points
 Function callback
PEAR::Image_Graph
$Dataset =& Image_Graph::factory('dataset');
$Dataset->addPoint('Denmark', 10);
$Dataset->addPoint('Norway', 3);
function foo($bar) {
return 2 * $bar + 10;
}
// 100 values between -3 and 10
$Dataset =& Image_Graph::factory
('function', array(-3, 10, 'foo', 100));
47
Using colors:
 Color names (e.g. 'green') or RGB
('#00ff00', '75%,20%,19%', array(0, 255, 0)
 Optionally opacity ('red@0.2',
'#00ff00@0.9', array(0, 255, 0, 0.2))
PEAR::Image_Graph
$element->setLineColor('red');
$element->setFillColor('#0000ff@0.1');
$element->setBackgroundColor('green@0.1');
$element->setBorderColor(array(0, 0, 0));
48
Fillstyles:
 Simple fill
 Gradient fill
 Vertical, horizontal, diagonally, radial
 Image
PEAR::Image_Graph
$fill =& Image_Graph::factory('gradient',
array(IMAGE_GRAPH_VERTICAL, 'white','red'));
$element->setFillStyle($fill);
$fill =& Image_Graph::factory(
'Image_Graph_Fill_Image', './image.png');
$element->setFillStyle($fill);
49
Layouts:
 Horizontal, vertical, ...
PEAR::Image_Graph
// split 40% from left; A and B are plotareas
$Graph->add(Image_Graph::horizontal(
$A,
$B,
40) );
// directly create plotareas as well
$Graph->add(Image_Graph::vertical(
$part1 = Image_Graph::factory('plotarea'),
$part3 = Image_Graph::factory('plotarea'),
40 ) );
50
Layouts:
 ... and matrix
PEAR::Image_Graph
$Matrix =& $Graph->addNew
('Image_Graph_Layout_Matrix', array(2, 2));
$part1 =& $Matrix->getEntry(0, 0);
$part2 =& $Matrix->getEntry(0, 1);
$part3 =& $Matrix->getEntry(1, 0);
$part4 =& $Matrix->getEntry(1, 1);
51
More complex example:
 TrueType-font, title, plotarea, legend
 Vertical layout
 Gradient fill
 Two y-axes
 Axes-titles
PEAR::Image_Graph
52
More complex example (continued):
PEAR::Image_Graph
require_once 'Image/Graph.php';
require_once 'Image/Canvas.php';
$Canvas =& Image_Canvas::factory('svg',
array('width' => 600, 'height' => 400));
$Graph =& Image_Graph::factory('graph', $Canvas);
$Font =& $Graph->addNew('ttf_font', 'Gothic');
$Font->setSize(8);
$Graph->setFont($Font);
53
More complex example (continued):
PEAR::Image_Graph
$Graph->add(Image_Graph::vertical(
Image_Graph::factory('title',
array('Primary & Secondary Axis', 11)),
Image_Graph::vertical(
$Plotarea = Image_Graph::factory('plotarea'),
$Legend =Image_Graph::factory('legend'),90),5));
$Legend->setPlotarea($Plotarea);
$GridY2 =& $Plotarea->addNew('bar_grid',
IMAGE_GRAPH_AXIS_Y_SECONDARY);
$GridY2->setFillStyle(Image_Graph::factory(
'gradient', array(IMAGE_GRAPH_GRAD_VERTICAL,
'white', 'lightgrey') ) );
54
More complex example (continued):
PEAR::Image_Graph
$Dataset1 =& Image_Graph::factory('random',
array(8, 10, 100, true));
$Plot1 =& $Plotarea->addNew('line', &$Dataset1);
$Plot1->setLineColor('red');
$Dataset2 =& Image_Graph::factory('random',
array(8, 1, 10, true));
$Plot2 =& $Plotarea->addNew
('Image_Graph_Plot_Area', $Dataset2,
IMAGE_GRAPH_AXIS_Y_SECONDARY);
$Plot2->setLineColor('gray');
$Plot2->setFillColor('blue@0.2');
$Plot1->setTitle('Primary Axis');
$Plot2->setTitle('Secondary Axis');
55
More complex example (continued):
PEAR::Image_Graph
$AxisX =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X);
$AxisX->setTitle('Oranges');
$AxisY =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
$AxisY->setTitle('Apples', 'vertical');
$AxisYsecondary =& $Plotarea->getAxis(
IMAGE_GRAPH_AXIS_Y_SECONDARY);
$AxisYsecondary->setTitle('Pears', 'vertical2');
// output the Graph
$Graph->done();
56
Data preprocessors:
 Adjustment / translation of data (e.g. Axis labels)
PEAR::Image_Graph
$AxisX =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X);
$AxisX->setDataPreprocessor(Image_Graph::factory
('Image_Graph_DataPreprocessor_Array',
array(array(1 => '30 Jul',
2 => '31 Jul',
3 => '1 Aug',
4 => '2 Aug'))));
$AxisY =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
$AxisY->setDataPreprocessor(Image_Graph::factory
('Image_Graph_DataPreprocessor_Formatted',
'+ %0.1f%%'));
57
Another impression:
PEAR::Image_Graph
58
 Flexible graph-creation
 Multiple outputs, including SVG
However please note:
 Image_Graph still a moving target
 SVG-support might still need work
 Looking forward to your feedback!
PEAR::Image_Graph
59
Yes ...
 Future for small, but high quality image
 Zoomable, accessible, ...
 Text-based transformations of data
 Tools in place for using SVG (editors, ...)
 Ready for use in clear enviroments
(browser / plugins installed)
 Migration possible
(server-based rasterisation, ...)
SVG ready for use?
60
But ...
 Advanced features still not
 supported everywhere
 giving same result everywhere
 Some “mainstream” tools lacking support
 especially OpenOffice.org
(but under discussion)
SVG ready for use?
61
Your impression?
SVG ready for use?
62
Links
 W3C Spec:
http://www.w3.org/TR/SVG11/
 W3C about accessiblity:
http://www.w3.org/TR/SVG11/access.html
 Viewers:
http://www.w3.org/Graphics/SVG/SVG-Implementations
 Adobe Indepth FAQ:
http://www.adobe.com/svg/indepth/faq.html
 SVG Foundation:
http://www.svgfoundation.org/
 http://www.zvon.org/xxl/svgReference/Output/index.html
http://www.zvon.org/xxl/SVGReferenceSVG/Output/intro.svg
63
Links
 Adobe SVG Viewer (Windows, MacOS, Linux, Solaris)
http://www.adobe.com/svg/viewer/install/
 Corel SVG viewer (Windows)
No longer supported!
http://www.corel.com/servlet/Satellite?pagename=Corel/Downloads/Details&id=1047022177437
 Apache Squiggle (part of Batik toolkit)
http://xml.apache.org/batik/svgviewer.html
Java Webstart for Batik-demo:
http://nagoya.apache.org/batik_1.1/batikNagoya.jnlp
 Mozilla SVG
http://www.mozilla.org/projects/svg/
 Amaya (W3C's editor/browser)
http://www.w3.org/Amaya/
64
Links
 Free editors:
 Skencil (Linux)
http://www.nongnu.org/skencil/
 Inkscape (Windows, MacOS, Linux)
http://www.inkscape.org/
 Content:
 Samples:
http://www.croczilla.com/svg/samples/
 Cliparts:
http://www.openclipart.org/
65
Links
 PHP:
 PEAR-packages
http://pear.php.net/
Image_GIS, Image_Graph,
XML_SVG, Image_Canvas,
XML_image2svg, XML_svg2image
 Lots of Image_Graph examples (visual and code):
http://pear.veggerby.dk
 SVG class from PHP Classes
http://www.phpclasses.org/browse/package/457.html
66
Thank you!
Up-to-date slides available at:
http://talks.speedpartner.de/
Questions?
neufeind (at) speedpartner.de

Weitere ähnliche Inhalte

Was ist angesagt?

SVG - Scalable Vector Graphic
SVG - Scalable Vector GraphicSVG - Scalable Vector Graphic
SVG - Scalable Vector GraphicAkila Iroshan
 
CSS3: Ripe and Ready to Respond
CSS3: Ripe and Ready to RespondCSS3: Ripe and Ready to Respond
CSS3: Ripe and Ready to RespondDenise Jacobs
 
Dive into HTML5: SVG and Canvas
Dive into HTML5: SVG and CanvasDive into HTML5: SVG and Canvas
Dive into HTML5: SVG and CanvasDoris Chen
 
An in-depth look at jQuery
An in-depth look at jQueryAn in-depth look at jQuery
An in-depth look at jQueryPaul Bakaus
 
From Shabby to Chic
From Shabby to ChicFrom Shabby to Chic
From Shabby to ChicRichard Bair
 
Bootstrap 3 training
Bootstrap 3 trainingBootstrap 3 training
Bootstrap 3 trainingVison Sunon
 
Introdução a CSS
Introdução a CSS Introdução a CSS
Introdução a CSS Tiago Santos
 
CSS3 - is everything we used to do wrong?
CSS3 - is everything we used to do wrong? CSS3 - is everything we used to do wrong?
CSS3 - is everything we used to do wrong? Russ Weakley
 

Was ist angesagt? (8)

SVG - Scalable Vector Graphic
SVG - Scalable Vector GraphicSVG - Scalable Vector Graphic
SVG - Scalable Vector Graphic
 
CSS3: Ripe and Ready to Respond
CSS3: Ripe and Ready to RespondCSS3: Ripe and Ready to Respond
CSS3: Ripe and Ready to Respond
 
Dive into HTML5: SVG and Canvas
Dive into HTML5: SVG and CanvasDive into HTML5: SVG and Canvas
Dive into HTML5: SVG and Canvas
 
An in-depth look at jQuery
An in-depth look at jQueryAn in-depth look at jQuery
An in-depth look at jQuery
 
From Shabby to Chic
From Shabby to ChicFrom Shabby to Chic
From Shabby to Chic
 
Bootstrap 3 training
Bootstrap 3 trainingBootstrap 3 training
Bootstrap 3 training
 
Introdução a CSS
Introdução a CSS Introdução a CSS
Introdução a CSS
 
CSS3 - is everything we used to do wrong?
CSS3 - is everything we used to do wrong? CSS3 - is everything we used to do wrong?
CSS3 - is everything we used to do wrong?
 

Ähnlich wie Professional reports with SVG and PHP

Vector Graphics on the Web: SVG, Canvas, CSS3
Vector Graphics on the Web: SVG, Canvas, CSS3Vector Graphics on the Web: SVG, Canvas, CSS3
Vector Graphics on the Web: SVG, Canvas, CSS3Pascal Rettig
 
I Can't Believe It's Not Flash
I Can't Believe It's Not FlashI Can't Believe It's Not Flash
I Can't Believe It's Not FlashThomas Fuchs
 
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...Guillaume Kossi
 
SVG vs Canvas - Showdown of the Painters
SVG vs Canvas - Showdown of the PaintersSVG vs Canvas - Showdown of the Painters
SVG vs Canvas - Showdown of the PaintersPhil Reither
 
JavaONE 2012 Using Java with HTML5 and CSS3
JavaONE 2012 Using Java with HTML5 and CSS3JavaONE 2012 Using Java with HTML5 and CSS3
JavaONE 2012 Using Java with HTML5 and CSS3Helder da Rocha
 
Thats Not Flash?
Thats Not Flash?Thats Not Flash?
Thats Not Flash?Mike Wilcox
 
How to build a html5 websites.v1
How to build a html5 websites.v1How to build a html5 websites.v1
How to build a html5 websites.v1Bitla Software
 
SVCC 2013 D3.js Presentation (10/05/2013)
SVCC 2013 D3.js Presentation (10/05/2013)SVCC 2013 D3.js Presentation (10/05/2013)
SVCC 2013 D3.js Presentation (10/05/2013)Oswald Campesato
 
MOConf'13: WebNotBombs: Optimize this
MOConf'13: WebNotBombs: Optimize thisMOConf'13: WebNotBombs: Optimize this
MOConf'13: WebNotBombs: Optimize thisBoris Zapolsky
 
Google I/O 2013 - Android Graphics Performance
Google I/O 2013 - Android Graphics PerformanceGoogle I/O 2013 - Android Graphics Performance
Google I/O 2013 - Android Graphics PerformanceDouO
 
Google I/O 2013 - Android Graphics Performance
Google I/O 2013 - Android Graphics PerformanceGoogle I/O 2013 - Android Graphics Performance
Google I/O 2013 - Android Graphics PerformanceDouO
 

Ähnlich wie Professional reports with SVG and PHP (20)

HTML5 - A Whirlwind tour
HTML5 - A Whirlwind tourHTML5 - A Whirlwind tour
HTML5 - A Whirlwind tour
 
Svghtml5 Meetup
Svghtml5 MeetupSvghtml5 Meetup
Svghtml5 Meetup
 
Vector Graphics on the Web: SVG, Canvas, CSS3
Vector Graphics on the Web: SVG, Canvas, CSS3Vector Graphics on the Web: SVG, Canvas, CSS3
Vector Graphics on the Web: SVG, Canvas, CSS3
 
I Can't Believe It's Not Flash
I Can't Believe It's Not FlashI Can't Believe It's Not Flash
I Can't Believe It's Not Flash
 
pastel
pastelpastel
pastel
 
pastel
pastelpastel
pastel
 
Svcc 2013-css3-and-mobile
Svcc 2013-css3-and-mobileSvcc 2013-css3-and-mobile
Svcc 2013-css3-and-mobile
 
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
 
D3.js and SVG
D3.js and SVGD3.js and SVG
D3.js and SVG
 
SVG vs Canvas - Showdown of the Painters
SVG vs Canvas - Showdown of the PaintersSVG vs Canvas - Showdown of the Painters
SVG vs Canvas - Showdown of the Painters
 
Next generation Graphics: SVG
Next generation Graphics: SVGNext generation Graphics: SVG
Next generation Graphics: SVG
 
JavaONE 2012 Using Java with HTML5 and CSS3
JavaONE 2012 Using Java with HTML5 and CSS3JavaONE 2012 Using Java with HTML5 and CSS3
JavaONE 2012 Using Java with HTML5 and CSS3
 
Thats Not Flash?
Thats Not Flash?Thats Not Flash?
Thats Not Flash?
 
Accelerated Stylesheets
Accelerated StylesheetsAccelerated Stylesheets
Accelerated Stylesheets
 
How to build a html5 websites.v1
How to build a html5 websites.v1How to build a html5 websites.v1
How to build a html5 websites.v1
 
Svcc 2013-d3
Svcc 2013-d3Svcc 2013-d3
Svcc 2013-d3
 
SVCC 2013 D3.js Presentation (10/05/2013)
SVCC 2013 D3.js Presentation (10/05/2013)SVCC 2013 D3.js Presentation (10/05/2013)
SVCC 2013 D3.js Presentation (10/05/2013)
 
MOConf'13: WebNotBombs: Optimize this
MOConf'13: WebNotBombs: Optimize thisMOConf'13: WebNotBombs: Optimize this
MOConf'13: WebNotBombs: Optimize this
 
Google I/O 2013 - Android Graphics Performance
Google I/O 2013 - Android Graphics PerformanceGoogle I/O 2013 - Android Graphics Performance
Google I/O 2013 - Android Graphics Performance
 
Google I/O 2013 - Android Graphics Performance
Google I/O 2013 - Android Graphics PerformanceGoogle I/O 2013 - Android Graphics Performance
Google I/O 2013 - Android Graphics Performance
 

Mehr von SpeedPartner GmbH

Extbase/Fluid: Kennenlernen und ausprobieren
Extbase/Fluid: Kennenlernen und ausprobierenExtbase/Fluid: Kennenlernen und ausprobieren
Extbase/Fluid: Kennenlernen und ausprobierenSpeedPartner GmbH
 
XUL - The future of user-interfaces on the web
XUL - The future of user-interfaces on the webXUL - The future of user-interfaces on the web
XUL - The future of user-interfaces on the webSpeedPartner GmbH
 
Websockets: Leichtgewichtige Verbindungen für Web-Applikationen
Websockets: Leichtgewichtige Verbindungen für Web-ApplikationenWebsockets: Leichtgewichtige Verbindungen für Web-Applikationen
Websockets: Leichtgewichtige Verbindungen für Web-ApplikationenSpeedPartner GmbH
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishSpeedPartner GmbH
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSpeedPartner GmbH
 
.EU – eine neue Top-Level-Domain
.EU – eine neue Top-Level-Domain.EU – eine neue Top-Level-Domain
.EU – eine neue Top-Level-DomainSpeedPartner GmbH
 
Leben und Arbeiten in einer Community
Leben und Arbeiten in einer CommunityLeben und Arbeiten in einer Community
Leben und Arbeiten in einer CommunitySpeedPartner GmbH
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSpeedPartner GmbH
 
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSpeedPartner GmbH
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSpeedPartner GmbH
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishSpeedPartner GmbH
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSpeedPartner GmbH
 
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSpeedPartner GmbH
 
Deploying IPv6 - planning, common pitfalls and security-considerations
Deploying IPv6 - planning, common pitfalls and security-considerationsDeploying IPv6 - planning, common pitfalls and security-considerations
Deploying IPv6 - planning, common pitfalls and security-considerationsSpeedPartner GmbH
 

Mehr von SpeedPartner GmbH (20)

Extbase/Fluid: Kennenlernen und ausprobieren
Extbase/Fluid: Kennenlernen und ausprobierenExtbase/Fluid: Kennenlernen und ausprobieren
Extbase/Fluid: Kennenlernen und ausprobieren
 
Secure PHP environment
Secure PHP environmentSecure PHP environment
Secure PHP environment
 
XUL - The future of user-interfaces on the web
XUL - The future of user-interfaces on the webXUL - The future of user-interfaces on the web
XUL - The future of user-interfaces on the web
 
PHP-Applikationen mit PEAR
PHP-Applikationen mit PEARPHP-Applikationen mit PEAR
PHP-Applikationen mit PEAR
 
PHP-Entwicklung mit PEAR
PHP-Entwicklung mit PEARPHP-Entwicklung mit PEAR
PHP-Entwicklung mit PEAR
 
Websockets: Leichtgewichtige Verbindungen für Web-Applikationen
Websockets: Leichtgewichtige Verbindungen für Web-ApplikationenWebsockets: Leichtgewichtige Verbindungen für Web-Applikationen
Websockets: Leichtgewichtige Verbindungen für Web-Applikationen
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnish
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
 
News from PEAR
News from PEARNews from PEAR
News from PEAR
 
PEAR - An introduction
PEAR - An introductionPEAR - An introduction
PEAR - An introduction
 
Suchmaschinen-Optimierung
Suchmaschinen-OptimierungSuchmaschinen-Optimierung
Suchmaschinen-Optimierung
 
.EU – eine neue Top-Level-Domain
.EU – eine neue Top-Level-Domain.EU – eine neue Top-Level-Domain
.EU – eine neue Top-Level-Domain
 
Leben und Arbeiten in einer Community
Leben und Arbeiten in einer CommunityLeben und Arbeiten in einer Community
Leben und Arbeiten in einer Community
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
 
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnish
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
 
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
 
Deploying IPv6 - planning, common pitfalls and security-considerations
Deploying IPv6 - planning, common pitfalls and security-considerationsDeploying IPv6 - planning, common pitfalls and security-considerations
Deploying IPv6 - planning, common pitfalls and security-considerations
 

Kürzlich hochgeladen

SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 

Kürzlich hochgeladen (20)

SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 

Professional reports with SVG and PHP

  • 1. Professional reports with SVG Stefan Neufeind SpeedPartner GmbH
  • 2. 2 About me  Stefan Neufeind  From Neuss (near Düsseldorf, Germany)  Working for SpeedPartner GmbH (consulting, development, administration)  PEAR-developer  Loves PHP / FOSS :-)
  • 3. 3 Agenda  About SVG  Support for SVG  SVG and PHP  PEAR::XML_SVG  PEAR::Image_Canvas  Reporting with PEAR::Image_Graph  SVG ready for use?  Links
  • 4. 4 About SVG  Standard defined by W3C  XML = eXtensible Markup Language  For 2D vector-graphics  Static and animated  DOM (Document Object Model)  Modifyable with ECMAScript, SMIL  Event-handlers, ...  Editable using a simple text-editor
  • 5. 5 About SVG Types of objects:  Vector shapes  Lines, curves, ...  Raster images  e.g. PNG used in SVG-document  Text  Searchable, accessible, ...
  • 6. 6 About SVG Features:  Grouping, styling  Transformations  Clipping paths  Alpha masks  Filter effects  Template objects  Extensibility
  • 7. 7 About SVG Profiles:  SVG Tiny (SVGT)  For restricted devices like cellphones  SVG Basic (SVGB)  For advances devices like PDAs  Full SVG
  • 8. 8 About SVG Namespaces:  XML-namespace for SVG  Usable together with other namespaces  Allows mixing of XHTML, SVG, MathML, XUL/XBL, ... in one document
  • 9. 9 About SVG Timeline:  SVG 1.0: W3C Recommendation on 2001-09-04  SVG 1.1: W3C Recommendation on 2003-01-14  SVG 1.1 Tiny / Basic: W3C Recommendation on 2003-01-14  SVG 1.2 Mobile (Tiny) / SVG 1.2 Full: Still drafts
  • 10. 10 About SVG Outlook to SVG 1.2:  Flowing text and graphics  Xforms  Multiple pages  Painting/Multimedia enhancements
  • 11. 11 About SVG Competition to SVG:  Flash (binary format)  Not open (Format spec available for export)  Large market share  Poor accessibility  VML (text format)  Open, but Internet Explorer only  XAML (text source compiled to binary)  Published, but possibly not open
  • 12. 12 Support for SVG  Content negotiation via HTTP  Deliver SVG or convert on server  Rasterization on server (for older browser)  ImageMagick (quick but incomplete)  Batik (complete but slow [Java])  Standalone viewer / browser-plugin
  • 13. 13 Support for SVG Standalone viewers / browser-plugins:  Adobe SVG Viewer  Free, MacOS/Windows Linux/Solaris  Corel SVG viewer  Free, Windows, no longer supported  Apache Squiggle (part of Batik toolkit)  Free, Java → Slow  ...
  • 14. 14 Support for SVG Native support:  Opera browser  SVG 1.1 Tiny since 8.0 beta 3  Mozilla  Firefox since 1.5 beta 1 (not on Linux yet)  Mozilla SeaMonkey suite  KDE  Plugin for Konqueror (KSVG)  Since 3.4 support for SVG wallpapers :-)
  • 15. 15 Support for SVG Native support (continued):  Apple Safari  Porting of KSVG2 into WebCore in progress  Amaya (W3C webbrowser/editor)  Partial SVG support  Apache Batik SVG toolkit  For Java programs
  • 16. 16 Support for SVG Mozilla support:  included in latest builds  native SVG-support:  handles compound documents mixed of SVG, MathML, XHTML, XUL (through namespaces)  supports SVG dom  allows using SVG in XBL (XUL binding language) etc.
  • 17. 17 Support for SVG Mozilla support (continued):  currently supports basic shapes:  beziers  stroking and filling with opacity  gradients  scripting  events  most of the DOM
  • 18. 18 Support for SVG Mozilla support (continued):  target:  full SVG 1.1 support  specification-conform  big areas lacking features:  filters  svg defined fonts  declarative animations
  • 19. 19 SVG and PHP PEAR-packages:  XML_image2svg  Converts JPEG, GIF of PNG to base64- representation inside SVG-container  Not really helpful?  Old, seems unmaintained  XML_svg2image  Converts svg to JPEG or PNG  Requires apache-batik via php-ext/java
  • 20. 20 SVG and PHP PEAR-packages (continued):  XML_SVG  Object-oriented API to build SVG documents  Based on SVG-library from Horde  Low level abstraction “wrapper“ for SVG  Image_Canvas  High level of abstraction  Interface to GD, SVG, PDF, ImageMap (planned: Flash using MING / libSWF, PDF using File_PDF / cPdfWriter, ...)
  • 21. 21 SVG and PHP PEAR::XML_SVG – source: <?php require_once('XML/SVG.php'); $svg = &new XML_SVG_Document( array('width' => 400, 'height' => 200)); $g = &new XML_SVG_Group( array('style' => 'stroke:black', 'transform' => 'translate(200 100)')); $g->addParent($svg); // or: $svg->addChild($g);
  • 22. 22 SVG and PHP PEAR::XML_SVG – source (continued): $circle = &new XML_SVG_Circle( array('cx' => 0, 'cy' => 0, 'r' => 100, 'style' => 'stroke-width:3')); $circle->addChild(new XML_SVG_Animate( array('attributeName' => 'r', 'attributeType' => 'XML', 'from' => 0, 'to' => 90, 'dur' => '3s', 'fill'=> 'freeze')));
  • 23. 23 SVG and PHP PEAR::XML_SVG – source (continued): $circle->addChild(new XML_SVG_Animate( array('attributeName' => 'fill', 'attributeType' => 'CSS', 'from' => 'yellow', 'to' => 'red', 'dur' => '3s', 'fill'=> 'freeze'))); $g->addChild($circle); $text = &new XML_SVG_Text(array( 'text' => 'SVG chart!', 'x' => 0,'y' => 0, 'style'=> 'font-size:20; text-anchor:middle;'));
  • 24. 24 SVG and PHP PEAR::XML_SVG – source (continued): $text->addChild(new XML_SVG_Animate( array('attributeName' => 'font-size', 'attributeType' => 'auto', 'from' => 50, 'to' => 30, 'dur' => '3s', 'fill'=> 'freeze'))); $g->addChild($text); $svg->printElement(); ?>
  • 25. 25 SVG and PHP PEAR::XML_SVG – SVG: <g style="stroke:black" transform="translate(200 100)"> <circle cx="0" cy="0" r="100" style="stroke-width:3"> <animate attributeName="r" attributeType="XML" from="0" to="90" dur="3s" fill="freeze" /> <animate attributeName="fill" attributeType="CSS" from="yellow" to="red" dur="3s" fill="freeze" /> </circle>
  • 26. 26 SVG and PHP PEAR::XML_SVG – SVG (continued): <text x="0" y="0" style="font-size:20; text-anchor:middle;">SVG chart! <animate attributeName="font-size" attributeType="auto" from="50" to="30" dur="3s" fill="freeze" /> </text> </g>
  • 27. 27 SVG and PHP PEAR::XML_SVG – animated image: transition
  • 28. 28 SVG and PHP PEAR::Image_Canvas – source: <?php include_once 'Image/Canvas.php'; $Canvas =& Image_Canvas::factory('svg', array('width' => 400, 'height' => 300)); $Canvas->setLineColor('black'); $Canvas->rectangle(array('x0' => 0, 'y0' => 0, 'x1' => 399, 'y1' => 299));
  • 29. 29 SVG and PHP PEAR::Image_Canvas – source (continued): $Canvas->setGradientFill( array('direction' => 'horizontal', 'start' => 'red', 'end' => 'blue')); $Canvas->setLineColor('black'); $Canvas->ellipse(array('x' => 199, 'y' => 149, 'rx' => 50, 'ry' => 50)); $Canvas->setFont(array('name' => 'Arial', 'size' => 12)); $Canvas->addText(array('x' => 0, 'y' => 0, 'text' => 'Demonstration of what Image_Canvas do!'));
  • 30. 30 SVG and PHP PEAR::Image_Canvas – source (continued): // ... some more text-generation skipped ... $Canvas->addVertex( array('x' => 50, 'y' => 200)); $Canvas->addVertex( array('x' => 100, 'y' => 200)); $Canvas->addVertex( array('x' => 100, 'y' => 250)); $Canvas->setFillColor('red@0.2'); $Canvas->polygon(array('connect' => true));
  • 31. 31 SVG and PHP PEAR::Image_Canvas – source (continued): $Canvas->image(array('x' => 398, 'y' => 298, 'filename' => './pear-icon.png', 'alignment' => array( 'horizontal' => 'right', 'vertical' => 'bottom'))); $Canvas->show(); ?>
  • 32. 32 SVG and PHP PEAR::Image_Canvas – SVG: <defs> <linearGradient id="gradient_1" x1="0%" y1="0%" x2="100%" y2="0%"> <stop offset="0%" style="stop- color:rgb(255,0,0);"/> <stop offset="100%" style="stop- color:rgb(0,0,255);"/> </linearGradient> </defs> <rect x="0" y="0" width="399" height="299" style="stroke-width:1;stroke:rgb(0,0,0); fill:none;"/>
  • 33. 33 SVG and PHP PEAR::Image_Canvas – SVG (continued): <ellipse cx="199" cy="149" rx="50" ry="50" style="stroke-width:1;stroke:rgb(0,0,0); fill:url(#gradient_1);"/> <text x="0" y="12" style="font- family:Arial;font- size:12px;fill=rgb(0,0,0);">Demonstration of what Image_Canvas do!</text> ... <image xlink:href="data:image/png;base64, iVBORw0..." x="398" y="298" width="32" height="32" preserveAspectRatio="none"/>
  • 35. 35 PEAR::Image_Graph  Drawing graphs in various ways  Object-oriented, flexible, extendable  Since v0.5. uses PEAR::Image_Canvas as „driver model“ for output  GD (PNG, JPEG, GIF, WBMP)  Scalable Vector Graphics (SVG)  PDF (using PDFLib)  Optional: Data-preprocessors packages  'Numbers_Words' and 'Numbers_Roman'
  • 36. 36 PEAR::Image_Graph  Use factory-methods  Not required – but allows “lazy includes“ require_once 'Image/Graph.php'; require_once 'Image/Canvas.php'; $Canvas =& Image_Canvas::factory('svg', array('width' => 600, 'height' => 400)); $Graph =& Image_Graph::factory('graph', $Canvas); // instead of $Graph =& new Image_Graph($Canvas); // ...
  • 37. 37 PEAR::Image_Graph  Mind the ampersand (call by reference)  Otherwise problems with modifying objects // ... $Plot =& $Graph->addNew ('line', &$Dataset); // without ampersand the following // would be impossible $Plot->setLineColor('red'); // ...
  • 38. 38 PEAR::Image_Graph  Adding elements to parents // ... $newElement =& Image_Graph::factory( 'some_element', array($param1, $param2, &$param3) ); $parentElement->add($newElement); // better instead do: $parentElement->addNew('some_element', array($param1, $param2, &$param3)); // ...
  • 39. 39 PEAR::Image_Graph Components of a graph:  graph  plotarea (to create the plots on)  plot  dataset (data to plot)  additional elements (e.g. legend)
  • 41. 41 PEAR::Image_Graph Simple example: require_once 'Image/Graph.php'; require_once 'Image/Canvas.php'; $Canvas =& Image_Canvas::factory('svg', array('width' => 600, 'height' => 400)); $Graph =& Image_Graph::factory('graph', $Canvas); $Plotarea =& $Graph->addNew('plotarea'); $Dataset =& Image_Graph::factory('dataset'); $Dataset->addPoint('Denmark', 10); $Dataset->addPoint('Norway', 3); $Dataset->addPoint('Sweden', 8); $Dataset->addPoint('Finland', 5); $Plot =& $Plotarea->addNew('bar',&$Dataset); $Graph->done();
  • 42. 42 PEAR::Image_Graph Plotarea:  Holds axis-layout  Container for plots  Standard-behaviour:  X-axis textual ('Denmark','Sweden', ...)  Y-axis linear  Types:  'axis' (linear), 'axis_log' (logarithmic),  'Image_Graph_Axis_Category' (textual)
  • 43. 43 PEAR::Image_Graph Graph types:  'line', 'area', 'bar', 'smooth_line', 'smooth_area', 'pie', 'step', 'impulse', 'dot' or 'scatter', 'radar', Image_Graph_Plot_CandleStick, Image_Graph_Plot_Band Special modes:  'normal', 'stacked', 'stacked100pct'
  • 44. 44 1. Adding a plotarea: 2. Adding a bar-plot: PEAR::Image_Graph $Plotarea =& $Graph->addNew('plotarea', array('axis', 'axis_log')); // ... $Plot =& $Plotarea->addNew('bar', $Dataset); // ...
  • 46. 46 Data for plots:  Directly giving points  Function callback PEAR::Image_Graph $Dataset =& Image_Graph::factory('dataset'); $Dataset->addPoint('Denmark', 10); $Dataset->addPoint('Norway', 3); function foo($bar) { return 2 * $bar + 10; } // 100 values between -3 and 10 $Dataset =& Image_Graph::factory ('function', array(-3, 10, 'foo', 100));
  • 47. 47 Using colors:  Color names (e.g. 'green') or RGB ('#00ff00', '75%,20%,19%', array(0, 255, 0)  Optionally opacity ('red@0.2', '#00ff00@0.9', array(0, 255, 0, 0.2)) PEAR::Image_Graph $element->setLineColor('red'); $element->setFillColor('#0000ff@0.1'); $element->setBackgroundColor('green@0.1'); $element->setBorderColor(array(0, 0, 0));
  • 48. 48 Fillstyles:  Simple fill  Gradient fill  Vertical, horizontal, diagonally, radial  Image PEAR::Image_Graph $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_VERTICAL, 'white','red')); $element->setFillStyle($fill); $fill =& Image_Graph::factory( 'Image_Graph_Fill_Image', './image.png'); $element->setFillStyle($fill);
  • 49. 49 Layouts:  Horizontal, vertical, ... PEAR::Image_Graph // split 40% from left; A and B are plotareas $Graph->add(Image_Graph::horizontal( $A, $B, 40) ); // directly create plotareas as well $Graph->add(Image_Graph::vertical( $part1 = Image_Graph::factory('plotarea'), $part3 = Image_Graph::factory('plotarea'), 40 ) );
  • 50. 50 Layouts:  ... and matrix PEAR::Image_Graph $Matrix =& $Graph->addNew ('Image_Graph_Layout_Matrix', array(2, 2)); $part1 =& $Matrix->getEntry(0, 0); $part2 =& $Matrix->getEntry(0, 1); $part3 =& $Matrix->getEntry(1, 0); $part4 =& $Matrix->getEntry(1, 1);
  • 51. 51 More complex example:  TrueType-font, title, plotarea, legend  Vertical layout  Gradient fill  Two y-axes  Axes-titles PEAR::Image_Graph
  • 52. 52 More complex example (continued): PEAR::Image_Graph require_once 'Image/Graph.php'; require_once 'Image/Canvas.php'; $Canvas =& Image_Canvas::factory('svg', array('width' => 600, 'height' => 400)); $Graph =& Image_Graph::factory('graph', $Canvas); $Font =& $Graph->addNew('ttf_font', 'Gothic'); $Font->setSize(8); $Graph->setFont($Font);
  • 53. 53 More complex example (continued): PEAR::Image_Graph $Graph->add(Image_Graph::vertical( Image_Graph::factory('title', array('Primary & Secondary Axis', 11)), Image_Graph::vertical( $Plotarea = Image_Graph::factory('plotarea'), $Legend =Image_Graph::factory('legend'),90),5)); $Legend->setPlotarea($Plotarea); $GridY2 =& $Plotarea->addNew('bar_grid', IMAGE_GRAPH_AXIS_Y_SECONDARY); $GridY2->setFillStyle(Image_Graph::factory( 'gradient', array(IMAGE_GRAPH_GRAD_VERTICAL, 'white', 'lightgrey') ) );
  • 54. 54 More complex example (continued): PEAR::Image_Graph $Dataset1 =& Image_Graph::factory('random', array(8, 10, 100, true)); $Plot1 =& $Plotarea->addNew('line', &$Dataset1); $Plot1->setLineColor('red'); $Dataset2 =& Image_Graph::factory('random', array(8, 1, 10, true)); $Plot2 =& $Plotarea->addNew ('Image_Graph_Plot_Area', $Dataset2, IMAGE_GRAPH_AXIS_Y_SECONDARY); $Plot2->setLineColor('gray'); $Plot2->setFillColor('blue@0.2'); $Plot1->setTitle('Primary Axis'); $Plot2->setTitle('Secondary Axis');
  • 55. 55 More complex example (continued): PEAR::Image_Graph $AxisX =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X); $AxisX->setTitle('Oranges'); $AxisY =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); $AxisY->setTitle('Apples', 'vertical'); $AxisYsecondary =& $Plotarea->getAxis( IMAGE_GRAPH_AXIS_Y_SECONDARY); $AxisYsecondary->setTitle('Pears', 'vertical2'); // output the Graph $Graph->done();
  • 56. 56 Data preprocessors:  Adjustment / translation of data (e.g. Axis labels) PEAR::Image_Graph $AxisX =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X); $AxisX->setDataPreprocessor(Image_Graph::factory ('Image_Graph_DataPreprocessor_Array', array(array(1 => '30 Jul', 2 => '31 Jul', 3 => '1 Aug', 4 => '2 Aug')))); $AxisY =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); $AxisY->setDataPreprocessor(Image_Graph::factory ('Image_Graph_DataPreprocessor_Formatted', '+ %0.1f%%'));
  • 58. 58  Flexible graph-creation  Multiple outputs, including SVG However please note:  Image_Graph still a moving target  SVG-support might still need work  Looking forward to your feedback! PEAR::Image_Graph
  • 59. 59 Yes ...  Future for small, but high quality image  Zoomable, accessible, ...  Text-based transformations of data  Tools in place for using SVG (editors, ...)  Ready for use in clear enviroments (browser / plugins installed)  Migration possible (server-based rasterisation, ...) SVG ready for use?
  • 60. 60 But ...  Advanced features still not  supported everywhere  giving same result everywhere  Some “mainstream” tools lacking support  especially OpenOffice.org (but under discussion) SVG ready for use?
  • 62. 62 Links  W3C Spec: http://www.w3.org/TR/SVG11/  W3C about accessiblity: http://www.w3.org/TR/SVG11/access.html  Viewers: http://www.w3.org/Graphics/SVG/SVG-Implementations  Adobe Indepth FAQ: http://www.adobe.com/svg/indepth/faq.html  SVG Foundation: http://www.svgfoundation.org/  http://www.zvon.org/xxl/svgReference/Output/index.html http://www.zvon.org/xxl/SVGReferenceSVG/Output/intro.svg
  • 63. 63 Links  Adobe SVG Viewer (Windows, MacOS, Linux, Solaris) http://www.adobe.com/svg/viewer/install/  Corel SVG viewer (Windows) No longer supported! http://www.corel.com/servlet/Satellite?pagename=Corel/Downloads/Details&id=1047022177437  Apache Squiggle (part of Batik toolkit) http://xml.apache.org/batik/svgviewer.html Java Webstart for Batik-demo: http://nagoya.apache.org/batik_1.1/batikNagoya.jnlp  Mozilla SVG http://www.mozilla.org/projects/svg/  Amaya (W3C's editor/browser) http://www.w3.org/Amaya/
  • 64. 64 Links  Free editors:  Skencil (Linux) http://www.nongnu.org/skencil/  Inkscape (Windows, MacOS, Linux) http://www.inkscape.org/  Content:  Samples: http://www.croczilla.com/svg/samples/  Cliparts: http://www.openclipart.org/
  • 65. 65 Links  PHP:  PEAR-packages http://pear.php.net/ Image_GIS, Image_Graph, XML_SVG, Image_Canvas, XML_image2svg, XML_svg2image  Lots of Image_Graph examples (visual and code): http://pear.veggerby.dk  SVG class from PHP Classes http://www.phpclasses.org/browse/package/457.html
  • 66. 66 Thank you! Up-to-date slides available at: http://talks.speedpartner.de/ Questions? neufeind (at) speedpartner.de