| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* $Id$ */ |
| |
| package org.apache.fop.render.mif; |
| |
| import java.io.IOException; |
| import java.io.OutputStream; |
| |
| import org.xml.sax.SAXException; |
| |
| 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.FOText; |
| import org.apache.fop.fo.flow.BasicLink; |
| import org.apache.fop.fo.flow.Block; |
| import org.apache.fop.fo.flow.Character; |
| 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.Inline; |
| import org.apache.fop.fo.flow.InstreamForeignObject; |
| 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.ListItemBody; |
| import org.apache.fop.fo.flow.ListItemLabel; |
| import org.apache.fop.fo.flow.PageNumber; |
| import org.apache.fop.fo.flow.table.Table; |
| import org.apache.fop.fo.flow.table.TableBody; |
| import org.apache.fop.fo.flow.table.TableCell; |
| import org.apache.fop.fo.flow.table.TableColumn; |
| import org.apache.fop.fo.flow.table.TableFooter; |
| import org.apache.fop.fo.flow.table.TableHeader; |
| import org.apache.fop.fo.flow.table.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.fo.pagination.StaticContent; |
| import org.apache.fop.fonts.FontSetup; |
| import org.apache.fop.render.DefaultFontResolver; |
| |
| // 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; |
| boolean base14Kerning = false; //TODO - FIXME |
| FontSetup.setup(fontInfo, null, new DefaultFontResolver(ua), base14Kerning); |
| } |
| |
| /** {@inheritDoc} */ |
| 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); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| 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); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| 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); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| public void endPageSequence(PageSequence pageSeq) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startFlow(Flow fl) { |
| // start text flow in body region |
| textFlow = new MIFElement("TextFlow"); |
| } |
| |
| /** {@inheritDoc} */ |
| public void endFlow(Flow fl) { |
| textFlow.finish(true); |
| mifFile.addElement(textFlow); |
| textFlow = null; |
| } |
| |
| /** {@inheritDoc} */ |
| public void startBlock(Block bl) { |
| para = new MIFElement("Para"); |
| // get font |
| textFlow.addElement(para); |
| } |
| |
| /** {@inheritDoc} */ |
| public void endBlock(Block bl) { |
| para.finish(true); |
| para = null; |
| } |
| |
| /** {@inheritDoc} */ |
| public void startInline(Inline inl) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endInline(Inline inl) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startTable(Table tbl) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endTable(Table tbl) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startColumn(TableColumn tc) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endColumn(TableColumn tc) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startHeader(TableHeader th) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endHeader(TableHeader th) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startFooter(TableFooter tf) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endFooter(TableFooter tf) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startBody(TableBody tb) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endBody(TableBody tb) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startRow(TableRow tr) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endRow(TableRow tr) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startCell(TableCell tc) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endCell(TableCell tc) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startList(ListBlock lb) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endList(ListBlock lb) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startListItem(ListItem li) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endListItem(ListItem li) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startListLabel(ListItemLabel listItemLabel) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endListLabel(ListItemLabel listItemLabel) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startListBody(ListItemBody listItemBody) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endListBody(ListItemBody listItemBody) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startStatic(StaticContent staticContent) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endStatic(StaticContent staticContent) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startMarkup() { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endMarkup() { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startLink(BasicLink basicLink) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endLink(BasicLink basicLink) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void image(ExternalGraphic eg) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void pageRef() { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startInstreamForeignObject(InstreamForeignObject ifo) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endInstreamForeignObject(InstreamForeignObject ifo) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startFootnote(Footnote footnote) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endFootnote(Footnote footnote) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startFootnoteBody(FootnoteBody body) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endFootnoteBody(FootnoteBody body) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void startLeader(Leader l) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endLeader(Leader l) { |
| } |
| |
| public void character(Character c) { |
| appendCharacters ( new String ( new char[] {c.getCharacter()} ) ); |
| } |
| |
| /** {@inheritDoc} */ |
| public void characters(FOText foText) { |
| appendCharacters ( foText.getCharSequence().toString() ); |
| } |
| |
| /** {@inheritDoc} */ |
| public void startPageNumber(PageNumber pagenum) { |
| } |
| |
| /** {@inheritDoc} */ |
| public void endPageNumber(PageNumber pagenum) { |
| } |
| |
| private void appendCharacters ( String str ) { |
| if (para != null) { |
| 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); |
| } |
| } |
| } |
| |