From: <fg...@us...> - 2010-02-20 18:14:51
|
Revision: 2016 http://openutils.svn.sourceforge.net/openutils/?rev=2016&view=rev Author: fgiust Date: 2010-02-20 18:14:39 +0000 (Sat, 20 Feb 2010) Log Message: ----------- MEDIA-89 Create thumbnail for pdf documents Modified Paths: -------------- trunk/openutils-mgnlmedia/pom.xml trunk/openutils-mgnlmedia/src/main/assembly/assembly-bundle.xml trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/BaseTypeHandler.java trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/DocumentTypeHandler.java trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_en.properties trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_it.properties Modified: trunk/openutils-mgnlmedia/pom.xml =================================================================== --- trunk/openutils-mgnlmedia/pom.xml 2010-02-20 18:10:43 UTC (rev 2015) +++ trunk/openutils-mgnlmedia/pom.xml 2010-02-20 18:14:39 UTC (rev 2016) @@ -1,4 +1,5 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <groupId>net.sourceforge.openutils</groupId> <artifactId>openutils-parent</artifactId> @@ -118,6 +119,17 @@ <scope>provided</scope> </dependency> <dependency> + <groupId>org.apache.pdfbox</groupId> + <artifactId>pdfbox</artifactId> + <version>1.0.0</version> + <exclusions> + <exclusion> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <classifier>jdk15</classifier> @@ -147,4 +159,4 @@ <properties> <magnolia.version>4.2.3</magnolia.version> </properties> -</project> +</project> \ No newline at end of file Modified: trunk/openutils-mgnlmedia/src/main/assembly/assembly-bundle.xml =================================================================== --- trunk/openutils-mgnlmedia/src/main/assembly/assembly-bundle.xml 2010-02-20 18:10:43 UTC (rev 2015) +++ trunk/openutils-mgnlmedia/src/main/assembly/assembly-bundle.xml 2010-02-20 18:14:39 UTC (rev 2016) @@ -30,6 +30,7 @@ <include>com.drewnoakes:metadata-extractor</include> <include>net.sourceforge.openutils:*</include> <include>com.google.collections:*</include> + <include>org.apache.pdfbox:*</include> </includes> </dependencySet> </dependencySets> Modified: trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/BaseTypeHandler.java =================================================================== --- trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/BaseTypeHandler.java 2010-02-20 18:10:43 UTC (rev 2015) +++ trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/BaseTypeHandler.java 2010-02-20 18:14:39 UTC (rev 2016) @@ -360,13 +360,21 @@ } } - addToInfo(media, info, METADATA_WIDTH); - addToInfo(media, info, METADATA_HEIGHT); - addToInfo(media, info, METADATA_BITDEPTH); + Collection<NodeData> propertyList = media.getNodeDataCollection("media_*"); + for (NodeData property : propertyList) + { + addToInfo(media, info, property.getName()); + } return info; } + /** + * Adds a new metadata to the map, converting an existing nodedata + * @param media main media node + * @param info map containing metadata keys/values + * @param key nodedata name + */ protected void addToInfo(Content media, Map<String, String> info, String key) { NodeData data = media.getNodeData(key); Modified: trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/DocumentTypeHandler.java =================================================================== --- trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/DocumentTypeHandler.java 2010-02-20 18:10:43 UTC (rev 2015) +++ trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/DocumentTypeHandler.java 2010-02-20 18:14:39 UTC (rev 2016) @@ -18,12 +18,38 @@ */ package net.sourceforge.openutils.mgnlmedia.media.types.impl; +import info.magnolia.cms.beans.runtime.Document; +import info.magnolia.cms.beans.runtime.FileProperties; import info.magnolia.cms.core.Content; +import info.magnolia.cms.core.NodeData; +import info.magnolia.cms.util.NodeDataUtil; +import info.magnolia.module.admininterface.SaveHandlerImpl; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.util.Collections; +import java.util.List; +import javax.imageio.ImageIO; +import javax.jcr.PropertyType; +import javax.jcr.RepositoryException; +import net.sourceforge.openutils.mgnlmedia.media.configuration.MediaConfigurationManager; +import net.sourceforge.openutils.mgnlmedia.media.utils.ImageUtils; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.pdfbox.exceptions.WrappedIOException; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + /** + * Type handler for generic "document" handling (pdf files). * @author dschivo * @version $Id$ */ @@ -31,11 +57,47 @@ { /** + * Nodedata name where preview media content is saved + */ + public static final String PREVIEW_NODEDATA_NAME = "image"; + + /** + * metadata containing the number of pages + */ + private static final String METADATA_PAGES = "media_pages"; + + /** + * Logger. + */ + private Logger log = LoggerFactory.getLogger(DocumentTypeHandler.class); + + /** * {@inheritDoc} */ public String getThumbnailUrl(Content media) { - return "/.resources/media/icons/thumb-document.png"; + try + { + // check if a thumbnail has been generated + if (media == null + || !media.hasNodeData(PREVIEW_NODEDATA_NAME) + || !ImageUtils.checkOrCreateResolution(media, "thumbnail", PREVIEW_NODEDATA_NAME)) + { + return "/.resources/media/icons/thumb-document.png"; + } + } + catch (RepositoryException e) + { + return "/.resources/media/icons/thumb-document.png"; + } + + return MediaConfigurationManager.getInstance().getURIMappingPrefix() + + media.getHandle() + + "/resolutions/thumbnail/" + + media.getName() + + "." + + ImageUtils.getExtension(media, "thumbnail"); + } /** @@ -47,4 +109,132 @@ return getUrl(media, Collections.<String, String> emptyMap()); } + /** + * {@inheritDoc} + */ + @Override + public boolean onPostSave(Content media) + { + + NodeData data = getOriginalFileNodeData(media); + if (data.getType() == PropertyType.BINARY) + { + + if (StringUtils.equalsIgnoreCase(data.getAttribute(FileProperties.EXTENSION), "pdf")) + { + + String filename = data.getAttribute(FileProperties.PROPERTY_FILENAME) + ".png"; + + InputStream stream = data.getStream(); + try + { + createPdfPreview(media, stream, filename); + } + finally + { + IOUtils.closeQuietly(stream); + } + } + + } + + return super.onPostSave(media); + } + + /** + * Automatically create a thumbnail from the pdf. + * @param media main media node + * @param stream inputStream for the original pdf + * @param filename original filename + */ + protected void createPdfPreview(Content media, InputStream stream, String filename) + { + + PDDocument document = null; + try + { + + document = PDDocument.load(stream); + + List<PDPage> pages = document.getDocumentCatalog().getAllPages(); + + NodeDataUtil.getOrCreateAndSet(media, METADATA_PAGES, document.getNumberOfPages()); + + if (!pages.isEmpty()) + { + + PDPage page = pages.get(0); + + java.awt.image.BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_ARGB, 36); + + File file = File.createTempFile(filename, ".png"); + ImageIO.write(image, "png", file); + + copyPreviewImageToRepository(media, file, filename); + + media.save(); + + file.delete(); + } + } + catch (NoClassDefFoundError e) + { + log.warn("Apache pdfbox 1.0.0 not available, not generating preview for pdf document"); + } + catch (WrappedIOException e) + { + if (e.getCause() instanceof ClassCastException) + { + log.warn("Two conflicting versions of pdfbox are loaded, only one pdfbox jar version 1.x must be loaded in order to make thumbnail generation work. " + + "Not generating preview for pdf document"); + } + else + { + log.error("Error creating preview for " + media.getHandle(), e); + } + } + catch (Throwable e) + { + log.error("Error creating preview for " + media.getHandle(), e); + } + finally + { + if (document != null) + { + try + { + document.close(); + } + catch (IOException e) + { + // ignore + } + } + } + } + + /** + * Copy a preview image to a nodedata. + * @param media main media node + * @param file File to be copied + * @param filename filename + */ + protected void copyPreviewImageToRepository(Content media, File file, String filename) + { + + Document doc = new Document(file, "image/png"); + try + { + SaveHandlerImpl.saveDocument(media, doc, DocumentTypeHandler.PREVIEW_NODEDATA_NAME, filename, null); + } + catch (RepositoryException e) + { + log.error(e.getMessage(), e); + } + finally + { + doc.delete(); + } + + } } Modified: trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_en.properties =================================================================== --- trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_en.properties 2010-02-20 18:10:43 UTC (rev 2015) +++ trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_en.properties 2010-02-20 18:14:39 UTC (rev 2016) @@ -94,6 +94,7 @@ media.info.media_bitdepth=Bit depth: {0} media.info.media_duration=Duration: {0} media.info.media_framerate=Frame rate: {0} fps +media.info.media_pages= Number of pages: {0} media.bgselector.white=White media.bgselector.transparent=Transparent Modified: trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_it.properties =================================================================== --- trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_it.properties 2010-02-20 18:10:43 UTC (rev 2015) +++ trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_it.properties 2010-02-20 18:14:39 UTC (rev 2016) @@ -96,6 +96,7 @@ media.info.media_bitdepth=Profondit\u00E0 di colore: {0} media.info.media_duration=Durata: {0} media.info.media_framerate=Frame rate: {0} fps +media.info.media_pages= Numero di pagine: {0} media.bgselector.white=Bianco This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |