package org.docx4j.openpackaging.io; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Map; import java.util.TreeMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.docx4j.openpackaging.contenttype.ContentTypes; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.parts.ExternalTarget; import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPart; import org.docx4j.openpackaging.parts.WordprocessingML.ImageBmpPart; import org.docx4j.openpackaging.parts.WordprocessingML.ImageGifPart; import org.docx4j.openpackaging.parts.WordprocessingML.ImageJpegPart; import org.docx4j.openpackaging.parts.WordprocessingML.ImagePngPart; import org.docx4j.openpackaging.parts.WordprocessingML.ImageTiffPart; import org.docx4j.openpackaging.parts.WordprocessingML.MetafileEmfPart; import org.docx4j.openpackaging.parts.WordprocessingML.MetafileWmfPart; public class ExternalResourceUtils { /* This was removed from Load and placed in a separate class, * so that Load can load, even if the VFS jar is not present. */ private static Logger log = LoggerFactory.getLogger(ExternalResourceUtils.class); protected static final Map<String, String> CONTENT_TYPE_MAP = new TreeMap<String, String>(); static { CONTENT_TYPE_MAP.put(ContentTypes.EXTENSION_BMP, ContentTypes.IMAGE_BMP); CONTENT_TYPE_MAP.put(ContentTypes.EXTENSION_EMF, ContentTypes.IMAGE_EMF); CONTENT_TYPE_MAP.put(ContentTypes.EXTENSION_GIF, ContentTypes.IMAGE_GIF); CONTENT_TYPE_MAP.put(ContentTypes.EXTENSION_JPG_1, ContentTypes.IMAGE_JPEG); CONTENT_TYPE_MAP.put(ContentTypes.EXTENSION_JPG_2, ContentTypes.IMAGE_JPEG); CONTENT_TYPE_MAP.put(ContentTypes.EXTENSION_PNG, ContentTypes.IMAGE_PNG); CONTENT_TYPE_MAP.put(ContentTypes.EXTENSION_TIFF, ContentTypes.IMAGE_TIFF); CONTENT_TYPE_MAP.put("tif", ContentTypes.IMAGE_TIFF); CONTENT_TYPE_MAP.put(ContentTypes.EXTENSION_WMF, ContentTypes.IMAGE_WMF); } public static BinaryPart getExternalResource(String absoluteTarget) throws Docx4JException { URI targetURI = null; URL targetURL = null; int p = absoluteTarget.lastIndexOf('.'); String fileExtension = (p > -1 ? absoluteTarget.substring(p+1).toLowerCase() : null); String contentType = (fileExtension != null ? CONTENT_TYPE_MAP.get(fileExtension) : null); BinaryPart binaryPart = null; InputStream inStream = null; try { targetURI = new URI(absoluteTarget.replace('\\', '/')); } catch (URISyntaxException use) { throw new Docx4JException("Invalid absolute Target: '" + absoluteTarget + "'", use); } try { targetURL = targetURI.toURL(); } catch (MalformedURLException mue) { throw new Docx4JException("Invalid absolute Target: '" + absoluteTarget + "'", mue); } try { inStream = targetURL.openStream(); binaryPart = createBinaryPart(absoluteTarget, contentType); binaryPart.setBinaryData(inStream); } catch (IOException ioe) { throw new Docx4JException("Could not load external resource: '" + absoluteTarget + "'", ioe); } return binaryPart; } protected static BinaryPart createBinaryPart(String absoluteTarget, String contentType) { ExternalTarget externalTarget = new ExternalTarget(absoluteTarget); BinaryPart ret = null; if (ContentTypes.IMAGE_JPEG.equals(contentType)) ret = new ImageJpegPart(externalTarget); else if (ContentTypes.IMAGE_PNG.equals(contentType)) ret = new ImagePngPart(externalTarget); else if (ContentTypes.IMAGE_GIF.equals(contentType)) ret = new ImageGifPart(externalTarget); else if (ContentTypes.IMAGE_TIFF.equals(contentType)) ret = new ImageTiffPart(externalTarget); else if (ContentTypes.IMAGE_BMP.equals(contentType)) ret = new ImageBmpPart(externalTarget); else if (ContentTypes.IMAGE_EMF.equals(contentType)) ret = new MetafileEmfPart(externalTarget); else if (ContentTypes.IMAGE_WMF.equals(contentType)) ret = new MetafileWmfPart(externalTarget); else ret = new BinaryPart(externalTarget); return ret; } }