
org.docbook.xsltng.extensions.ImageCall Maven / Gradle / Ivy
package org.docbook.xsltng.extensions;
import com.drew.metadata.icc.IccDirectory;
import net.sf.saxon.Configuration;
import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.s9api.Axis;
import net.sf.saxon.s9api.DocumentBuilder;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XdmMap;
import net.sf.saxon.s9api.XdmNode;
import net.sf.saxon.s9api.XdmNodeKind;
import net.sf.saxon.s9api.XdmSequenceIterator;
import org.xml.sax.InputSource;
import javax.xml.transform.sax.SAXSource;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.StringTokenizer;
abstract public class ImageCall extends ExtensionFunctionCall {
private final static String svgNamespace = "http://www.w3.org/2000/svg";
protected DebuggingLogger logger = null;
protected XPathContext context = null;
protected XdmMap map = new XdmMap();
protected void parseImage(String imageUri) {
// What if it's a PDF or an EPS or an SVG?
InputStream stream = null;
try {
URL url = new URL(imageUri);
stream = url.openStream();
BufferedReader ir = new BufferedReader(new InputStreamReader(stream));
String line = ir.readLine();
if (line != null && line.startsWith("%PDF-")) {
// We've got a PDF!
int lineLimit = 100;
while (lineLimit > 0 && line != null) {
lineLimit--;
if (line.startsWith("/CropBox [")) {
line = line.substring(10);
if (line.contains("]")) {
line = line.substring(0, line.indexOf("]"));
}
map = parseBox(map, line);
lineLimit = 0;
} else if (line.startsWith("/MediaBox [")) {
line = line.substring(11);
if (line.contains("]")) {
line = line.substring(0, line.indexOf("]"));
}
map = parseBox(map, line);
// Keep looking in case we get a CropBox
// I think the CropBox is a better bounding box
}
line = ir.readLine();
}
} else if (line != null
&& (line.startsWith(" it = doc.axisIterator(Axis.CHILD);
root == null && it.hasNext(); ) {
XdmNode node = it.next();
if (node.getNodeKind() == XdmNodeKind.ELEMENT) {
root = node;
}
}
if (root != null) {
if (svgNamespace.equals(root.getNodeName().getNamespaceURI())) {
for (XdmSequenceIterator it = root.axisIterator(Axis.ATTRIBUTE); it.hasNext(); ) {
XdmNode attr = it.next();
String name = attr.getNodeName().getClarkName();
String value = attr.getStringValue();
map = parseProperty(map, name, value);
}
}
}
} catch (SaxonApiException sae) {
logger.info("DocBook image properties failed to parse SVG: " + url);
}
} else {
logger.debug(DebuggingLogger.IMAGE_ERRORS, "DocBook image properties failed to find processor to parse SVG");
}
return map;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy