From dc35bae9c40d7cb30040eb0f11a4580ac2d58d89 Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Fri, 11 Nov 2005 14:58:37 +0000 Subject: [PATCH] Step 1 (SVN just doesn't want me to delete the old directories): Created sandbox area (src/sandbox). Moved MIF, PCL and SVG support to the sandbox due to their current state. Build adjusted to build a fop-sandbox.jar (the three moved renderers automatically get registered if they are in the classpath). git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@332575 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 46 +- fop | 4 +- fop.bat | 1 + .../apache/fop/render/RendererFactory.java | 3 - .../services/org.apache.fop.fo.FOEventHandler | 1 + .../services/org.apache.fop.render.Renderer | 2 + .../org/apache/fop/render/mif/MIFElement.java | 117 +++++ .../render/mif/MIFFOEventHandlerMaker.java | 51 ++ .../org/apache/fop/render/mif/MIFFile.java | 137 +++++ .../org/apache/fop/render/mif/MIFHandler.java | 473 ++++++++++++++++++ .../org/apache/fop/render/mif/PGFElement.java | 48 ++ .../org/apache/fop/render/mif/RefElement.java | 43 ++ .../apache/fop/render/mif/RulingElement.java | 50 ++ .../org/apache/fop/render/mif/package.html | 22 + .../apache/fop/render/pcl/PCLRenderer.java | 187 +++++++ .../fop/render/pcl/PCLRendererMaker.java | 51 ++ .../org/apache/fop/render/pcl/PCLStream.java | 57 +++ .../org/apache/fop/render/pcl/package.html | 22 + .../apache/fop/render/svg/SVGRenderer.java | 427 ++++++++++++++++ .../fop/render/svg/SVGRendererMaker.java | 49 ++ .../org/apache/fop/render/svg/package.html | 22 + 21 files changed, 1800 insertions(+), 13 deletions(-) create mode 100644 src/sandbox/META-INF/services/org.apache.fop.fo.FOEventHandler create mode 100644 src/sandbox/META-INF/services/org.apache.fop.render.Renderer create mode 100644 src/sandbox/org/apache/fop/render/mif/MIFElement.java create mode 100644 src/sandbox/org/apache/fop/render/mif/MIFFOEventHandlerMaker.java create mode 100644 src/sandbox/org/apache/fop/render/mif/MIFFile.java create mode 100644 src/sandbox/org/apache/fop/render/mif/MIFHandler.java create mode 100644 src/sandbox/org/apache/fop/render/mif/PGFElement.java create mode 100644 src/sandbox/org/apache/fop/render/mif/RefElement.java create mode 100644 src/sandbox/org/apache/fop/render/mif/RulingElement.java create mode 100644 src/sandbox/org/apache/fop/render/mif/package.html create mode 100644 src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java create mode 100644 src/sandbox/org/apache/fop/render/pcl/PCLRendererMaker.java create mode 100644 src/sandbox/org/apache/fop/render/pcl/PCLStream.java create mode 100644 src/sandbox/org/apache/fop/render/pcl/package.html create mode 100644 src/sandbox/org/apache/fop/render/svg/SVGRenderer.java create mode 100644 src/sandbox/org/apache/fop/render/svg/SVGRendererMaker.java create mode 100644 src/sandbox/org/apache/fop/render/svg/package.html diff --git a/build.xml b/build.xml index 51683d4bc..cc93a5c2d 100644 --- a/build.xml +++ b/build.xml @@ -164,6 +164,7 @@ list of possible build targets. + @@ -174,6 +175,7 @@ list of possible build targets. + @@ -383,6 +385,23 @@ list of possible build targets. + + + + + + + + + + + + + + + @@ -433,16 +452,9 @@ list of possible build targets. - - - - - - -
@@ -458,10 +470,27 @@ list of possible build targets. + + + + + + + + + + + + + + + + + - + @@ -839,6 +868,7 @@ NOTE: + diff --git a/fop b/fop index a815067a2..79489346f 100755 --- a/fop +++ b/fop @@ -140,8 +140,8 @@ if [ -n "$CLASSPATH" ] ; then LOCALCLASSPATH=$CLASSPATH fi -# add fop.jar and fop-hyph.jar, which reside in $FOP_HOME/build -LOCALCLASSPATH=${FOP_HOME}/build/fop.jar:${FOP_HOME}/build/fop-hyph.jar:$LOCALCLASSPATH +# add fop.jar, fop-sandbox and fop-hyph.jar, which reside in $FOP_HOME/build +LOCALCLASSPATH=${FOP_HOME}/build/fop.jar:${FOP_HOME}/build/fop-sandbox.jar:${FOP_HOME}/build/fop-hyph.jar:$LOCALCLASSPATH # add in the dependency .jar files, which reside in $FOP_HOME/lib DIRLIBS=${FOP_HOME}/lib/*.jar diff --git a/fop.bat b/fop.bat index 01c96fa42..f7e66f8f5 100644 --- a/fop.bat +++ b/fop.bat @@ -39,6 +39,7 @@ rem set LOGLEVEL=-Dorg.apache.commons.logging.simplelog.defaultlog=INFO set LIBDIR=%LOCAL_FOP_HOME%lib set LOCALCLASSPATH=%LOCAL_FOP_HOME%build\fop.jar +set LOCALCLASSPATH=%LOCALCLASSPATH%;%LOCAL_FOP_HOME%build\fop-sandbox.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LOCAL_FOP_HOME%build\fop-hyph.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xml-apis-1.3.02.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xercesImpl-2.7.1.jar diff --git a/src/java/org/apache/fop/render/RendererFactory.java b/src/java/org/apache/fop/render/RendererFactory.java index cb677a4a9..c6ed0f641 100644 --- a/src/java/org/apache/fop/render/RendererFactory.java +++ b/src/java/org/apache/fop/render/RendererFactory.java @@ -64,8 +64,6 @@ public class RendererFactory { private void registerStandardRenderers() { addRendererMaker(new org.apache.fop.render.pdf.PDFRendererMaker()); addRendererMaker(new org.apache.fop.render.ps.PSRendererMaker()); - addRendererMaker(new org.apache.fop.render.pcl.PCLRendererMaker()); - addRendererMaker(new org.apache.fop.render.svg.SVGRendererMaker()); addRendererMaker(new org.apache.fop.render.txt.TXTRendererMaker()); addRendererMaker(new org.apache.fop.render.bitmap.PNGRendererMaker()); addRendererMaker(new org.apache.fop.render.bitmap.TIFFRendererMaker()); @@ -77,7 +75,6 @@ public class RendererFactory { private void registerStandardEventHandlers() { addFOEventHandlerMaker(new org.apache.fop.render.rtf.RTFFOEventHandlerMaker()); - addFOEventHandlerMaker(new org.apache.fop.render.mif.MIFFOEventHandlerMaker()); } /** diff --git a/src/sandbox/META-INF/services/org.apache.fop.fo.FOEventHandler b/src/sandbox/META-INF/services/org.apache.fop.fo.FOEventHandler new file mode 100644 index 000000000..8fe7aac6e --- /dev/null +++ b/src/sandbox/META-INF/services/org.apache.fop.fo.FOEventHandler @@ -0,0 +1 @@ +org.apache.fop.render.mif.MIFFOEventHandlerMaker \ No newline at end of file diff --git a/src/sandbox/META-INF/services/org.apache.fop.render.Renderer b/src/sandbox/META-INF/services/org.apache.fop.render.Renderer new file mode 100644 index 000000000..d75e81eb2 --- /dev/null +++ b/src/sandbox/META-INF/services/org.apache.fop.render.Renderer @@ -0,0 +1,2 @@ +org.apache.fop.render.pcl.PCLRendererMaker +org.apache.fop.render.svg.SVGRendererMaker \ No newline at end of file diff --git a/src/sandbox/org/apache/fop/render/mif/MIFElement.java b/src/sandbox/org/apache/fop/render/mif/MIFElement.java new file mode 100644 index 000000000..9f046a0c4 --- /dev/null +++ b/src/sandbox/org/apache/fop/render/mif/MIFElement.java @@ -0,0 +1,117 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.mif; + +// Java +import java.io.IOException; +import java.io.OutputStream; +import java.util.Iterator; +import java.util.List; + +/** + * The is the basis for MIF document elements. + * This enables the creation of the element and to write it + * to an output stream including sub-elements or a single value. + */ +public class MIFElement { + protected String name; + protected String valueStr = null; + protected List valueElements = null; + + protected boolean started = false; + protected boolean finish = false; + protected boolean finished = false; + + /** + */ + public MIFElement(String n) { + name = n; + } + + public void setValue(String str) { + valueStr = str; + } + + public void addElement(MIFElement el) { + if (valueElements == null) { + valueElements = new java.util.ArrayList(); + } + valueElements.add(el); + } + + /** + * Output this element to an output stream. + * This will output only so far as the fisrt unfinished child element. + * This method can be called again to continue from the previous point. + * An element that contains child elements will only be finished when + * the finish method is called. + */ + public boolean output(OutputStream os, int indent) throws IOException { + if (finished) { + return true; + } + if (valueElements == null && valueStr == null) { + return false; + } + + String indentStr = ""; + for (int c = 0; c < indent; c++) { + indentStr += " "; + } + if (!started) { + os.write((indentStr + "<" + name).getBytes()); + if (valueElements != null) { + os.write(("\n").getBytes()); + } + started = true; + } + if (valueElements != null) { + boolean done = true; + for (Iterator iter = valueElements.iterator(); iter.hasNext();) { + MIFElement el = (MIFElement)iter.next(); + boolean d = el.output(os, indent + 1); + if (d) { + iter.remove(); + } else { + done = false; + break; + } + } + if (!finish || !done) { + return false; + } + os.write((indentStr + "> # end of " + name + "\n").getBytes()); + } else { + os.write((" " + valueStr + ">\n").getBytes()); + } + finished = true; + return true; + } + + public void finish(boolean deep) { + finish = true; + if (deep && valueElements != null) { + for (Iterator iter = valueElements.iterator(); iter.hasNext();) { + MIFElement el = (MIFElement)iter.next(); + el.finish(deep); + } + } + } +} + diff --git a/src/sandbox/org/apache/fop/render/mif/MIFFOEventHandlerMaker.java b/src/sandbox/org/apache/fop/render/mif/MIFFOEventHandlerMaker.java new file mode 100644 index 000000000..96bde2600 --- /dev/null +++ b/src/sandbox/org/apache/fop/render/mif/MIFFOEventHandlerMaker.java @@ -0,0 +1,51 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.mif; + +import java.io.OutputStream; + +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.apps.MimeConstants; +import org.apache.fop.fo.FOEventHandler; +import org.apache.fop.render.AbstractFOEventHandlerMaker; + +/** + * Maker class for MIF support. + */ +public class MIFFOEventHandlerMaker extends AbstractFOEventHandlerMaker { + + private static final String[] MIMES = new String[] {MimeConstants.MIME_MIF}; + + + /** @see org.apache.fop.render.AbstractFOEventHandlerMaker */ + public FOEventHandler makeFOEventHandler(FOUserAgent ua, OutputStream out) { + return new MIFHandler(ua, out); + } + + /** @see org.apache.fop.render.AbstractFOEventHandlerMaker#needsOutputStream() */ + public boolean needsOutputStream() { + return true; + } + + /** @see org.apache.fop.render.AbstractFOEventHandlerMaker#getSupportedMimeTypes() */ + public String[] getSupportedMimeTypes() { + return MIMES; + } + +} diff --git a/src/sandbox/org/apache/fop/render/mif/MIFFile.java b/src/sandbox/org/apache/fop/render/mif/MIFFile.java new file mode 100644 index 000000000..b554ead33 --- /dev/null +++ b/src/sandbox/org/apache/fop/render/mif/MIFFile.java @@ -0,0 +1,137 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.mif; + +// Java +import java.io.IOException; +import java.io.OutputStream; +import java.util.Iterator; +import java.util.List; + +/** + * The MIF File. + * This organises the MIF File and the corresponding elements. + * The catalog elements are used to setup the resources that + * are referenced. + */ +public class MIFFile extends MIFElement { + + protected MIFElement colorCatalog = null; + protected PGFElement pgfCatalog = null; + protected MIFElement fontCatalog = null; + protected RulingElement rulingCatalog = null; + protected MIFElement tblCatalog = null; + protected MIFElement views = null; + protected MIFElement variableFormats = null; + protected MIFElement xRefFormats = null; + protected MIFElement document = null; + protected MIFElement bookComponent = null; + protected MIFElement initialAutoNums = null; + protected MIFElement aFrames = null; + protected MIFElement tbls = null; + protected List pages = new java.util.ArrayList(); + protected List textFlows = null; + + + public MIFFile() { + super(""); + valueElements = new java.util.ArrayList(); + setup(); + } + + /** + * Do some setup. + * Currently adds some dummy values to the resources. + */ + protected void setup() { + MIFElement unit = new MIFElement("Units"); + unit.setValue("Ucm"); + addElement(unit); + + colorCatalog = new MIFElement("ColorCatalog"); + MIFElement color = new MIFElement("Color"); + MIFElement prop = new MIFElement("ColorTag"); + prop.setValue("`Black'"); + color.addElement(prop); + prop = new MIFElement("ColorCyan"); + prop.setValue("0.000000"); + color.addElement(prop); + + prop = new MIFElement("ColorMagenta"); + prop.setValue("0.000000"); + color.addElement(prop); + prop = new MIFElement("ColorYellow"); + prop.setValue("0.000000"); + color.addElement(prop); + prop = new MIFElement("ColorBlack"); + prop.setValue("100.000000"); + color.addElement(prop); + prop = new MIFElement("ColorAttribute"); + prop.setValue("ColorIsBlack"); + color.addElement(prop); + prop = new MIFElement("ColorAttribute"); + prop.setValue("ColorIsReserved"); + color.addElement(prop); + color.finish(true); + + colorCatalog.addElement(color); + addElement(colorCatalog); + + pgfCatalog = new PGFElement(); + pgfCatalog.lookupElement(null); + addElement(pgfCatalog); + + rulingCatalog = new RulingElement(); + rulingCatalog.lookupElement(null); + addElement(rulingCatalog); + + } + + public void output(OutputStream os) throws IOException { + if (finished) { + return; + } + + if (!started) { + os.write((" # Generated by FOP\n"/* + getVersion()*/).getBytes()); + started = true; + } + boolean done = true; + + for (Iterator iter = valueElements.iterator(); iter.hasNext();) { + MIFElement el = (MIFElement)iter.next(); + boolean d = el.output(os, 0); + if (d) { + iter.remove(); + } else { + done = false; + break; + } + } + if (done && finish) { + os.write(("# end of MIFFile").getBytes()); + } + } + + public void addPage(MIFElement p) { + pages.add(p); + addElement(p); + } +} + diff --git a/src/sandbox/org/apache/fop/render/mif/MIFHandler.java b/src/sandbox/org/apache/fop/render/mif/MIFHandler.java new file mode 100644 index 000000000..c9ef2a53e --- /dev/null +++ b/src/sandbox/org/apache/fop/render/mif/MIFHandler.java @@ -0,0 +1,473 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.mif; + +// Java +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.fo.FOEventHandler; +import org.apache.fop.fo.flow.BasicLink; +import org.apache.fop.fo.flow.Block; +import org.apache.fop.fo.flow.ExternalGraphic; +import org.apache.fop.fo.flow.Footnote; +import org.apache.fop.fo.flow.FootnoteBody; +import org.apache.fop.fo.flow.InstreamForeignObject; +import org.apache.fop.fo.flow.Inline; +import org.apache.fop.fo.flow.Leader; +import org.apache.fop.fo.flow.ListBlock; +import org.apache.fop.fo.flow.ListItem; +import org.apache.fop.fo.flow.PageNumber; +import org.apache.fop.fo.flow.Table; +import org.apache.fop.fo.flow.TableBody; +import org.apache.fop.fo.flow.TableCell; +import org.apache.fop.fo.flow.TableColumn; +import org.apache.fop.fo.flow.TableRow; +import org.apache.fop.fo.pagination.Flow; +import org.apache.fop.fo.pagination.PageSequence; +import org.apache.fop.fo.pagination.PageSequenceMaster; +import org.apache.fop.fo.pagination.SimplePageMaster; +import org.apache.fop.fonts.FontSetup; +import org.xml.sax.SAXException; + +// TODO: do we really want every method throwing a SAXException + +/** + * The MIF Handler. + * This generates MIF output using the structure events from + * the FO Tree sent to this structure handler. + * This builds an MIF file and writes it to the output. + */ +public class MIFHandler extends FOEventHandler { + + /** Logger */ + private static Log log = LogFactory.getLog(MIFHandler.class); + + /** the MIFFile instance */ + protected MIFFile mifFile; + + /** the OutputStream to write to */ + protected OutputStream outStream; + + // current state elements + private MIFElement textFlow; + private MIFElement para; + + /** + * Creates a new MIF handler on a given OutputStream. + * @param ua FOUserAgent instance for this process + * @param os OutputStream to write to + */ + public MIFHandler(FOUserAgent ua, OutputStream os) { + super(ua); + outStream = os; + FontSetup.setup(fontInfo, null); + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startDocument() + */ + public void startDocument() throws SAXException { + log.fatal("The MIF Handler is non-functional at this time. Please help resurrect it!"); + mifFile = new MIFFile(); + try { + mifFile.output(outStream); + } catch (IOException ioe) { + throw new SAXException(ioe); + } + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endDocument() + */ + public void endDocument() throws SAXException { + // finish all open elements + mifFile.finish(true); + try { + mifFile.output(outStream); + outStream.flush(); + } catch (IOException ioe) { + throw new SAXException(ioe); + } + } + + /** + * Start the page sequence. + * This creates the pages in the MIF document that will be used + * by the following flows and static areas. + * @see org.apache.fop.fo.FOEventHandler + */ + public void startPageSequence(PageSequence pageSeq) { + // get the layout master set + // setup the pages for this sequence + String name = pageSeq.getMasterReference(); + SimplePageMaster spm = pageSeq.getRoot().getLayoutMasterSet().getSimplePageMaster(name); + if (spm == null) { + PageSequenceMaster psm = pageSeq.getRoot().getLayoutMasterSet().getPageSequenceMaster(name); + } else { + // create simple master with regions + MIFElement prop = new MIFElement("PageType"); + prop.setValue("BodyPage"); + + MIFElement page = new MIFElement("Page"); + page.addElement(prop); + + prop = new MIFElement("PageBackground"); + prop.setValue("'Default'"); + page.addElement(prop); + + // build regions + MIFElement textRect = new MIFElement("TextRect"); + prop = new MIFElement("ID"); + prop.setValue("1"); + textRect.addElement(prop); + prop = new MIFElement("ShapeRect"); + prop.setValue("0.0 841.889 453.543 0.0"); + textRect.addElement(prop); + page.addElement(textRect); + + textRect = new MIFElement("TextRect"); + prop = new MIFElement("ID"); + prop.setValue("2"); + textRect.addElement(prop); + prop = new MIFElement("ShapeRect"); + prop.setValue("0.0 841.889 453.543 187.65"); + textRect.addElement(prop); + page.addElement(textRect); + + mifFile.addPage(page); + } + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endPageSequence(PageSequence) + */ + public void endPageSequence(PageSequence pageSeq) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startFlow(Flow) + */ + public void startFlow(Flow fl) { + // start text flow in body region + textFlow = new MIFElement("TextFlow"); + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endFlow(Flow) + */ + public void endFlow(Flow fl) { + textFlow.finish(true); + mifFile.addElement(textFlow); + textFlow = null; + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startBlock(Block) + */ + public void startBlock(Block bl) { + para = new MIFElement("Para"); + // get font + textFlow.addElement(para); + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endBlock(Block) + */ + public void endBlock(Block bl) { + para.finish(true); + para = null; + } + + /** + * + * @param inl Inline that is starting. + */ + public void startInline(Inline inl){ + } + + /** + * + * @param inl Inline that is ending. + */ + public void endInline(Inline inl){ + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startTable(Table) + */ + public void startTable(Table tbl) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endTable(Table) + */ + public void endTable(Table tbl) { + } + + /** + * + * @param tc TableColumn that is starting; + */ + public void startColumn(TableColumn tc) { + } + + /** + * + * @param tc TableColumn that is ending; + */ + public void endColumn(TableColumn tc) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startHeader(TableBody) + */ + public void startHeader(TableBody th) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endHeader(TableBody) + */ + public void endHeader(TableBody th) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startFooter(TableBody) + */ + public void startFooter(TableBody tf) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endFooter(TableBody) + */ + public void endFooter(TableBody tf) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startBody(TableBody) + */ + public void startBody(TableBody tb) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endBody(TableBody) + */ + public void endBody(TableBody tb) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startRow(TableRow) + */ + public void startRow(TableRow tr) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endRow(TableRow) + */ + public void endRow(TableRow tr) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startCell(TableCell) + */ + public void startCell(TableCell tc) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endCell(TableCell) + */ + public void endCell(TableCell tc) { + } + + // Lists + /** + * @see org.apache.fop.fo.FOEventHandler#startList(ListBlock) + */ + public void startList(ListBlock lb) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endList(ListBlock) + */ + public void endList(ListBlock lb) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startListItem(ListItem) + */ + public void startListItem(ListItem li) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endListItem(ListItem) + */ + public void endListItem(ListItem li) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startListLabel() + */ + public void startListLabel() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endListLabel() + */ + public void endListLabel() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startListBody() + */ + public void startListBody() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endListBody() + */ + public void endListBody() { + } + + // Static Regions + /** + * @see org.apache.fop.fo.FOEventHandler#startStatic() + */ + public void startStatic() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endStatic() + */ + public void endStatic() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startMarkup() + */ + public void startMarkup() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endMarkup() + */ + public void endMarkup() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startLink(BasicLink basicLink) + */ + public void startLink(BasicLink basicLink) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endLink() + */ + public void endLink() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#image(ExternalGraphic) + */ + public void image(ExternalGraphic eg) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#pageRef() + */ + public void pageRef() { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#foreignObject(InstreamForeignObject) + */ + public void foreignObject(InstreamForeignObject ifo) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startFootnote(Footnote) + */ + public void startFootnote(Footnote footnote) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endFootnote(Footnote) + */ + public void endFootnote(Footnote footnote) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#startFootnoteBody(FootnoteBody) + */ + public void startFootnoteBody(FootnoteBody body) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#endFootnoteBody(FootnoteBody) + */ + public void endFootnoteBody(FootnoteBody body) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#leader(Leader) + */ + public void leader(Leader l) { + } + + /** + * @see org.apache.fop.fo.FOEventHandler#characters(char[], int, int) + */ + public void characters(char data[], int start, int length) { + if (para != null) { + String str = new String(data, start, length); + str = str.trim(); + // break into nice length chunks + if (str.length() == 0) { + return; + } + + MIFElement line = new MIFElement("ParaLine"); + MIFElement prop = new MIFElement("TextRectID"); + prop.setValue("2"); + line.addElement(prop); + prop = new MIFElement("String"); + prop.setValue("\"" + str + "\""); + line.addElement(prop); + + para.addElement(line); + } + } + + /** + * + * @param pagenum PageNumber that is starting. + */ + public void startPageNumber(PageNumber pagenum) { + } + + /** + * + * @param pagenum PageNumber that is ending. + */ + public void endPageNumber(PageNumber pagenum) { + } +} + diff --git a/src/sandbox/org/apache/fop/render/mif/PGFElement.java b/src/sandbox/org/apache/fop/render/mif/PGFElement.java new file mode 100644 index 000000000..8bbb2c18d --- /dev/null +++ b/src/sandbox/org/apache/fop/render/mif/PGFElement.java @@ -0,0 +1,48 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.mif; + +/** + * Font Catalog element. + * This is the reference lookup element for fonts in + * the MIF document. + */ +public class PGFElement extends RefElement { + + /** + * Creates a new font catalog element. + */ + public PGFElement() { + super("PgfCatalog"); + } + + public MIFElement lookupElement(Object key) { + if (key == null) { + MIFElement pgf = new MIFElement("Pgf"); + MIFElement prop = new MIFElement("PgfTag"); + prop.setValue("`Body'"); + pgf.addElement(prop); + addElement(pgf); + pgf.finish(true); + return pgf; + } + return null; + } +} + diff --git a/src/sandbox/org/apache/fop/render/mif/RefElement.java b/src/sandbox/org/apache/fop/render/mif/RefElement.java new file mode 100644 index 000000000..9c6b16242 --- /dev/null +++ b/src/sandbox/org/apache/fop/render/mif/RefElement.java @@ -0,0 +1,43 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.mif; + +/** + * Reference MIF Element. + * This element is a lookup reference set that contains + * a list of resources used in the MIF Document. + * When a lookup is performed it will either create a new + * element or return an existing element that is valid. + * THe key depends on the type of reference, it should be able + * to uniquely identify the element. + */ +public class RefElement extends MIFElement { + + /** + * @see org.apache.fop.render.mif.MIFElement#MIFElement(String) + */ + public RefElement(String n) { + super(n); + } + + public MIFElement lookupElement(Object key) { + return null; + } +} + diff --git a/src/sandbox/org/apache/fop/render/mif/RulingElement.java b/src/sandbox/org/apache/fop/render/mif/RulingElement.java new file mode 100644 index 000000000..4dda86c8e --- /dev/null +++ b/src/sandbox/org/apache/fop/render/mif/RulingElement.java @@ -0,0 +1,50 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.mif; + +public class RulingElement extends RefElement { + + public RulingElement() { + super("RulingCatalog"); + } + + public MIFElement lookupElement(Object key) { + if (key == null) { + MIFElement rul = new MIFElement("Ruling"); + MIFElement prop = new MIFElement("RulingTag"); + prop.setValue("`Default'"); + rul.addElement(prop); + prop = new MIFElement("RulingPenWidth"); + prop.setValue("1"); + rul.addElement(prop); + prop = new MIFElement("RulingPen"); + prop.setValue("0"); + rul.addElement(prop); + prop = new MIFElement("RulingLines"); + prop.setValue("1"); + rul.addElement(prop); + + addElement(rul); + rul.finish(true); + return rul; + } + return null; + } +} + diff --git a/src/sandbox/org/apache/fop/render/mif/package.html b/src/sandbox/org/apache/fop/render/mif/package.html new file mode 100644 index 000000000..b3e97fc5d --- /dev/null +++ b/src/sandbox/org/apache/fop/render/mif/package.html @@ -0,0 +1,22 @@ + + + +org.apache.fop.render.mif Package + +

MIF Output Support

+ + \ No newline at end of file diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java b/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java new file mode 100644 index 000000000..f322d2679 --- /dev/null +++ b/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java @@ -0,0 +1,187 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.pcl; + +// FOP +import org.apache.fop.apps.MimeConstants; +import org.apache.fop.render.PrintRenderer; + +// Java +import java.io.IOException; +import java.io.OutputStream; + +/** + * Renderer that renders areas to PCL + * Created by Arthur E Welch III while at M&I EastPoint Technology + * Donated by EastPoint to the Apache FOP project March 2, 2001. + */ +public class PCLRenderer extends PrintRenderer { + + /** The MIME type for PCL */ + public static final String MIME_TYPE = MimeConstants.MIME_PCL_ALT; + + /** + * the current stream to add PCL commands to + */ + protected PCLStream currentStream; + + private int pageHeight = 7920; + + // These variables control the virtual paggination functionality. + private int curdiv = 0; + private int divisions = -1; + private int paperheight = -1; // Paper height in decipoints? + private int orientation = -1; // -1=default/unknown, 0=portrait, 1=landscape. + private int topmargin = -1; // Top margin in decipoints? + private int leftmargin = -1; // Left margin in decipoints? + private int fullmargin = 0; + private final boolean debug = false; + + private int xoffset = -180; // X Offset to allow for PCL implicit 1/4" left margin. + + private java.util.Hashtable options; + + /** + * Create the PCL renderer + */ + public PCLRenderer() { + } + + public void setFont(String name, float size) { + int fontcode = 0; + if (name.length() > 1 && name.charAt(0) == 'F') { + try { + fontcode = Integer.parseInt(name.substring(1)); + } catch (Exception e) { + e.printStackTrace(); + } + } + switch (fontcode) { + case 1: // F1 = Helvetica + // currentStream.add("\033(8U\033(s1p" + (size / 1000) + "v0s0b24580T"); + // Arial is more common among PCL5 printers than Helvetica - so use Arial + + currentStream.add("\033(0N\033(s1p" + (size / 1000) + + "v0s0b16602T"); + break; + case 2: // F2 = Helvetica Oblique + + currentStream.add("\033(0N\033(s1p" + (size / 1000) + + "v1s0b16602T"); + break; + case 3: // F3 = Helvetica Bold + + currentStream.add("\033(0N\033(s1p" + (size / 1000) + + "v0s3b16602T"); + break; + case 4: // F4 = Helvetica Bold Oblique + + currentStream.add("\033(0N\033(s1p" + (size / 1000) + + "v1s3b16602T"); + break; + case 5: // F5 = Times Roman + // currentStream.add("\033(8U\033(s1p" + (size / 1000) + "v0s0b25093T"); + // Times New is more common among PCL5 printers than Times - so use Times New + + currentStream.add("\033(0N\033(s1p" + (size / 1000) + + "v0s0b16901T"); + break; + case 6: // F6 = Times Italic + + currentStream.add("\033(0N\033(s1p" + (size / 1000) + + "v1s0b16901T"); + break; + case 7: // F7 = Times Bold + + currentStream.add("\033(0N\033(s1p" + (size / 1000) + + "v0s3b16901T"); + break; + case 8: // F8 = Times Bold Italic + + currentStream.add("\033(0N\033(s1p" + (size / 1000) + + "v1s3b16901T"); + break; + case 9: // F9 = Courier + + currentStream.add("\033(0N\033(s0p" + + (120.01f / (size / 1000.00f)) + "h0s0b4099T"); + break; + case 10: // F10 = Courier Oblique + + currentStream.add("\033(0N\033(s0p" + + (120.01f / (size / 1000.00f)) + "h1s0b4099T"); + break; + case 11: // F11 = Courier Bold + + currentStream.add("\033(0N\033(s0p" + + (120.01f / (size / 1000.00f)) + "h0s3b4099T"); + break; + case 12: // F12 = Courier Bold Oblique + + currentStream.add("\033(0N\033(s0p" + + (120.01f / (size / 1000.00f)) + "h1s3b4099T"); + break; + case 13: // F13 = Symbol + + currentStream.add("\033(19M\033(s1p" + (size / 1000) + + "v0s0b16686T"); + // ECMA Latin 1 Symbol Set in Times Roman??? + // currentStream.add("\033(9U\033(s1p" + (size / 1000) + "v0s0b25093T"); + break; + case 14: // F14 = Zapf Dingbats + + currentStream.add("\033(14L\033(s1p" + (size / 1000) + + "v0s0b45101T"); + break; + default: + currentStream.add("\033(0N\033(s" + (size / 1000) + "V"); + break; + } + } + + public void startRenderer(OutputStream outputStream) throws IOException { + log.info("rendering areas to PCL"); + log.fatal("The PCL Renderer is non-functional at this time. Please help resurrect it!"); + currentStream = new PCLStream(outputStream); + + // Set orientation. + if (orientation > -1) { + currentStream.add("\033&l" + orientation + "O"); + } else { + currentStream.add("\033&l0O"); + } + if (orientation == 1 || orientation == 3) { + xoffset = -144; + } else { + xoffset = -180; + } + + // Reset the margins. + currentStream.add("\033" + "9\033&l0E"); + } + + public void stopRenderer() throws IOException { + } + + /** @see org.apache.fop.render.AbstractRenderer */ + public String getMimeType() { + return MIME_TYPE; + } + +} diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLRendererMaker.java b/src/sandbox/org/apache/fop/render/pcl/PCLRendererMaker.java new file mode 100644 index 000000000..2e39d355a --- /dev/null +++ b/src/sandbox/org/apache/fop/render/pcl/PCLRendererMaker.java @@ -0,0 +1,51 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.pcl; + +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.apps.MimeConstants; +import org.apache.fop.render.AbstractRendererMaker; +import org.apache.fop.render.Renderer; + +/** + * RendererMaker for the PCL Renderer. + */ +public class PCLRendererMaker extends AbstractRendererMaker { + + private static final String[] MIMES = new String[] { + MimeConstants.MIME_PCL, + MimeConstants.MIME_PCL_ALT}; + + + /**@see org.apache.fop.render.AbstractRendererMaker */ + public Renderer makeRenderer(FOUserAgent ua) { + return new PCLRenderer(); + } + + /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */ + public boolean needsOutputStream() { + return true; + } + + /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */ + public String[] getSupportedMimeTypes() { + return MIMES; + } + +} diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLStream.java b/src/sandbox/org/apache/fop/render/pcl/PCLStream.java new file mode 100644 index 000000000..0ad8096cc --- /dev/null +++ b/src/sandbox/org/apache/fop/render/pcl/PCLStream.java @@ -0,0 +1,57 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.pcl; + +import java.io.IOException; +import java.io.OutputStream; + +public class PCLStream { + + private OutputStream out = null; + private boolean doOutput = true; + + public PCLStream(OutputStream os) { + out = os; + } + + public void add(String str) { + if (!doOutput) { + return; + } + + byte buff[] = new byte[str.length()]; + int countr; + int len = str.length(); + for (countr = 0; countr < len; countr++) { + buff[countr] = (byte)str.charAt(countr); + } + try { + out.write(buff); + } catch (IOException e) { + // e.printStackTrace(); + // e.printStackTrace(System.out); + throw new RuntimeException(e.toString()); + } + } + + public void setDoOutput(boolean doout) { + doOutput = doout; + } + +} diff --git a/src/sandbox/org/apache/fop/render/pcl/package.html b/src/sandbox/org/apache/fop/render/pcl/package.html new file mode 100644 index 000000000..feec0572e --- /dev/null +++ b/src/sandbox/org/apache/fop/render/pcl/package.html @@ -0,0 +1,22 @@ + + + +org.apache.fop.render.pcl Package + +

PCL Renderer

+ + \ No newline at end of file diff --git a/src/sandbox/org/apache/fop/render/svg/SVGRenderer.java b/src/sandbox/org/apache/fop/render/svg/SVGRenderer.java new file mode 100644 index 000000000..7a6109ed9 --- /dev/null +++ b/src/sandbox/org/apache/fop/render/svg/SVGRenderer.java @@ -0,0 +1,427 @@ +/* + * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.svg; + +import org.apache.fop.apps.FOPException; +import org.apache.fop.area.PageViewport; +import org.apache.fop.area.LineArea; +import org.apache.fop.area.inline.ForeignObject; +import org.apache.fop.area.inline.Leader; +import org.apache.fop.area.inline.TextArea; +import org.apache.fop.svg.SVGUtilities; +import org.apache.fop.fonts.FontInfo; +import org.apache.fop.apps.FOUserAgent; + +import org.w3c.dom.Node; +import org.w3c.dom.svg.SVGSVGElement; +import org.w3c.dom.svg.SVGDocument; +/* org.w3c.dom.Document is not imported to avoid conflict with + org.apache.fop.control.Document */ +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.Element; +import org.w3c.dom.Text; +import org.apache.batik.dom.svg.SVGDOMImplementation; +import org.apache.batik.dom.util.XMLSupport; +import org.apache.batik.transcoder.svg2svg.SVGTranscoder; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.dom.util.DOMUtilities; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.awt.geom.Rectangle2D; +import java.util.HashMap; +import java.io.OutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; + +import org.apache.fop.render.AbstractRenderer; +import org.apache.fop.render.XMLHandler; +import org.apache.fop.render.RendererContext; + +/** + * This is the SVG renderer. + */ +public class SVGRenderer extends AbstractRenderer implements XMLHandler { + + /** SVG MIME type */ + public static final String SVG_MIME_TYPE = "image/svg+xml"; + + /** SVG namespace */ + public static final String SVG_NAMESPACE = SVGDOMImplementation.SVG_NAMESPACE_URI; + + private org.w3c.dom.Document svgDocument; + private Element svgRoot; + private Element currentPageG = null; + private Element lastLink = null; + private String lastViewbox = null; + + private Element docDefs = null; + private Element pageDefs = null; + private Element pagesGroup = null; + + // first sequence title + private LineArea docTitle = null; + + private RendererContext context; + + private OutputStream ostream; + + private float totalWidth = 0; + private float totalHeight = 0; + private float sequenceWidth = 0; + private float sequenceHeight = 0; + + private float pageWidth = 0; + private float pageHeight = 0; + private int pageNumber = 0; + + private HashMap fontNames = new HashMap(); + private HashMap fontStyles = new HashMap(); + private Color saveColor = null; + + /** + * The current (internal) font name + */ + private String currentFontName; + + /** + * The current font size in millipoints + */ + private int currentFontSize; + + /** + * The current colour's red, green and blue component + */ + private float currentRed = 0; + private float currentGreen = 0; + private float currentBlue = 0; + + /** + * Creates a new SVG renderer. + */ + public SVGRenderer() { + context = new RendererContext(this, SVG_MIME_TYPE); + } + + /** + * @see org.apache.fop.render.Renderer#setUserAgent(FOUserAgent) + */ + public void setUserAgent(FOUserAgent agent) { + super.setUserAgent(agent); + userAgent.getXMLHandlerRegistry().addXMLHandler(this); + } + + /** + * @see org.apache.fop.render.Renderer#setupFontInfo(FontInfo) + */ + public void setupFontInfo(FontInfo fontInfo) { + // create a temp Image to test font metrics on + BufferedImage fontImage = + new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + org.apache.fop.render.java2d.FontSetup.setup(fontInfo, + fontImage.createGraphics()); + } + + /** + * @see org.apache.fop.render.Renderer#startRenderer(OutputStream) + */ + public void startRenderer(OutputStream outputStream) + throws IOException { + ostream = outputStream; + DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); + svgDocument = impl.createDocument(SVG_NAMESPACE, "svg", null); + svgRoot = svgDocument.getDocumentElement(); + /* + ProcessingInstruction pi = + svgDocument.createProcessingInstruction("xml", + " version=\"1.0\" encoding=\"ISO-8859-1\""); + svgDocument.insertBefore(pi, svgRoot); + */ + + docDefs = svgDocument.createElementNS(SVG_NAMESPACE, "defs"); + svgRoot.appendChild(docDefs); + + pagesGroup = svgDocument.createElementNS(SVG_NAMESPACE, "g"); + pageDefs = svgDocument.createElementNS(SVG_NAMESPACE, "defs"); + pagesGroup.appendChild(pageDefs); + svgRoot.appendChild(pagesGroup); + + } + + /** + * @see org.apache.fop.render.Renderer#stopRenderer() + */ + public void stopRenderer() throws IOException { + totalWidth += sequenceWidth; + if (sequenceHeight > totalHeight) { + totalHeight = sequenceHeight; + } + + svgRoot.setAttributeNS(null, "width", "" + (totalWidth + 1)); + svgRoot.setAttributeNS(null, "height", "" + (totalHeight + 1)); + //svgRoot.setAttributeNS(null, "viewBox", "0 0 " + pageWidth + " " + pageHeight); + SVGTranscoder svgT = new SVGTranscoder(); + TranscoderInput input = new TranscoderInput(svgDocument); + TranscoderOutput output = + new TranscoderOutput(new OutputStreamWriter(ostream)); + try { + svgT.transcode(input, output); + } catch (TranscoderException e) { + log.error("could not write svg file :" + e.getMessage(), e); + } + ostream.flush(); + ostream = null; + + svgDocument = null; + svgRoot = null; + currentPageG = null; + lastLink = null; + + totalWidth = 0; + totalHeight = 0; + + pageNumber = 0; + } + + /** + * @see org.apache.fop.render.Renderer#startPageSequence(LineArea) + */ + public void startPageSequence(LineArea seqTitle) { + totalWidth += sequenceWidth; + if (sequenceHeight > totalHeight) { + totalHeight = sequenceHeight; + } + sequenceWidth = 0; + sequenceHeight = 0; + if (seqTitle != null && docTitle == null) { + // convert first title to a string and set for svg document title + docTitle = seqTitle; + String str = convertTitleToString(seqTitle); + Element svgTitle = svgDocument.createElementNS(SVG_NAMESPACE, "title"); + Text strNode = svgDocument.createTextNode(str); + svgTitle.appendChild(strNode); + svgRoot.insertBefore(svgTitle, svgRoot.getFirstChild()); + } + } + + /** + * @see org.apache.fop.render.Renderer#renderPage(PageViewport) + */ + public void renderPage(PageViewport page) throws IOException, FOPException { + float lastWidth = pageWidth; + float lastHeight = pageHeight; + + Rectangle2D area = page.getViewArea(); + pageWidth = (float) area.getWidth() / 1000f; + pageHeight = (float) area.getHeight() / 1000f; + + // if there is a link from the last page + if (lastLink != null) { + lastLink.setAttributeNS(null, "xlink:href", "#svgView(viewBox(" + + totalWidth + ", " + + sequenceHeight + ", " + + pageWidth + ", " + + pageHeight + "))"); + pagesGroup.appendChild(lastLink); + } + + currentPageG = svgDocument.createElementNS(SVG_NAMESPACE, "svg"); + currentPageG.setAttributeNS(null, "viewbox", + "0 0 " + (int) pageWidth + " " + (int) pageHeight); + currentPageG.setAttributeNS(null, "width", + "" + ((int) pageWidth + 1)); + currentPageG.setAttributeNS(null, "height", + "" + ((int) pageHeight + 1)); + currentPageG.setAttributeNS(null, "id", "Page-" + pageNumber); + currentPageG.setAttributeNS(null, "style", "font-family:sanserif;font-size:12"); + pageDefs.appendChild(currentPageG); + + if (pageWidth > sequenceWidth) { + sequenceWidth = pageWidth; + } + sequenceHeight += pageHeight; + + Element border = + SVGUtilities.createRect(svgDocument, 0, 0, pageWidth, + pageHeight); + border.setAttributeNS(null, "style", "fill:none;stroke:black"); + currentPageG.appendChild(border); + + // render the page contents + super.renderPage(page); + + Element use = svgDocument.createElementNS(SVG_NAMESPACE, "use"); + use.setAttributeNS(null, "xlink:href", "#Page-" + pageNumber); + use.setAttributeNS(null, "x", "" + totalWidth); + use.setAttributeNS(null, "y", "" + (sequenceHeight - pageHeight)); + pagesGroup.appendChild(use); + + Element lastPageLink = svgDocument.createElementNS(SVG_NAMESPACE, "a"); + if (lastLink != null) { + lastPageLink.setAttributeNS(null, "xlink:href", lastViewbox); + } else { + lastPageLink.setAttributeNS(null, "xlink:href", + "#svgView(viewBox(" + + totalWidth + ", " + + (sequenceHeight - pageHeight) + ", " + + pageWidth + ", " + + pageHeight + "))"); + } + pagesGroup.appendChild(lastPageLink); + + // setup a link to the next page, only added when the + // next page is rendered + Element rect = SVGUtilities.createRect(svgDocument, totalWidth, + (sequenceHeight - pageHeight), pageWidth / 2, pageHeight); + rect.setAttributeNS(null, "style", "fill:blue;visibility:hidden"); + lastPageLink.appendChild(rect); + + lastLink = svgDocument.createElementNS(SVG_NAMESPACE, "a"); + rect = SVGUtilities.createRect(svgDocument, + totalWidth + pageWidth / 2, + (sequenceHeight - pageHeight), pageWidth / 2, pageHeight); + rect.setAttributeNS(null, "style", "fill:blue;visibility:hidden"); + lastLink.appendChild(rect); + + lastViewbox = "#svgView(viewBox(" + + totalWidth + ", " + + (sequenceHeight - pageHeight) + ", " + + pageWidth + ", " + + pageHeight + "))"; + + pageNumber++; + + } + + /** + * Method renderForeignObject. + * @param fo the foreign object + */ + public void renderForeignObject(ForeignObject fo, Rectangle2D pos) { + org.w3c.dom.Document doc = fo.getDocument(); + String ns = fo.getNameSpace(); + renderXML(context, doc, ns); + } + + /** @see org.apache.fop.render.XMLHandler */ + public void handleXML(RendererContext context, + org.w3c.dom.Document doc, String ns) throws Exception { + if (SVG_NAMESPACE.equals(ns)) { + if (!(doc instanceof SVGDocument)) { + DOMImplementation impl = + SVGDOMImplementation.getDOMImplementation(); + doc = DOMUtilities.deepCloneDocument(doc, impl); + } + SVGSVGElement svg = ((SVGDocument) doc).getRootElement(); + Element view = svgDocument.createElementNS(SVG_NAMESPACE, "svg"); + Node newsvg = svgDocument.importNode(svg, true); + //view.setAttributeNS(null, "viewBox", "0 0 "); + view.setAttributeNS(null, "x", "" + currentIPPosition / 1000f); + view.setAttributeNS(null, "y", "" + currentBPPosition / 1000f); + + // this fixes a problem where the xmlns is repeated sometimes + Element ele = (Element) newsvg; + ele.setAttributeNS(XMLSupport.XMLNS_NAMESPACE_URI, "xmlns", + SVG_NAMESPACE); + if (ele.hasAttributeNS(null, "xmlns")) { + ele.removeAttributeNS(null, "xmlns"); + } + + view.appendChild(newsvg); + currentPageG.appendChild(view); + } + } + + /** + * @see org.apache.fop.render.AbstractRenderer#renderLeader(Leader) + */ + public void renderLeader(Leader area) { + String style = "stroke:black;stroke-width:" + + (area.getRuleThickness() / 1000) + ";"; + switch (area.getRuleStyle()) { + case EN_DOTTED: + style += "stroke-dasharray:1,1"; + break; + case EN_DASHED: + style += "stroke-dasharray:5,1"; + break; + case EN_SOLID: + break; + case EN_DOUBLE: + break; + case EN_GROOVE: + break; + case EN_RIDGE: + break; + } + Element line = SVGUtilities.createLine(svgDocument, + currentIPPosition / 1000, + (currentBPPosition + area.getOffset() + - area.getRuleThickness() / 2) / 1000, + (currentIPPosition + area.getIPD()) / 1000, + (currentBPPosition + area.getOffset() + - area.getRuleThickness() / 2) / 1000); + line.setAttributeNS(null, "style", style); + currentPageG.appendChild(line); + + super.renderLeader(area); + } + + /** + * @see org.apache.fop.render.AbstractRenderer#renderText(TextArea) + */ + public void renderText(TextArea text) { + Element textElement = SVGUtilities.createText(svgDocument, + currentIPPosition / 1000, + (currentBPPosition + text.getOffset() + + text.getBaselineOffset()) / 1000, + text.getText()); + currentPageG.appendChild(textElement); + + super.renderText(text); + } + + /** + * @see org.apache.fop.render.AbstractRenderer#renderCharacter(Character) + */ + public void renderCharacter(org.apache.fop.area.inline.Character ch) { + Element text = SVGUtilities.createText(svgDocument, + currentIPPosition / 1000, + (currentBPPosition + ch.getOffset() + + ch.getBaselineOffset()) / 1000, + "" + ch.getChar()); + currentPageG.appendChild(text); + + super.renderCharacter(ch); + } + + /** @see org.apache.fop.render.AbstractRenderer */ + public String getMimeType() { + return SVG_MIME_TYPE; + } + + /** @see org.apache.fop.render.XMLHandler#getNamespace() */ + public String getNamespace() { + return SVG_NAMESPACE; + } + +} + diff --git a/src/sandbox/org/apache/fop/render/svg/SVGRendererMaker.java b/src/sandbox/org/apache/fop/render/svg/SVGRendererMaker.java new file mode 100644 index 000000000..5dfcd3d03 --- /dev/null +++ b/src/sandbox/org/apache/fop/render/svg/SVGRendererMaker.java @@ -0,0 +1,49 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed 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$ */ + +package org.apache.fop.render.svg; + +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.apps.MimeConstants; +import org.apache.fop.render.AbstractRendererMaker; +import org.apache.fop.render.Renderer; + +/** + * RendererMaker for the SVG Renderer. + */ +public class SVGRendererMaker extends AbstractRendererMaker { + + private static final String[] MIMES = new String[] {MimeConstants.MIME_SVG}; + + + /**@see org.apache.fop.render.AbstractRendererMaker */ + public Renderer makeRenderer(FOUserAgent ua) { + return new SVGRenderer(); + } + + /** @see org.apache.fop.render.AbstractRendererMaker#needsOutputStream() */ + public boolean needsOutputStream() { + return true; + } + + /** @see org.apache.fop.render.AbstractRendererMaker#getSupportedMimeTypes() */ + public String[] getSupportedMimeTypes() { + return MIMES; + } + +} diff --git a/src/sandbox/org/apache/fop/render/svg/package.html b/src/sandbox/org/apache/fop/render/svg/package.html new file mode 100644 index 000000000..7edba8c85 --- /dev/null +++ b/src/sandbox/org/apache/fop/render/svg/package.html @@ -0,0 +1,22 @@ + + + +org.apache.fop.render.svg Package + +

SVG (Structured Vector Graphics) Renderer

+ + \ No newline at end of file -- 2.39.5