mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-08 14:51:49 +00:00
Merged HEAD-BUG-FIX (5.1/Cloud) to HEAD (5.1/Cloud)
104496: Merged 5.0.N (5.0.2) to HEAD-BUG-FIX (5.1/Cloud) 104336: Merged NESS/5.0.N-2015_03_23 (5.0.2) to 5.0.N (5.0.2) 103763: MNT-13920 - rewrite the image dimension properties if there is any exif dimensions information available 104332: MNT-13920 - code changes based on review, improved javadoc and slight modifications on the extract size method git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@104607 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
BIN
config/quick/quickSizeSample.jpg
Normal file
BIN
config/quick/quickSizeSample.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 578 KiB |
@@ -18,11 +18,16 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.repo.content.metadata;
|
package org.alfresco.repo.content.metadata;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.alfresco.repo.content.MimetypeMap;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.tika.config.TikaConfig;
|
import org.apache.tika.config.TikaConfig;
|
||||||
|
import org.apache.tika.metadata.Metadata;
|
||||||
|
import org.apache.tika.metadata.TIFF;
|
||||||
import org.apache.tika.mime.MediaType;
|
import org.apache.tika.mime.MediaType;
|
||||||
import org.apache.tika.parser.AutoDetectParser;
|
import org.apache.tika.parser.AutoDetectParser;
|
||||||
import org.apache.tika.parser.Parser;
|
import org.apache.tika.parser.Parser;
|
||||||
@@ -53,6 +58,10 @@ public class TikaAutoMetadataExtracter extends TikaPoweredMetadataExtracter
|
|||||||
protected static Log logger = LogFactory.getLog(TikaAutoMetadataExtracter.class);
|
protected static Log logger = LogFactory.getLog(TikaAutoMetadataExtracter.class);
|
||||||
private static AutoDetectParser parser;
|
private static AutoDetectParser parser;
|
||||||
private static TikaConfig config;
|
private static TikaConfig config;
|
||||||
|
private static String EXIF_IMAGE_HEIGHT_TAG = "Exif Image Height";
|
||||||
|
private static String EXIF_IMAGE_WIDTH_TAG = "Exif Image Width";
|
||||||
|
private static String JPEG_IMAGE_HEIGHT_TAG = "Image Height";
|
||||||
|
private static String JPEG_IMAGE_WIDTH_TAG = "Image Width";
|
||||||
|
|
||||||
public static ArrayList<String> SUPPORTED_MIMETYPES;
|
public static ArrayList<String> SUPPORTED_MIMETYPES;
|
||||||
private static ArrayList<String> buildMimeTypes(TikaConfig tikaConfig)
|
private static ArrayList<String> buildMimeTypes(TikaConfig tikaConfig)
|
||||||
@@ -90,4 +99,33 @@ public class TikaAutoMetadataExtracter extends TikaPoweredMetadataExtracter
|
|||||||
{
|
{
|
||||||
return parser;
|
return parser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Because some editors use JPEG_IMAGE_HEIGHT_TAG when
|
||||||
|
* saving JPEG images , a more reliable source for
|
||||||
|
* image size are the values provided by Tika
|
||||||
|
* and not the exif/tiff metadata read from the file
|
||||||
|
* This will override the tiff:Image size
|
||||||
|
* which gets embedded into the alfresco node properties
|
||||||
|
* for jpeg files that contain such exif information
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Map<String, Serializable> extractSpecific(Metadata metadata,
|
||||||
|
Map<String, Serializable> properties, Map<String,String> headers)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(MimetypeMap.MIMETYPE_IMAGE_JPEG.equals(metadata.get(Metadata.CONTENT_TYPE)))
|
||||||
|
{
|
||||||
|
//check if the image has exif information
|
||||||
|
if(metadata.get(EXIF_IMAGE_WIDTH_TAG) != null && metadata.get(EXIF_IMAGE_HEIGHT_TAG) != null )
|
||||||
|
{
|
||||||
|
//replace the exif size properties that will be embedded in the node with
|
||||||
|
//the guessed dimensions from Tika
|
||||||
|
putRawValue(TIFF.IMAGE_LENGTH.getName(), extractSize(metadata.get(JPEG_IMAGE_HEIGHT_TAG)), properties);
|
||||||
|
putRawValue(TIFF.IMAGE_WIDTH.getName(), extractSize(metadata.get(JPEG_IMAGE_WIDTH_TAG)), properties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -530,6 +530,30 @@ public abstract class TikaPoweredMetadataExtracter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exif metadata for size also returns the string "pixels"
|
||||||
|
* after the number value , this function will
|
||||||
|
* stop at the first non digit character found in the text
|
||||||
|
* @param sizeText string text
|
||||||
|
* @return the size value
|
||||||
|
*/
|
||||||
|
protected String extractSize(String sizeText)
|
||||||
|
{
|
||||||
|
StringBuilder sizeValue = new StringBuilder();
|
||||||
|
for(char c : sizeText.toCharArray())
|
||||||
|
{
|
||||||
|
if(Character.isDigit(c))
|
||||||
|
{
|
||||||
|
sizeValue.append(c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sizeValue.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This content handler will capture entries from within
|
* This content handler will capture entries from within
|
||||||
* the header of the Tika content XHTML, but ignore the
|
* the header of the Tika content XHTML, but ignore the
|
||||||
|
@@ -250,6 +250,20 @@ public void testImageVideo() throws Throwable {
|
|||||||
assertEquals("92", p.get("height"));
|
assertEquals("92", p.get("height"));
|
||||||
assertEquals("8 8 8", p.get("Data BitsPerSample"));
|
assertEquals("8 8 8", p.get("Data BitsPerSample"));
|
||||||
|
|
||||||
|
// Image with wrong tiff:Width property. see MNT-13920
|
||||||
|
p = openAndCheck("SizeSample.jpg", "image/jpeg");
|
||||||
|
// Check raw EXIF properties
|
||||||
|
assertEquals("1535 pixels", p.get("Image Width"));
|
||||||
|
assertEquals("367 pixels", p.get("Image Height"));
|
||||||
|
|
||||||
|
// Map and check
|
||||||
|
Map<QName, Serializable> propsJPG = new HashMap<QName, Serializable>();
|
||||||
|
ContentReader readerJPG = new FileContentReader(open("SizeSample.jpg"));
|
||||||
|
readerJPG.setMimetype("image/jpeg");
|
||||||
|
extracter.extract(readerJPG, propsJPG);
|
||||||
|
assertEquals(1535, propsJPG.get(QName.createQName(NamespaceService.EXIF_MODEL_1_0_URI, "pixelXDimension")));
|
||||||
|
assertEquals(367, propsJPG.get(QName.createQName(NamespaceService.EXIF_MODEL_1_0_URI, "pixelYDimension")));
|
||||||
|
|
||||||
|
|
||||||
// Geo tagged image
|
// Geo tagged image
|
||||||
p = openAndCheck("GEO.jpg", "image/jpeg");
|
p = openAndCheck("GEO.jpg", "image/jpeg");
|
||||||
|
Reference in New Issue
Block a user