All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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