Gestori di file multimediali predefiniti

I seguenti gestori multimediali sono disponibili in Assets e gestiscono i tipi MIME più comuni:

Nome gestoreNome servizio (nella console del sistema)Tipi MIME supportati
GestoreTestocom.day.cq.dam.core.impl.handler.TextHandlertext/plain
GestorePdfcom.day.cq.dam.handler.standard.pdf.PdfHandler
  • application/pdf
  • application/illustrator
JpegHandlercom.day.cq.dam.core.impl.handler.JpegHandlerimage/jpeg
Mp3Handlercom.day.cq.dam.handler.standard.mp3.Mp3Handleraudio/mpeg
Importante - Un file MP3 caricato è elaborato utilizzando una libreria di terze parti. La libreria calcola una lunghezza approssimativa non accurata se l'MP3 ha un bitrate variabile (VBR).
GestoreZipcom.day.cq.dam.handler.standard.zip.ZipHandler
  • application/java-archive
  • application/zip
PictHandlercom.day.cq.dam.handler.standard.pict.PictHandlerimage/pict
GestoreImmagineStandardcom.day.cq.dam.core.impl.handler.StandardImageHandler
  • image/gif
  • image/png
  • application/photoshop
  • image/jpeg
  • image/tiff
  • image/x-ms-bmp
  • image/bmp
MSOfficeHandlercom.day.cq.dam.handler.standard.msoffice.MSOfficeHandlerapplication/msword
MSPowerPointHandlercom.day.cq.dam.handler.standard.msoffice.MSPowerPointHandlerapplication/vnd.ms-powerpoint
OpenOfficeHandlercom.day.cq.dam.handler.standard.ooxml.OpenOfficeHandler
  • application/vnd.openxmlformats-officedocument.wordprocessingml.document
  • application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • application/vnd.openxmlformats-officedocument.presentationml.presentation
EPubHandlercom.day.cq.dam.handler.standard.epub.EPubHandlerapplication/epub+zip
GenericAssetHandlercom.day.cq.dam.core.impl.handler.GenericAssetHandlerfallback nel caso in cui non sia stato trovato alcun altro gestore per estrarre dati da una risorsa

Tutti gli handler eseguono le operazioni seguenti:

  • estrazione di tutti i metadati disponibili dalla risorsa.
  • creazione di un’immagine in miniatura di una risorsa.

Per visualizzare i gestori di file multimediali attivi:

  1. Nel browser, passa a https://localhost:4502/system/console/components.
  2. Fai clic su com.day.cq.dam.core.impl.store.AssetStoreImpl.
  3. Viene visualizzato un elenco con tutti i gestori di file multimediali attivi. Ad esempio:

chlimage_1-437

Utilizzare i gestori di contenuti multimediali nei flussi di lavoro per eseguire attività sulle risorse

I gestori di file multimediali sono servizi utilizzati con i flussi di lavoro.

Experience Manager dispone di alcuni flussi di lavoro predefiniti per elaborare le risorse. Per visualizzarli, apri la console Flusso di lavoro e fai clic sulla scheda Modelli: i titoli del flusso di lavoro che iniziano con Assets sono quelli specifici delle risorse.

È 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.

Disabilitare o abilitare un gestore di contenuti multimediali

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:

  1. Nel browser, passa a https://<host>:<port>/system/console/components.
  2. Fare clic su Disable accanto al nome del gestore di supporti. Ad esempio: com.day.cq.dam.handler.standard.mp3.Mp3Handler.
  3. Aggiorna la pagina: accanto al gestore dei contenuti multimediali viene visualizzata un’icona che indica che è disabilitato.
  4. Per abilitare il gestore di supporti, fare clic su Abilita accanto al nome del gestore di supporti.

Creare un gestore di contenuti multimediali

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.

Classi e interfacce importanti

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: la classe com.day.cq.dam.core.AbstractAssetHandler.

