|
|
@@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
* Copyright 2005 The Apache Software Foundation. |
|
|
|
* Copyright 2005-2006 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. |
|
|
@@ -14,10 +14,11 @@ |
|
|
|
* limitations under the License. |
|
|
|
*/ |
|
|
|
|
|
|
|
/* $Id: $ */ |
|
|
|
/* $Id$ */ |
|
|
|
|
|
|
|
package org.apache.fop.apps; |
|
|
|
|
|
|
|
import java.io.ByteArrayInputStream; |
|
|
|
import java.io.File; |
|
|
|
import java.net.MalformedURLException; |
|
|
|
import java.net.URL; |
|
|
@@ -28,6 +29,9 @@ import javax.xml.transform.stream.StreamSource; |
|
|
|
import org.apache.commons.logging.Log; |
|
|
|
import org.apache.commons.logging.LogFactory; |
|
|
|
|
|
|
|
// base64 support for "data" urls |
|
|
|
import org.apache.batik.util.Base64DecodeStream; |
|
|
|
|
|
|
|
/** |
|
|
|
* Provides FOP specific URI resolution. |
|
|
|
* This is the default URIResolver {@link FOUserAgent} will use unless overidden. |
|
|
@@ -70,6 +74,8 @@ public class FOURIResolver |
|
|
|
} catch (MalformedURLException mfue) { |
|
|
|
log.error("Could not convert filename to URL: " + mfue.getMessage(), mfue); |
|
|
|
} |
|
|
|
} else if (href.startsWith("data:")) { |
|
|
|
return parseDataURI(href); |
|
|
|
} else { |
|
|
|
URL baseURL = toBaseURL(base); |
|
|
|
if (baseURL == null) { |
|
|
@@ -151,5 +157,25 @@ public class FOURIResolver |
|
|
|
} |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Parses inline data URIs as generated by MS Word's XML export and FO stylesheet. |
|
|
|
* @see <a href="http://www.ietf.org/rfc/rfc2397">RFC 2397</a> |
|
|
|
*/ |
|
|
|
private Source parseDataURI(String href) { |
|
|
|
int commaPos = href.indexOf(','); |
|
|
|
// header is of the form data:[<mediatype>][;base64] |
|
|
|
String header = href.substring(0, commaPos); |
|
|
|
String data = href.substring(commaPos + 1); |
|
|
|
if (header.endsWith(";base64")) { |
|
|
|
byte[] bytes = data.getBytes(); |
|
|
|
ByteArrayInputStream encodedStream = new ByteArrayInputStream(bytes); |
|
|
|
Base64DecodeStream decodedStream = new Base64DecodeStream(encodedStream); |
|
|
|
return new StreamSource(decodedStream); |
|
|
|
} else { |
|
|
|
//Note that this is not quite the full story here. But since we are only interested |
|
|
|
//in base64-encoded binary data, the next line will probably never be called. |
|
|
|
return new StreamSource(new java.io.StringReader(data)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |