소스 검색

FOP-2473: SVG text using filters not shown

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1695041 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-2_1
Simon Steiner 8 년 전
부모
커밋
eb8f9e82d2

+ 2
- 1
src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java 파일 보기

@@ -49,6 +49,7 @@ import org.apache.fop.render.ImageHandler;
import org.apache.fop.render.ImageHandlerUtil;
import org.apache.fop.render.RenderingContext;
import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
import org.apache.fop.render.ps.PSImageHandlerSVG;
import org.apache.fop.svg.PDFAElementBridge;
import org.apache.fop.svg.PDFBridgeContext;
import org.apache.fop.svg.PDFGraphics2D;
@@ -85,7 +86,7 @@ public class PDFImageHandlerSVG implements ImageHandler {
GVTBuilder builder = new GVTBuilder();

//Controls whether text painted by Batik is generated using text or path operations
boolean strokeText = false;
boolean strokeText = PSImageHandlerSVG.shouldStrokeText(imageSVG.getDocument().getChildNodes());
//TODO connect with configuration elsewhere.

BridgeContext ctx = new PDFBridgeContext(ua,

+ 14
- 1
src/java/org/apache/fop/render/ps/PSImageHandlerSVG.java 파일 보기

@@ -103,7 +103,7 @@ public class PSImageHandlerSVG implements ImageHandler {
PSImageUtils.writeImage(encoder, imgDim, imgDescription, targetRect, cm, gen, ri, mi.getMaskColor());
} else {
//Controls whether text painted by Batik is generated using text or path operations
boolean strokeText = false;
boolean strokeText = shouldStrokeText(imageSVG.getDocument().getChildNodes());
//TODO Configure text stroking

SVGUserAgent ua = new SVGUserAgent(context.getUserAgent(),
@@ -327,6 +327,19 @@ public class PSImageHandlerSVG implements ImageHandler {
return opacityFound;
}

public static boolean shouldStrokeText(NodeList childNodes) {
for (int i = 0; i < childNodes.getLength(); i++) {
Node curNode = childNodes.item(i);
if (shouldStrokeText(curNode.getChildNodes())) {
return true;
}
if ("text".equals(curNode.getLocalName())) {
return curNode.getAttributes().getNamedItem("filter") != null;
}
}
return false;
}

/** {@inheritDoc} */
public int getPriority() {
return 400;

+ 33
- 0
test/java/org/apache/fop/render/ps/ImageHandlingTestCase.java 파일 보기

@@ -18,18 +18,27 @@
/* $Id$ */

package org.apache.fop.render.ps;

import java.awt.Rectangle;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.junit.Test;

import org.w3c.dom.Document;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import org.apache.commons.io.IOUtils;

import org.apache.batik.anim.dom.SAXSVGDocumentFactory;

import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
import org.apache.xmlgraphics.ps.DSCConstants;
import org.apache.xmlgraphics.ps.PSGenerator;
import org.apache.xmlgraphics.ps.PSResource;
import org.apache.xmlgraphics.ps.dsc.DSCException;
import org.apache.xmlgraphics.ps.dsc.DSCParser;
@@ -39,6 +48,8 @@ import org.apache.xmlgraphics.ps.dsc.events.DSCCommentTitle;
import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;

import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.render.intermediate.IFContext;

/**
@@ -159,4 +170,26 @@ public class ImageHandlingTestCase extends AbstractPostScriptTest {
return sb.toString();
}

@Test
public void testPSImageHandlerSVG() throws IOException {
FOUserAgent ua = FopFactory.newInstance(new File(".").toURI()).newFOUserAgent();
String svg = "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\" "
+ "width=\"210mm\" height=\"297mm\" font-size=\"20\" stroke-width=\"0.1mm\" font-family=\"Arial\">\n"
+ " <filter id=\"drop-shadow-font\" width=\"150%\" height=\"150%\">\n"
+ " <feGaussianBlur in=\"SourceAlpha\" result=\"blur\" stdDeviation=\"1\"/>\n"
+ " <feOffset in=\"blur\" result=\"offsetBlur\" dy=\"1\" dx=\"1\"/>\n"
+ " <feBlend in=\"SourceGraphic\" in2=\"offsetBlur\" mode=\"normal\"/>\n"
+ " </filter>\n"
+ " <text x=\"4.9mm\" filter=\"url(#drop-shadow-font)\" y=\"10.5mm\" fill=\"black\" "
+ "rotate=\"30 30 0 15\">Hello SVG with FOP</text>\n"
+ "</svg>";
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(null);
Document doc = factory.createDocument(null, IOUtils.toInputStream(svg));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
new PSImageHandlerSVG().handleImage(
new PSRenderingContext(ua, new PSGenerator(bos), new FontInfo()),
new ImageXMLDOM(null, doc, ""),
new Rectangle());
assertTrue(bos.toString().contains("/DataSource Data"));
}
}

Loading…
취소
저장