Questa classe fornisce già un descrittore di servizio astratto. Pertanto, se hai ereditato da questa classe e utilizzi 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:

  • Interfaccia com.day.cq.dam.api.handler.AssetHandler: descrive il servizio che aggiunge il supporto per tipi MIME specifici. L’aggiunta di un tipo MIME richiede l’implementazione di questa interfaccia. L’interfaccia contiene metodi per importare ed esportare documenti specifici, per creare miniature ed estrarre metadati.

  • Classe com.day.cq.dam.core.AbstractAssetHandler: questa classe funge da base per tutte le altre implementazioni dei gestori di risorse e fornisce funzionalità comuni.

  • Classe com.day.cq.dam.core.AbstractSubAssetHandler:

    • Questa classe funge da base per tutte le altre implementazioni dei gestori di risorse e fornisce funzionalità comunemente utilizzate oltre a quelle più comuni per l’estrazione di risorse secondarie.
    • 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: la classe com.day.cq.dam.core.AbstractAssetHandler.
    • Questa classe fornisce già un descrittore di servizio astratto. Pertanto, se hai ereditato da questa classe e utilizzi maven-sling-plugin, assicurati di impostare il flag inherit su true.

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 delle risorse.

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:

  • Interfaccia com.day.cq.dam.api.handler.AssetHandler: descrive il servizio che aggiunge il supporto per tipi MIME specifici. L’aggiunta di un tipo MIME richiede l’implementazione di questa interfaccia. L’interfaccia contiene metodi per importare ed esportare documenti specifici, per creare miniature ed estrarre metadati.
  • Classe com.day.cq.dam.core.AbstractAssetHandler: questa classe funge da base per tutte le altre implementazioni dei gestori di risorse e fornisce funzionalità comuni.
  • Classe com.day.cq.dam.core.AbstractSubAssetHandler: 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.

Esempio: creare un gestore di testo specifico

In questa sezione viene creato un gestore di testo specifico che genera le miniature con una filigrana.

Procedere come segue:

Consulta Strumenti di sviluppo per installare e configurare Eclipse con un plug-in Maven e per configurare le dipendenze necessarie per il progetto Maven.

Dopo aver eseguito la procedura seguente, quando si carica un file TXT in Experience Manager, i metadati del file vengono estratti e vengono generate due miniature con una filigrana.

  1. In Eclipse, crea il progetto myBundle Maven:

    1. Nella barra dei menu, fai clic su File > Nuovo > Altro.

    2. Nella finestra di dialogo, espandi la cartella Maven, seleziona il progetto Maven, quindi fai clic su Avanti.

    3. Selezionare la casella Crea un progetto semplice e la casella Usa percorso Workspace predefinito, quindi fare clic su Avanti.

    4. Definisci un progetto Maven:

      • ID gruppo: com.day.cq5.myhandler.
      • ID artefatto: myBundle.
      • Nome: il mio bundle Experience Manager.
      • Descrizione: questo è il pacchetto Experience Manager.
    5. Fare clic su Fine.

  2. Impostare il compilatore Java™ sulla versione 1.5:

    1. Fare clic con il pulsante destro del mouse sul progetto myBundle e selezionare Proprietà.

    2. Selezionare Java™ Compiler e impostare le proprietà seguenti su 1.5:

      • Livello di conformità del compilatore
      • Compatibilità dei file .class generati
      • Compatibilità con Source
    3. Fare clic su OK. Nella finestra di dialogo, fai clic su .

  3. Sostituire il codice nel file pom.xml 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>
    
  4. Creare il pacchetto com.day.cq5.myhandler che contiene le classi Java™ in myBundle/src/main/java:

    1. In myBundle fare clic con il pulsante destro del mouse su src/main/java, selezionare Nuovo, quindi Pacchetto.
    2. Assegnare un nome a com.day.cq5.myhandler e fare clic su Fine.
  5. Creare la classe Java™ MyHandler:

    1. In Eclipse, in myBundle/src/main/java, fare clic con il pulsante destro del mouse sul pacchetto com.day.cq5.myhandler. Seleziona Nuovo, quindi Classe.
    2. Nella finestra di dialogo, assegnare un nome alla classe Java™ MyHandler e fare clic su Fine. Eclipse crea e apre il file MyHandler.java.
    3. In MyHandler.java, sostituire il codice esistente con il seguente, quindi salvare 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 do not 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;
     }
    }
    
  6. Compila la classe Java™ e crea il bundle:

    1. Fare clic con il pulsante destro del mouse sul progetto myBundle, selezionare Esegui come, quindi Installazione Maven.
    2. Il bundle myBundle-0.0.1-SNAPSHOT.jar (contenente la classe compilata) è stato creato in myBundle/target.
  7. In Esplora risorse di CRX, creare un nodo in /apps/myApp. Nome = install, Tipo = nt:folder.

  8. Copiare il bundle myBundle-0.0.1-SNAPSHOT.jar e archiviarlo in /apps/myApp/install (ad esempio, con WebDAV). Il nuovo gestore di testo è ora attivo in Experience Manager.

  9. Nel browser, apri Apache Felix Web Management Console. Selezionare la scheda Componenti e disattivare il gestore di testo predefinito com.day.cq.dam.core.impl.handler.TextHandler.

