Adobe Experience Manager Assets viene fornito con un set di flussi di lavoro e gestori di contenuti multimediali predefiniti per elaborare le risorse. Un flusso di lavoro definisce le attività da eseguire sulle risorse, quindi delega le attività specifiche ai gestori di contenuti multimediali, ad esempio la generazione di miniature o l’estrazione di metadati.
Un flusso di lavoro può essere configurato per essere eseguito automaticamente quando viene caricata una risorsa di un particolare tipo MIME. I passaggi di elaborazione sono definiti in termini di una serie di Assets gestori di contenuti multimediali. Experience Manager fornisce alcuni gestori incorporati, e altri possono essere sviluppo personalizzato o definito delegando il processo a un strumento da riga di comando.
I gestori di file multimediali sono servizi in Assets che eseguono azioni specifiche sulle risorse. Ad esempio, quando un file audio MP3 viene caricato in Experience Manager, un flusso di lavoro attiva un gestore MP3 che estrae i metadati e genera una miniatura. I gestori di file multimediali vengono in genere utilizzati in combinazione con i flussi di lavoro. I tipi MIME più comuni sono supportati in Experience Manager. È possibile eseguire attività specifiche sulle risorse estendendo/creando flussi di lavoro, estendendo/creando gestori di supporti o disabilitando/abilitando i gestori di supporti.
Consulta la Formati di risorse supportati per una descrizione di tutti i formati supportati da Assets e funzioni supportate per ciascun formato.
I seguenti gestori di file multimediali sono disponibili in Assets e gestisce i tipi MIME più comuni:
Nome gestore | Nome servizio (nella console del sistema) | Tipi MIME supportati |
---|---|---|
TextHandler | com.day.cq.dam.core.impl.handler.TextHandler | text/plain |
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 Importante - Quando si carica un file MP3, elaborati utilizzando una libreria di terze parti. La libreria calcola una lunghezza approssimativa non accurata se l'MP3 ha un bitrate variabile (VBR). |
ZipHandler | com.day.cq.dam.handler.standard.zip.ZipHandler |
|
PictHandler | com.day.cq.dam.handler.standard.pict.PictHandler | image/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-powerpoint |
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 | fallback nel caso in cui non sia stato trovato alcun altro gestore per estrarre dati da una risorsa |
Tutti gli handler eseguono le operazioni seguenti:
Per visualizzare i gestori di file multimediali attivi:
https://localhost:4502/system/console/components
.com.day.cq.dam.core.impl.store.AssetStoreImpl
.I gestori di file multimediali sono servizi che vengono in genere utilizzati in combinazione con i flussi di lavoro.
Experience Manager dispone di alcuni flussi di lavoro predefiniti per l’elaborazione delle risorse. Per visualizzarli, apri la console Flusso di lavoro e fai clic su Modelli scheda: i titoli del flusso di lavoro che iniziano con Assets sono risorse specifiche.
È possibile estendere i flussi di lavoro esistenti e crearne di nuovi per elaborare le risorse in base a requisiti specifici.
L’esempio seguente mostra come migliorare il flusso di lavoro di Sincronizzazione AEM Assets in modo che vengano generate le risorse secondarie di tutte le risorse, eccetto i documenti PDF.
I gestori di file multimediali possono essere disabilitati o abilitati tramite la console di gestione web Apache Felix. Quando il gestore dei contenuti multimediali è disattivato, le relative attività non vengono eseguite sulle risorse.
Per attivare/disattivare un gestore di supporti:
https://<host>:<port>/system/console/components
.com.day.cq.dam.handler.standard.mp3.Mp3Handler
.Per supportare un nuovo tipo di file multimediale o per eseguire attività specifiche su una risorsa, è necessario creare un gestore di file multimediali. Questa sezione descrive come procedere.
Il modo migliore per avviare un’implementazione è ereditare da un’implementazione astratta fornita che si occupa della maggior parte delle cose e fornisce un comportamento predefinito ragionevole: com.day.cq.dam.core.AbstractAssetHandler
classe.
Questa classe fornisce già un descrittore di servizio astratto. Pertanto, se erediti da questa classe e utilizzi il maven-sling-plugin, assicurati di impostare il flag inherit su true
.
Implementa i seguenti metodi:
extractMetadata()
: estrae tutti i metadati disponibili.getThumbnailImage()
: crea un’immagine di miniatura dalla risorsa passata.getMimeTypes()
: restituisce i tipi MIME della risorsa.Di seguito è riportato un modello di esempio:
package my.own.stuff; /** * @scr.component inherit="true" * @scr.service */ public class MyMediaHandler extends com.day.cq.dam.core.AbstractAssetHandler { // implement the relevant parts }
L’interfaccia e le classi includono:
com.day.cq.dam.api.handler.AssetHandler
Interfaccia: questa interfaccia descrive il servizio che aggiunge il supporto per tipi MIME specifici. L’aggiunta di un nuovo tipo MIME richiede l’implementazione di questa interfaccia. L’interfaccia contiene metodi per importare ed esportare documenti specifici, per creare miniature ed estrarre metadati.com.day.cq.dam.core.AbstractAssetHandler
classe: questa classe funge da base per tutte le altre implementazioni dei gestori di risorse e fornisce funzionalità comuni.com.day.cq.dam.core.AbstractSubAssetHandler
:
Devono essere implementati i seguenti metodi:
extractMetadata()
: questo metodo estrae tutti i metadati disponibili.getThumbnailImage()
: questo metodo crea un’immagine di miniatura dalla risorsa passata.getMimeTypes()
: questo metodo restituisce i tipi MIME della risorsa.Di seguito è riportato un modello di esempio:
package my.own.stuff; /** * @scr.component inherit="true" * @scr.service */ public class MyMediaHandler estende com.day.cq.dam.core.AbstractAssetHandler
L’interfaccia e le classi includono:
com.day.cq.dam.api.handler.AssetHandler
Interfaccia: questa interfaccia descrive il servizio che aggiunge il supporto per tipi MIME specifici. L’aggiunta di un nuovo tipo MIME richiede l’implementazione di questa interfaccia. L’interfaccia contiene metodi per importare ed esportare documenti specifici, per creare miniature ed estrarre metadati.com.day.cq.dam.core.AbstractAssetHandler
classe: questa classe funge da base per tutte le altre implementazioni dei gestori di risorse e fornisce funzionalità comuni.com.day.cq.dam.core.AbstractSubAssetHandler
classe: questa classe funge da base per tutte le altre implementazioni dei gestori di risorse e fornisce funzionalità comuni, oltre a quelle comuni per l’estrazione di risorse secondarie.In questa sezione verrà creato un gestore di testo specifico che genera le miniature con una filigrana.
Procedere come segue:
Fai riferimento a Strumenti di sviluppo per installare e configurare Eclipse con un Maven e per la configurazione delle dipendenze necessarie per il Maven progetto.
Dopo aver eseguito la procedura seguente, quando carichi un file TXT in Experience Manager, i metadati del file vengono estratti e vengono generate due miniature con una filigrana.
In Eclipse, crea myBundle
Maven progetto:
Nella barra dei menu, fai clic su File > Nuovo > Altro.
Nella finestra di dialogo, espandi Maven cartella, seleziona Maven progetto e fai clic su Successivo.
Seleziona la casella Crea un progetto semplice e la casella Usa percorsi Workspace predefiniti, quindi fai clic su Successivo.
Definisci un Maven progetto:
com.day.cq5.myhandler
.Clic Fine.
Imposta il Java alla versione 1.5:
Fare clic con il pulsante destro del mouse myBundle
progetto, seleziona Proprietà.
Seleziona Compilatore Java e imposta le seguenti proprietà su 1.5:
Fai clic su OK. Nella finestra di dialogo, fai clic su Sì.
Sostituisci il codice in pom.xml
file con il seguente codice:
<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>
Creare il pacchetto com.day.cq5.myhandler
che contiene Java classi in myBundle/src/main/java
:
src/main/java
, selezionare Nuovo, quindi Pacchetto.com.day.cq5.myhandler
e fare clic su Fine.Creare Java classe MyHandler
:
myBundle/src/main/java
, fare clic con il pulsante destro del mouse com.day.cq5.myhandler
pacchetto. Seleziona Nuovo, quindi Classe.MyHandler
e fai clic su Fine. Eclipse crea e apre il file MyHandler.java
.MyHandler.java
sostituisci il codice esistente con il seguente e salva le modifiche: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;
}
}
Compila il Java e creare il bundle:
myBundle
progetto, seleziona Esegui come, quindi Installazione Maven.myBundle-0.0.1-SNAPSHOT.jar
(contenente la classe compilata) viene creato in myBundle/target
.In CRX explorer, crea un nodo sotto /apps/myApp
. Nome = install
, Tipo = nt:folder
.
Copiare il bundle myBundle-0.0.1-SNAPSHOT.jar
e conservarlo in /apps/myApp/install
ad esempio con WebDAV. Il nuovo gestore di testo è ora attivo in Experience Manager.
Nel browser, apri la Console di gestione web Apache Felix. Seleziona la Componenti e disabilita il gestore di testo predefinito com.day.cq.dam.core.impl.handler.TextHandler
.
Experience Manager consente di eseguire qualsiasi strumento della riga di comando all’interno di un flusso di lavoro per convertire le risorse (ad esempio ImageMagick) e per aggiungere la nuova rappresentazione alla risorsa. È sufficiente installare lo strumento della riga di comando sul disco che ospita Experience Manager e per aggiungere e configurare una fase del processo al flusso di lavoro. Il processo richiamato, denominato CommandLineProcess
, consente inoltre di filtrare in base a tipi MIME specifici e di creare più miniature in base alla nuova rappresentazione.
Le seguenti conversioni possono essere eseguite e memorizzate automaticamente in Assets:
Nei sistemi non Windows, lo strumento FFmpeg restituisce un errore durante la generazione di rappresentazioni per una risorsa video il cui nome file contiene una virgoletta singola ('). Se il nome del file video include una virgoletta singola, rimuovilo prima di caricarlo in Experience Manager.
Il CommandLineProcess
il processo esegue le operazioni seguenti nell'ordine in cui sono elencate:
Nell'esempio seguente viene illustrato come impostare il passaggio di elaborazione della riga di comando in modo che ogni volta che viene aggiunta una risorsa con GIF o TIFF di tipo e miMIME /content/dam
il Experience Manager server, viene creata un'immagine invertita dell'originale insieme a tre miniature aggiuntive (140x100, 48x48 e 10x250).
A tale scopo, utilizza ImageMagick. ImageMagick è un software gratuito per riga di comando utilizzato per creare, modificare e comporre immagini bitmap.
Installa ImageMagick sul disco che ospita il Experience Manager server:
Installa ImageMagick: vedi Documentazione di ImageMagick.
Impostare lo strumento in modo da poter eseguire la conversione sulla riga di comando.
Per verificare se lo strumento è installato correttamente, eseguire il comando seguente convert -h
sulla riga di comando.
Viene visualizzata una schermata della guida con tutte le opzioni possibili dello strumento di conversione.
In alcune versioni di Windows, l'esecuzione del comando convert potrebbe non riuscire perché è in conflitto con l'utilità di conversione nativa che fa parte di Windows installazione. In questo caso, indicare il percorso completo per ImageMagick software utilizzato per convertire i file immagine in miniature. Esempio: "C:\Program Files\ImageMagick-6.8.9-Q16\convert.exe" -define jpeg:size=319x319 ${filename} -thumbnail 319x319 cq5dam.thumbnail.319.319.png
.
Per verificare se lo strumento viene eseguito correttamente, aggiungete un'immagine JPG alla directory di lavoro ed eseguite il comando convert <image-name>.jpg -flip <image-name>-flipped.jpg
sulla riga di comando. Un'immagine capovolta viene aggiunta alla directory. Quindi, aggiungi il passaggio della riga di comando al flusso di lavoro Risorsa di aggiornamento DAM.
Vai a Flusso di lavoro console.
In Modelli , modificare il Aggiorna risorsa DAM modello.
Modificare il Argomenti del Rappresentazione abilitata per il Web passa a: mime:image/gif,mime:image/tiff,tn:140:100,tn:48:48,tn:10:250,cmd:convert ${directory}/${filename} -flip ${directory}/${basename}.flipped.jpg
.
Salva il flusso di lavoro.
Per verificare il flusso di lavoro modificato, aggiungi una risorsa a /content/dam
.
myImage.tiff
e copiarlo in /content/dam
, ad esempio utilizzando WebDAV.https://localhost:4502/libs/wcm/core/content/damadmin.html
.Questa sezione descrive come impostare Argomenti processo di CommandLineProcess.
Separa i valori della Argomenti processo utilizzando la virgola e non iniziare con uno spazio vuoto.
Formato argomento | Descrizione |
---|---|
mime:<mime-type> | Argomento facoltativo. Il processo viene applicato se la risorsa ha lo stesso tipo MIME dell’argomento. È possibile definire diversi tipi MIME. |
tn:<width>:<height> | Argomento facoltativo. Il processo crea una miniatura con le dimensioni definite nell'argomento. È possibile definire più miniature. |
comando: <command> | Definisce il comando eseguito. La sintassi dipende dallo strumento della riga di comando. È possibile definire un solo comando. Per creare il comando è possibile utilizzare le seguenti variabili: ${filename} : nome del file di input, ad esempio original.jpg ${file} : nome del percorso completo del file di input, ad esempio, /tmp/cqdam0816.tmp/original.jpg ${directory} : directory del file di input, ad esempio, /tmp/cqdam0816.tmp ${basename} : nome del file di input senza estensione, ad esempio originale ${extension} : estensione del file di input, ad esempio JPG. |
Ad esempio, se ImageMagick è installato sul disco che ospita Experience Manager e se crei un passaggio del processo utilizzando CommandLineProcess come Implementazione e i seguenti valori come Argomenti processo:
mime:image/gif,mime:image/tiff,tn:140:100,tn:48:48,tn:10:250,cmd:convert ${directory}/${filename} -flip ${directory}/${basename}.flipped.jpg
quindi, quando il flusso di lavoro viene eseguito, il passaggio si applica solo alle risorse che hanno image/gif
o mime:image/tiff
as mime-types
, crea un'immagine invertita dell'originale, lo converte in JPG e crea tre miniature con le stesse dimensioni: 140x100, 48x48 e 10x250.
Utilizza quanto segue Argomenti processo per creare le tre miniature standard utilizzando 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
Utilizza quanto segue Argomenti processo per creare la rappresentazione abilitata per il web utilizzando 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
Il CommandLineProcess il passaggio si applica solo alle risorse (nodi di tipo dam:Asset
) o i discendenti di una risorsa.