keiron 01/07/24 02:08:45 Modified: src/org/apache/fop/render/pdf PDFRenderer.java src/org/apache/fop/svg PDFDocumentGraphics2D.java PDFTranscoder.java Added: src/org/apache/fop/svg PDFAElementBridge.java PDFANode.java Log: added the start of svg linking also improved a few text things Revision Changes Path 1.74 +4 -1 xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java Index: PDFRenderer.java =================================================================== RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java,v retrieving revision 1.73 retrieving revision 1.74 diff -u -r1.73 -r1.74 --- PDFRenderer.java 2001/07/20 20:57:22 1.73 +++ PDFRenderer.java 2001/07/24 09:08:45 1.74 @@ -1,4 +1,4 @@ -/* $Id: PDFRenderer.java,v 1.73 2001/07/20 20:57:22 klease Exp $ +/* $Id: PDFRenderer.java,v 1.74 2001/07/24 09:08:45 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources." @@ -391,6 +391,8 @@ GVTBuilder builder = new GVTBuilder(); GraphicsNodeRenderContext rc = getRenderContext(fs); BridgeContext ctx = new BridgeContext(userAgent, rc); + PDFAElementBridge aBridge = new PDFAElementBridge(); + ctx.putBridge(aBridge); GraphicsNode root; PDFGraphics2D graphics = new PDFGraphics2D(true, fs, pdfDoc, @@ -399,6 +401,7 @@ graphics.setGraphicContext( new org.apache.batik.ext.awt.g2d.GraphicContext()); graphics.setRenderingHints(rc.getRenderingHints()); + aBridge.setPDFGraphics2D(graphics); try { root = builder.build(ctx, doc); root.paint(graphics, rc); 1.8 +32 -7 xml-fop/src/org/apache/fop/svg/PDFDocumentGraphics2D.java Index: PDFDocumentGraphics2D.java =================================================================== RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFDocumentGraphics2D.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- PDFDocumentGraphics2D.java 2001/07/10 11:59:23 1.7 +++ PDFDocumentGraphics2D.java 2001/07/24 09:08:45 1.8 @@ -1,4 +1,4 @@ -/* $Id: PDFDocumentGraphics2D.java,v 1.7 2001/07/10 11:59:23 keiron Exp $ +/* $Id: PDFDocumentGraphics2D.java,v 1.8 2001/07/24 09:08:45 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. @@ -16,6 +16,9 @@ import java.awt.Font; import java.awt.Image; import java.awt.Color; +import java.awt.Shape; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; import java.io.OutputStream; import java.io.IOException; @@ -27,7 +30,7 @@ * <tt>PDFGraphics2D</tt>. * * @author <a href="mailto:[EMAIL PROTECTED]">Keiron Liddle</a> - * @version $Id: PDFDocumentGraphics2D.java,v 1.7 2001/07/10 11:59:23 keiron Exp $ + * @version $Id: PDFDocumentGraphics2D.java,v 1.8 2001/07/24 09:08:45 keiron Exp $ * @see org.apache.fop.svg.PDFGraphics2D */ public class PDFDocumentGraphics2D extends PDFGraphics2D { @@ -55,12 +58,13 @@ OutputStream stream, int width, int height) { super(textAsShapes); - if(!textAsShapes) { + if (!textAsShapes) { fontInfo = new FontInfo(); FontSetup.setup(fontInfo); try { - fontState = new FontState(fontInfo, "Helvetica", "normal", "normal", 12, 0); - } catch(FOPException e) { + fontState = new FontState(fontInfo, "Helvetica", "normal", + "normal", 12, 0); + } catch (FOPException e) { } } standalone = true; @@ -80,6 +84,14 @@ } + public FontState getFontState() { + return fontState; + } + + public PDFDocument getPDFDocument() { + return this.pdfDoc; + } + /** * Set the dimensions of the svg document that will be drawn. * This is useful if the dimensions of the svg document are different @@ -87,7 +99,8 @@ * The result is scaled so that the svg fits correctly inside the pdf document. */ public void setSVGDimension(float w, float h) { - currentStream.write("" + PDFNumber.doubleOut(width / w) + " 0 0 " + PDFNumber.doubleOut(height / h) + " 0 0 cm\n"); + currentStream.write("" + PDFNumber.doubleOut(width / w) + + " 0 0 " + PDFNumber.doubleOut(height / h) + " 0 0 cm\n"); } /** @@ -119,7 +132,7 @@ PDFPage currentPage = this.pdfDoc.makePage(pdfResources, pdfStream, width, height, null); - if(fontInfo != null) { + if (fontInfo != null) { FontSetup.addToResources(this.pdfDoc, fontInfo); } this.pdfDoc.output(stream); @@ -147,4 +160,16 @@ return new PDFDocumentGraphics2D(this); } + public void drawString(String s, float x, float y) { + if (super.textAsShapes) { + Font font = super.getFont(); + FontRenderContext frc = super.getFontRenderContext(); + GlyphVector gv = font.createGlyphVector(frc, s); + Shape glyphOutline = gv.getOutline(x, y); + super.fill(glyphOutline); + } else { + super.drawString(s, x, y); + } + } } + 1.6 +45 -18 xml-fop/src/org/apache/fop/svg/PDFTranscoder.java Index: PDFTranscoder.java =================================================================== RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFTranscoder.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- PDFTranscoder.java 2001/06/19 09:40:15 1.5 +++ PDFTranscoder.java 2001/07/24 09:08:45 1.6 @@ -1,7 +1,7 @@ -/* $Id: PDFTranscoder.java,v 1.5 2001/06/19 09:40:15 keiron Exp $ +/* $Id: PDFTranscoder.java,v 1.6 2001/07/24 09:08:45 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the - * LICENSE file included with these sources." + * LICENSE file included with these sources. */ package org.apache.fop.svg; @@ -86,6 +86,7 @@ import org.w3c.dom.svg.SVGLength; import org.apache.fop.svg.*; +import org.apache.fop.pdf.*; import org.w3c.dom.DOMException; import org.w3c.dom.DOMImplementation; @@ -122,10 +123,13 @@ * millimeter conversion factor. * * @author <a href="mailto:[EMAIL PROTECTED]">Keiron Liddle</a> - * @version $Id: PDFTranscoder.java,v 1.5 2001/06/19 09:40:15 keiron Exp $ + * @version $Id: PDFTranscoder.java,v 1.6 2001/07/24 09:08:45 keiron Exp $ */ public class PDFTranscoder extends XMLAbstractTranscoder { + public static final TranscodingHints.Key KEY_STROKE_TEXT = + new StringKey(); + /** The user agent dedicated to an <tt>ImageTranscoder</tt>. */ protected UserAgent userAgent = new ImageTranscoderUserAgent(); @@ -164,11 +168,18 @@ svgCtx.setPixelToMM(userAgent.getPixelToMM()); ((SVGOMDocument) document).setSVGContext(svgCtx); + boolean stroke = true; + if (hints.containsKey(KEY_STROKE_TEXT)) { + stroke = ((Boolean) hints.get(KEY_STROKE_TEXT)).booleanValue(); + } + // build the GVT tree GVTBuilder builder = new GVTBuilder(); ImageRendererFactory rendFactory = new StaticRendererFactory(); - GraphicsNodeRenderContext rc = getRenderContext(); + GraphicsNodeRenderContext rc = getRenderContext(stroke); BridgeContext ctx = new BridgeContext(userAgent, rc); + PDFAElementBridge pdfAElementBridge = new PDFAElementBridge(); + ctx.putBridge(pdfAElementBridge); GraphicsNode gvtRoot; try { gvtRoot = builder.build(ctx, svgDoc); @@ -184,11 +195,13 @@ // compute the image's width and height according the hints float imgWidth = -1; if (hints.containsKey(ImageTranscoder.KEY_WIDTH)) { - imgWidth = ((Float) hints.get(ImageTranscoder.KEY_WIDTH)).floatValue(); + imgWidth = ((Float) hints.get(ImageTranscoder.KEY_WIDTH)). + floatValue(); } float imgHeight = -1; if (hints.containsKey(ImageTranscoder.KEY_HEIGHT)) { - imgHeight = ((Float) hints.get(ImageTranscoder.KEY_HEIGHT)).floatValue(); + imgHeight = ((Float) hints.get(ImageTranscoder.KEY_HEIGHT)). + floatValue(); } float width, height; if (imgWidth > 0 && imgHeight > 0) { @@ -229,7 +242,8 @@ } // take the AOI into account if any if (hints.containsKey(ImageTranscoder.KEY_AOI)) { - Rectangle2D aoi = (Rectangle2D) hints.get(ImageTranscoder.KEY_AOI); + Rectangle2D aoi = + (Rectangle2D) hints.get(ImageTranscoder.KEY_AOI); // transform the AOI into the image's coordinate system aoi = Px.createTransformedShape(aoi).getBounds2D(); AffineTransform Mx = new AffineTransform(); @@ -247,13 +261,21 @@ int w = (int) width; int h = (int) height; - PDFDocumentGraphics2D graphics = new PDFDocumentGraphics2D(true, + PDFDocumentGraphics2D graphics = new PDFDocumentGraphics2D(stroke, output.getOutputStream(), w, h); graphics.setSVGDimension(docWidth, docHeight); + + if (!stroke) { + TextPainter textPainter = null; + textPainter = new PDFTextPainter(graphics.getFontState()); + rc.setTextPainter(textPainter); + } + + pdfAElementBridge.setPDFGraphics2D(graphics); if (hints.containsKey(ImageTranscoder.KEY_BACKGROUND_COLOR)) { - graphics.setBackgroundColor((Color) hints.get(ImageTranscoder.KEY_BACKGROUND_COLOR)); + graphics.setBackgroundColor( (Color) hints.get( + ImageTranscoder.KEY_BACKGROUND_COLOR)); } - // GraphicsNodeRenderContext rc = getRenderContext(); graphics.setGraphicContext( new org.apache.batik.ext.awt.g2d.GraphicContext()); graphics.setRenderingHints(rc.getRenderingHints()); @@ -268,7 +290,7 @@ } } - public GraphicsNodeRenderContext getRenderContext() { + public GraphicsNodeRenderContext getRenderContext(boolean stroke) { GraphicsNodeRenderContext nodeRenderContext = null; if (nodeRenderContext == null) { RenderingHints hints = new RenderingHints(null); @@ -282,7 +304,8 @@ new FontRenderContext(new AffineTransform(), true, true); - TextPainter textPainter = new StrokingTextPainter(); + TextPainter textPainter = null; + textPainter = new StrokingTextPainter(); GraphicsNodeRableFactory gnrFactory = new ConcreteGraphicsNodeRableFactory(); @@ -290,7 +313,6 @@ nodeRenderContext = new GraphicsNodeRenderContext( new AffineTransform(), null, hints, fontRenderContext, textPainter, gnrFactory); - nodeRenderContext.setTextPainter(textPainter); } return nodeRenderContext; @@ -364,7 +386,8 @@ * <tt>TranscodingHints</tt> or 0.3528 if any. */ public float getPixelToMM() { - if (getTranscodingHints().containsKey(ImageTranscoder.KEY_PIXEL_TO_MM)) { + if (getTranscodingHints().containsKey( + ImageTranscoder.KEY_PIXEL_TO_MM)) { return ( (Float) getTranscodingHints().get( ImageTranscoder.KEY_PIXEL_TO_MM)).floatValue(); } else { @@ -378,8 +401,10 @@ * <tt>TranscodingHints</tt> or "en" (english) if any. */ public String getLanguages() { - if (getTranscodingHints().containsKey(ImageTranscoder.KEY_LANGUAGE)) { - return (String) getTranscodingHints().get(ImageTranscoder.KEY_LANGUAGE); + if (getTranscodingHints().containsKey( + ImageTranscoder.KEY_LANGUAGE)) { + return (String) getTranscodingHints().get( + ImageTranscoder.KEY_LANGUAGE); } else { return "en"; } @@ -398,8 +423,10 @@ * Returns the XML parser to use from the TranscodingHints. */ public String getXMLParserClassName() { - if (getTranscodingHints().containsKey(KEY_XML_PARSER_CLASSNAME)) { - return (String)getTranscodingHints().get(KEY_XML_PARSER_CLASSNAME); + if (getTranscodingHints().containsKey( + KEY_XML_PARSER_CLASSNAME)) { + return (String) getTranscodingHints().get( + KEY_XML_PARSER_CLASSNAME); } else { return XMLResourceDescriptor.getXMLParserClassName(); } 1.1 xml-fop/src/org/apache/fop/svg/PDFAElementBridge.java Index: PDFAElementBridge.java =================================================================== /* $Id: PDFAElementBridge.java,v 1.1 2001/07/24 09:08:45 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. */ package org.apache.fop.svg; import java.awt.Cursor; import org.apache.batik.bridge.*; import org.apache.batik.css.HiddenChildElementSupport; import org.apache.batik.gvt.CompositeGraphicsNode; import org.apache.batik.gvt.GraphicsNode; import org.apache.fop.pdf.*; import org.w3c.dom.Element; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; import org.w3c.dom.svg.SVGAElement; /** * Bridge class for the <a> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Keiron Liddle</a> */ public class PDFAElementBridge extends AbstractGraphicsNodeBridge { PDFGraphics2D pdfDoc; /** * Constructs a new bridge for the <a> element. */ public PDFAElementBridge() {} public void setPDFGraphics2D(PDFGraphics2D doc) { this.pdfDoc = doc; } /** * Returns 'a'. */ public String getLocalName() { return SVG_A_TAG; } /** * Creates a <tt>CompositeGraphicsNode</tt>. */ protected GraphicsNode instantiateGraphicsNode() { return new PDFANode(); } /** * Builds using the specified BridgeContext and element, the * specified graphics node. * * @param ctx the bridge context to use * @param e the element that describes the graphics node to build * @param node the graphics node to build */ public GraphicsNode createGraphicsNode(BridgeContext ctx, Element e) { PDFANode aNode = (PDFANode) super.createGraphicsNode(ctx, e); return aNode; } /** * Returns true as the <a> element is a container. */ public boolean isComposite() { return true; } } 1.1 xml-fop/src/org/apache/fop/svg/PDFANode.java Index: PDFANode.java =================================================================== /* $Id: PDFANode.java,v 1.1 2001/07/24 09:08:45 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. */ package org.apache.fop.svg; import org.apache.batik.gvt.*; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.Rectangle2D; import java.awt.geom.Point2D; import java.awt.geom.Dimension2D; /** * A graphics node that represents an image described as a graphics node. * * @author <a href="mailto:[EMAIL PROTECTED]">Keiron Liddle</a> */ public class PDFANode extends CompositeGraphicsNode { /** * Constructs a new empty <tt>PDFANode</tt>. */ public PDFANode() {} /** * Paints this node if visible. * * @param g2d the Graphics2D to use * @param rc the GraphicsNodeRenderContext to use */ public void paint(Graphics2D g2d, GraphicsNodeRenderContext rc) { if (isVisible) { super.paint(g2d, rc); } } // // Properties methods // } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]