Gestore di supporti basato su riga di comando

Experience Manager consente di eseguire qualsiasi strumento da riga di comando all'interno di un flusso di lavoro per convertire le risorse (ad esempio ImageMagick) e aggiungere la nuova rappresentazione alla risorsa. Installare lo strumento della riga di comando solo sul disco che ospita il server Experience Manager e aggiungere e configurare un passaggio del processo al flusso di lavoro. Il processo richiamato, denominato CommandLineProcess, filtra anche in base a tipi MIME specifici e per creare più miniature in base alla nuova rappresentazione.

Le seguenti conversioni possono essere eseguite e memorizzate automaticamente in Assets:

NOTE
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 virgolette singole, rimuoverlo prima di caricarlo in Experience Manager.

Il processo CommandLineProcess esegue le operazioni seguenti nell'ordine elencato:

  • Se specificato, filtra il file in base a tipi MIME specifici.
  • Crea una directory temporanea sul disco che ospita il server Experience Manager.
  • Trasmette il file originale alla directory temporanea.
  • Esegue il comando definito dagli argomenti del passaggio. Il comando viene eseguito nella directory temporanea con le autorizzazioni dell'utente che esegue Experience Manager.
  • Riporta il risultato nella cartella di rendering del server Experience Manager.
  • Elimina la directory temporanea.
  • Crea le miniature in base a tali rappresentazioni, se specificato. Il numero e le dimensioni delle miniature vengono definiti dagli argomenti del passaggio.

Esempio con ImageMagick

Nell'esempio seguente viene illustrato come impostare il passaggio dell'elaborazione della riga di comando in modo che ogni volta che una risorsa con GIF o TIFF di tipo e miMIME viene aggiunta a /content/dam nel server Experience Manager, venga creata un'immagine invertita dell'originale. Vengono inoltre create altre tre miniature: 140x100, 48x48 e 10x250.

Per eseguire questa operazione, utilizzare ImageMagick. ImageMagick è un software gratuito per riga di comando utilizzato per creare, modificare e comporre immagini bitmap.

Installa ImageMagick sul disco che ospita il server Experience Manager:

  1. Installa ImageMagick: consulta la documentazione di ImageMagick.

  2. Configurare lo strumento in modo da poter eseguire convert da una riga di comando.

  3. 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.

    NOTE
    In alcune versioni di Windows è possibile che il comando convert non venga eseguito perché è in conflitto con l'utilità di conversione nativa che fa parte dell'installazione di Windows. In questo caso, indicare il percorso completo del software ImageMagick 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.
  4. Per verificare il corretto funzionamento dello strumento, aggiungere un'immagine JPG alla directory di lavoro ed eseguire 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.

  5. Passa alla console Flusso di lavoro.

  6. Nella scheda Modelli, modifica il modello Risorsa di aggiornamento DAM.

  7. Modifica Argomenti del passaggio Rendering abilitato per Web in: mime:image/gif,mime:image/tiff,tn:140:100,tn:48:48,tn:10:250,cmd:convert ${directory}/${filename} -flip ${directory}/${basename}.flipped.jpg.

  8. Salva il flusso di lavoro.

Per verificare il flusso di lavoro modificato, aggiungere una risorsa a /content/dam.

  1. Nel file system, ottenere un'immagine TIFF desiderata. Rinominarlo in myImage.tiff e copiarlo in /content/dam, ad esempio utilizzando WebDAV.
  2. Passa alla console CQ5 DAM, ad esempio https://localhost:4502/libs/wcm/core/content/damadmin.html.
  3. Apri la risorsa myImage.tiff e verifica che l'immagine capovolta e le tre miniature siano state create.
Pagina precedentePersonalizza ed estendi Assets
Pagina successivaEstendere la funzionalità di ricerca

Experience Manager