Adobe Experience Manager Assets innehåller en uppsättning standardarbetsflöden och mediehanterare för att bearbeta resurser. I ett arbetsflöde definieras de uppgifter som ska köras på resurserna och sedan delegeras de specifika uppgifterna till mediehanterarna, till exempel generering av miniatyrer eller metadataextrahering.
Ett arbetsflöde kan konfigureras så att det körs automatiskt när en resurs av en viss MIME-typ överförs. Bearbetningsstegen definieras som en serie Assets mediehanterare. Experience Manager innehåller vissa inbyggda hanterare, och ytterligare kan antingen anpassad utveckling eller definieras genom att delegera processen till en kommandoradsverktyg.
Mediehanterare är tjänster i Assets som utför specifika åtgärder på resurser. När till exempel en MP3-ljudfil överförs till Experience Manager, utlöser ett arbetsflöde en MP3-hanterare som extraherar metadata och genererar en miniatyrbild. Mediehanterare används vanligtvis i kombination med arbetsflöden. De vanligaste MIME-typerna stöds i Experience Manager. Specifika uppgifter kan utföras på resurser genom att antingen utöka/skapa arbetsflöden, utöka/skapa mediehanterare eller inaktivera/aktivera mediehanterare.
Se Format som stöds för resurser en beskrivning av alla format som stöds av Assets och funktioner som kan användas för varje format.
Följande mediehanterare är tillgängliga i Assets och hantera de vanligaste MIME-typerna:
Hanterarnamn | Tjänstnamn (i systemkonsolen) | MIME-typer som stöds |
---|---|---|
TextHandler | com.day.cq.dam.core.impl.handler.TextHandler | text/normal |
PdfHandler | com.day.cq.dam.handler.standard.pdf.PdfHandler |
|
JpegHandler | com.day.cq.dam.core.impl.handler.JpegHandler | image/jpeg |
Mp3Handler | com.day.cq.dam.handler.standard.mp3.Mp3Handler | audio/mpeg Viktigt - När du överför en MP3-fil är det bearbetas med ett tredjepartsbibliotek. Biblioteket beräknar en icke korrekt ungefärlig längd om MP3 har variabel bithastighet (VBR). |
ZipHandler | com.day.cq.dam.handler.standard.zip.ZipHandler |
|
PictHandler | com.day.cq.dam.handler.standard.pict.PictHandler | bild/pict |
StandardImageHandler | com.day.cq.dam.core.impl.handler.StandardImageHandler |
|
MSOfficeHandler | com.day.cq.dam.handler.standard.msoffice.MSOfficeHandler | application/msword |
MSPowerPointHandler | com.day.cq.dam.handler.standard.msoffice.MSPowerPointHandler | application/vnd.ms |
OpenOfficeHandler | com.day.cq.dam.handler.standard.ooxml.OpenOfficeHandler |
|
EPubHandler | com.day.cq.dam.handler.standard.epub.EPubHandler | application/epub+zip |
GenericAssetHandler | com.day.cq.dam.core.impl.handler.GenericAssetHandler | tillbaka om ingen annan hanterare hittades för att extrahera data från en resurs |
Alla hanterare utför följande uppgifter:
Så här visar du de aktiva mediehanterarna:
https://localhost:4502/system/console/components
.com.day.cq.dam.core.impl.store.AssetStoreImpl
.Mediehanterare är tjänster som vanligtvis används i kombination med arbetsflöden.
Experience Manager har vissa standardarbetsflöden för att bearbeta resurser. Öppna arbetsflödeskonsolen och klicka på Models flik: arbetsflödets titlar som börjar med Assets är de tillgångar som är specifika.
Befintliga arbetsflöden kan utökas och nya kan skapas för att bearbeta resurser enligt specifika krav.
I följande exempel visas hur du förbättrar arbetsflödet AEM Assets Synchronization så att delresurser genereras för alla resurser utom PDF-dokument.
Mediehanterarna kan inaktiveras eller aktiveras via webbhanteringskonsolen för Apache Felix. När mediehanteraren är inaktiverad utförs inte dess uppgifter på resurserna.
Så här aktiverar/inaktiverar du en mediehanterare:
https://<host>:<port>/system/console/components
.com.day.cq.dam.handler.standard.mp3.Mp3Handler
.Om du vill ha stöd för en ny medietyp eller utföra specifika åtgärder på en resurs måste du skapa en mediehanterare. I det här avsnittet beskrivs hur du fortsätter.
Det bästa sättet att starta en implementering är att ärva från en tillhandahållen abstrakt implementering som tar hand om de flesta saker och tillhandahåller ett rimligt standardbeteende: com.day.cq.dam.core.AbstractAssetHandler
klassen.
Den här klassen tillhandahåller redan en abstrakt tjänstbeskrivning. Om du ärver från den här klassen och använder maven-sling-plugin-programmet måste du ange att ärvningsflaggan ska vara true
.
Implementera följande metoder:
extractMetadata()
: hämtar alla tillgängliga metadata.getThumbnailImage()
: skapar en miniatyrbild av den överförda resursen.getMimeTypes()
: returnerar resursens MIME-typer.Här är en exempelmall:
package my.own.stuff; /** * @scr.component inherit="true" * @scr.service */ public class MyMediaHandler extends com.day.cq.dam.core.AbstractAssetHandler { // implement the relevant parts }
Gränssnittet och klasserna omfattar:
com.day.cq.dam.api.handler.AssetHandler
interface: Detta gränssnitt beskriver tjänsten som lägger till stöd för specifika MIME-typer. Om du lägger till en ny MIME-typ måste det här gränssnittet implementeras. Gränssnittet innehåller metoder för import och export av specifika dokument, för att skapa miniatyrbilder och extrahera metadata.com.day.cq.dam.core.AbstractAssetHandler
class: Den här klassen fungerar som bas för alla andra tillgångshanterarimplementeringar och tillhandahåller vanliga funktioner.com.day.cq.dam.core.AbstractSubAssetHandler
:
Följande metoder måste implementeras:
extractMetadata()
: den här metoden hämtar alla tillgängliga metadata.getThumbnailImage()
: den här metoden skapar en miniatyrbild av den skickade resursen.getMimeTypes()
: den här metoden returnerar resursens MIME-typ(er).Här är en exempelmall:
paketera my.own.stuff; /* * @scr.component inherit="true" * @scr.service */ public class MyMediaHandler utökar com.day.cq.dam.core.AbstractAssetHandler
Gränssnittet och klasserna omfattar:
com.day.cq.dam.api.handler.AssetHandler
interface: Detta gränssnitt beskriver tjänsten som lägger till stöd för specifika MIME-typer. Om du lägger till en ny MIME-typ måste det här gränssnittet implementeras. Gränssnittet innehåller metoder för import och export av specifika dokument, för att skapa miniatyrbilder och extrahera metadata.com.day.cq.dam.core.AbstractAssetHandler
class: Den här klassen fungerar som bas för alla andra tillgångshanterarimplementeringar och tillhandahåller vanliga funktioner.com.day.cq.dam.core.AbstractSubAssetHandler
class: Den här klassen fungerar som bas för alla andra implementeringar av tillgångshanterare och tillhandahåller vanliga funktioner plus vanliga funktioner för subresursextrahering.I det här avsnittet skapar du en specifik texthanterare som genererar miniatyrbilder med en vattenstämpel.
Gör så här:
Se Utvecklingsverktyg installera och konfigurera Eclipse med en Maven plugin-program och för inställning av beroenden som krävs för Maven projekt.
När du har utfört följande procedur, när du överför en TXT-fil till Experience Manager, extraheras filens metadata och två miniatyrbilder med vattenstämpel genereras.
Skapa i Eclipse myBundle
Maven projekt:
Klicka på i menyraden File > New > Other.
Expandera dialogrutan Maven mapp, markera Maven projekt och klicka på Next.
Markera kryssrutan Skapa ett enkelt projekt och rutan Använd standardplatser för arbetsytan och klicka sedan på Next.
Definiera en Maven projekt:
com.day.cq5.myhandler
.Klicka på Finish.
Ange Java kompilator till version 1.5:
Högerklicka på myBundle
projekt, välj Properties.
Välj Java Compiler och ange följande egenskaper till 1.5:
Klicka på OK. Klicka på Yes.
Ersätt koden i pom.xml
-fil med följande kod:
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- ====================================================================== -->
<!-- P A R E N T P R O J E C T D E S C R I P T I O N -->
<!-- ====================================================================== -->
<parent>
<groupId>com.day.cq.dam</groupId>
<artifactId>dam</artifactId>
<version>5.2.14</version>
<relativePath>../parent</relativePath>
</parent>
<!-- ====================================================================== -->
<!-- P R O J E C T D E S C R I P T I O N -->
<!-- ====================================================================== -->
<groupId>com.day.cq5.myhandler</groupId>
<artifactId>myBundle</artifactId>
<name>My CQ5 bundle</name>
<version>0.0.1-SNAPSHOT</version>
<description>This is my CQ5 bundle</description>
<packaging>bundle</packaging>
<!-- ====================================================================== -->
<!-- B U I L D D E F I N I T I O N -->
<!-- ====================================================================== -->
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.sling</groupId>
<artifactId>maven-sling-plugin</artifactId>
<configuration>
<slingUrlSuffix>/libs/dam/install/</slingUrlSuffix>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Category>cq5</Bundle-Category>
<Export-Package> com.day.cq5.myhandler </Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<!-- ====================================================================== -->
<!-- D E P E N D E N C I E S -->
<!-- ====================================================================== -->
<dependencies>
<dependency>
<groupId>com.day.cq.dam</groupId>
<artifactId>cq-dam-api</artifactId>
<version>5.2.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.day.cq.dam</groupId>
<artifactId>cq-dam-core</artifactId>
<version>5.2.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.day.cq</groupId>
<artifactId>cq-commons</artifactId>
</dependency>
<dependency>
<groupId>javax.jcr</groupId>
<artifactId>jcr</artifactId>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>com.day.commons</groupId>
<artifactId>day-commons-gfx</artifactId>
</dependency>
<dependency>
<groupId>com.day.commons</groupId>
<artifactId>day-commons-text</artifactId>
</dependency>
<dependency>
<groupId>com.day.cq.workflow</groupId>
<artifactId>cq-workflow-api</artifactId>
</dependency>
<dependency>
<groupId>com.day.cq.wcm</groupId>
<artifactId>cq-wcm-foundation</artifactId>
<version>5.2.22</version>
</dependency>
</dependencies>
Skapa paketet com.day.cq5.myhandler
som innehåller Java klasser under myBundle/src/main/java
:
src/main/java
, väljer Ny och sedan Packa.com.day.cq5.myhandler
och klicka på Slutför.Skapa Java class MyHandler
:
myBundle/src/main/java
, högerklicka på com.day.cq5.myhandler
paket. Välj Newsedan Class.MyHandler
och klicka Finish. Eclipse skapar och öppnar filen MyHandler.java
.MyHandler.java
Ersätt den befintliga koden med följande och spara sedan ändringarna:package com.day.cq5.myhandler;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.day.cq.dam.api.metadata.ExtractedMetadata;
import com.day.cq.dam.core.AbstractAssetHandler;
import com.day.image.Font;
import com.day.image.Layer;
import com.day.cq.wcm.foundation.ImageHelper;
/**
* The <code>MyHandler</code> can extract text files
* @scr.component inherit="true" immediate="true" metatype="false"
* @scr.service
*
**/
public class MyHandler extends AbstractAssetHandler {
/** * Logger instance for this class. */
private static final Logger log = LoggerFactory.getLogger(MyHandler.class);
/** * Music icon margin */
private static final int MARGIN = 10;
/** * @see com.day.cq.dam.api.handler.AssetHandler#getMimeTypes() */
public String[] getMimeTypes() {
return new String[] {"text/plain"};
}
public ExtractedMetadata extractMetadata(Node asset) {
ExtractedMetadata extractedMetadata = new ExtractedMetadata();
InputStream data = getInputStream(asset);
try {
// read text data
InputStreamReader reader = new InputStreamReader(data);
char[] buffer = new char[4096];
String text = "";
while (reader.read(buffer) != -1) {
text += new String(buffer);
}
reader.close();
long wordCount = this.wordCount(text);
extractedMetadata.setProperty("text", text);
extractedMetadata.setMetaDataProperty("Word Count",wordCount);
setMimetype(extractedMetadata, asset);
} catch (Throwable t) {
log.error("handling error: " + t.toString(), t);
} finally {
IOUtils.closeQuietly(data);
}
return extractedMetadata; }
// ----------------------< helpers >----------------------------------------
protected BufferedImage getThumbnailImage(Node node) {
ExtractedMetadata metadata = extractMetadata(node);
final String text = (String) metadata.getProperty("text");
// create text layer
final Layer layer = new Layer(500, 600, Color.WHITE);
layer.setPaint(Color.black);
Font font = new Font("Arial", 12);
String displayText = this.getDisplayText(text, 600, 12);
if(displayText!=null && displayText.length() > 0) {
// commons-gfx Font class would throw IllegalArgumentException on empty or null text
layer.drawText(10, 10, 500, 600, displayText, font, Font.ALIGN_LEFT, 0, 0);
}
// create watermark and merge with text layer
Layer watermarkLayer;
try {
final Session session = node.getSession();
watermarkLayer = ImageHelper.createLayer(session, "/content/dam/we-retail/en/products/apparel/gloves/Gloves.jpg");
watermarkLayer.setX(MARGIN);
watermarkLayer.setY(MARGIN);
layer.merge(watermarkLayer);
} catch (RepositoryException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); }
layer.crop(new Rectangle(510, 600));
return layer.getImage(); }
// ---------------< private >-----------------------------------------------
/**
* This method cuts lines if the text file is too long..
* * @param text
* * text to check
* * @param height
* * text box height (px)
* * @param fontheight
* * font height (px)
* * @return the text which will fit into the box
*/
private String getDisplayText(String text, int height, int fontheight) {
String trimmedText = text.trim();
int numOfLines = height / fontheight;
String lines[] = trimmedText.split("\n");
if (lines.length <= numOfLines) {
return trimmedText;
} else {
String cuttetText = "";
for (int i = 0; i < numOfLines; i++) {
cuttetText += lines[i] + "\n";
}
return cuttetText;
}
}
/**
* * This method counts the number of words in a string
* * @param text the String whose words would like to be counted
* * @return the number of words in the string
* */
private long wordCount(String text) {
// We need to keep track of the last character, if we have two whitespaces in a row we don't want to double count.
// The starting of the document is always a whitespace.
boolean prevWhiteSpace = true;
boolean currentWhiteSpace = true;
char c; long numwords = 0;
int j = text.length();
int i = 0;
while (i < j) {
c = text.charAt(i++);
if (c == 0) { break; }
currentWhiteSpace = Character.isWhitespace(c);
if (currentWhiteSpace && !prevWhiteSpace) { numwords++; }
prevWhiteSpace = currentWhiteSpace;
}
// If we do not end with a whitespace then we need to add one extra word.
if (!currentWhiteSpace) { numwords++; }
return numwords;
}
}
Kompilera Java och skapa paketet:
myBundle
projekt, välj Run As sedan Maven Install.myBundle-0.0.1-SNAPSHOT.jar
(som innehåller den kompilerade klassen) skapas under myBundle/target
.Skapa en nod under i CRX Explorer /apps/myApp
. Namn = install
, typ = nt:folder
.
Kopiera paketet myBundle-0.0.1-SNAPSHOT.jar
och lagra den under /apps/myApp/install
(till exempel med WebDAV). Den nya texthanteraren är nu aktiv i Experience Manager.
Öppna Apache Felix Web Management Console. Välj Components och inaktivera standardtexthanteraren com.day.cq.dam.core.impl.handler.TextHandler
.
Experience Manager gör att du kan köra valfritt kommandoradsverktyg i ett arbetsflöde för att konvertera resurser (till exempel ImageMagick) och lägga till den nya återgivningen i resursen. Du behöver bara installera kommandoradsverktyget på den skiva där Experience Manager server och för att lägga till och konfigurera ett processteg i arbetsflödet. Den anropade processen, anropad CommandLineProcess
I kan du också filtrera efter specifika MIME-typer och skapa flera miniatyrbilder baserat på den nya återgivningen.
Följande konverteringar kan automatiskt köras och lagras i Assets:
I andra system än Windows returnerar mpeg-verktyget ett fel när återgivningar genereras för en videoresurs som har ett enkelt citattecken (') i filnamnet. Om namnet på videofilen innehåller ett enkelt citattecken tar du bort det innan du överför det till Experience Manager.
The CommandLineProcess
processen utför följande åtgärder i den ordning de anges:
I följande exempel visas hur du ställer in kommandoradsprocesssteget så att varje gång en resurs med e-typen miMIME GIF eller TIFF läggs till i /content/dam
på Experience Manager servern skapas en spegelvänd bild av originalet tillsammans med ytterligare tre miniatyrbilder (140x100, 48x48 och 10x250).
Om du vill göra det använder du ImageMagick. ImageMagick är ett kostnadsfritt kommandoradsprogram som används för att skapa, redigera och komponera bitmappsbilder.
Installera ImageMagick på disken där Experience Manager server:
Installera ImageMagick: Se ImageMagick-dokumentation.
Konfigurera verktyget så att du kan köra konverteringen på kommandoraden.
Kör följande kommando för att se om verktyget är korrekt installerat convert -h
på kommandoraden.
En hjälpskärm med alla möjliga alternativ för konverteringsverktyget visas.
I vissa versioner av Windows kan kommandot convert misslyckas eftersom det står i konflikt med det inbyggda konverteringsverktyget som är en del av Windows installation. I det här fallet anger du den fullständiga sökvägen för ImageMagick som används för att konvertera bildfiler till miniatyrer. Till exempel, "C:\Program Files\ImageMagick-6.8.9-Q16\convert.exe" -define jpeg:size=319x319 ${filename} -thumbnail 319x319 cq5dam.thumbnail.319.319.png
.
Om du vill se om verktyget fungerar som det ska lägger du till en JPG-bild i arbetskatalogen och kör kommandot convert <image-name>.jpg -flip <image-name>-flipped.jpg
på kommandoraden. En speglad bild läggs till i katalogen. Lägg sedan till kommandoradssteget i DAM Update Asset arbetsflöde.
Gå till Workflow konsol.
I Models -fliken, redigera DAM Update Asset modell.
Ändra Arguments i Web enabled rendition steg till: mime:image/gif,mime:image/tiff,tn:140:100,tn:48:48,tn:10:250,cmd:convert ${directory}/${filename} -flip ${directory}/${basename}.flipped.jpg
.
Spara arbetsflödet.
Om du vill testa det ändrade arbetsflödet lägger du till en resurs i /content/dam
.
myImage.tiff
och kopiera till /content/dam
, till exempel med WebDAV.https://localhost:4502/libs/wcm/core/content/damadmin.html
.I det här avsnittet beskrivs hur du ställer in Process Arguments i CommandLineProcess.
Separera värdena för Process Arguments med komma och börja inte med ett mellanrum.
Argument-Format | Beskrivning |
---|---|
mime:<mime-type> | Valfritt argument. Processen används om resursen har samma MIME-typ som argumentet. Flera MIME-typer kan definieras. |
tn:<width>:<height> | Valfritt argument. Processen skapar en miniatyrbild med de dimensioner som definieras i argumentet. Flera miniatyrbilder kan definieras. |
cmd: <command> | Definierar det kommando som körs. Syntaxen beror på kommandoradsverktyget. Endast ett kommando kan definieras. Följande variabler kan användas för att skapa kommandot: ${filename} : indatafilens namn, till exempel original.jpg ${file} : den fullständiga sökvägen till indatafilen, till exempel /tmp/cqdam0816.tmp/original.jpg ${directory} : indatafilens katalog, till exempel /tmp/cqdam0816.tmp ${basename} : namnet på indatafilen utan filtillägg, till exempel originalfilen ${extension} : tillägg för indatafilen, till exempel JPG. |
Om ImageMagick är installerat på den disk som är värd för Experience Manager server och om du skapar ett processteg med CommandLineProcess som implementering och följande värden som Process Arguments:
mime:image/gif,mime:image/tiff,tn:140:100,tn:48:48,tn:10:250,cmd:convert ${directory}/${filename} -flip ${directory}/${basename}.flipped.jpg
När arbetsflödet körs gäller steget endast resurser som har image/gif
eller mime:image/tiff
as mime-types
skapar den en vända bild av originalet, konverterar den till JPG och skapar tre miniatyrbilder med måtten 140x100, 48x48 och 10x250.
Använd följande Process Arguments för att skapa de tre standardminiatyrbilderna med ImageMagick:
mime:image/tiff,mime:image/png,mime:image/bmp,mime:image/gif,mime:image/jpeg,cmd:convert ${filename} -define jpeg:size=319x319 -thumbnail "319x319>" -background transparent -gravity center -extent 319x319 -write png:cq5dam.thumbnail.319.319.png -thumbnail "140x100>" -background transparent -gravity center -extent 140x100 -write cq5dam.thumbnail.140.100.png -thumbnail "48x48>" -background transparent -gravity center -extent 48x48 cq5dam.thumbnail.48.48.png
Använd följande Process Arguments för att skapa den webbaktiverade återgivningen med ImageMagick:
mime:image/tiff,mime:image/png,mime:image/bmp,mime:image/gif,mime:image/jpeg,cmd:convert ${filename} -define jpeg:size=1280x1280 -thumbnail "1280x1280>" cq5dam.web.1280.1280.jpeg
The CommandLineProcess gäller endast för resurser (noder av typen dam:Asset
) eller underordnade till en resurs.