AEM 6.4 chegou ao fim do suporte estendido e esta documentação não é mais atualizada. Para obter mais detalhes, consulte nossa períodos de assistência técnica. Encontre as versões compatíveis here.
O Adobe Experience Manager Assets fornece um conjunto de fluxos de trabalho padrão e manipuladores de mídia para processar ativos. Um fluxo de trabalho define uma tarefa típica de processamento e gerenciamento de ativos e, em seguida, delega as tarefas específicas aos manipuladores de mídia, por exemplo, geração de miniaturas ou extração de metadados.
Um workflow pode ser definido e executado automaticamente quando um ativo de um tipo ou formato específico é carregado no servidor. As etapas de processamento são definidas como uma série de manipuladores de mídia do Experience Manager Assets. O Adobe Experience Manager fornece alguns manipuladores integrados, e mais pode ser desenvolvido personalizado ou definido pela delegação do processo a um ferramenta de linha de comando.
Os manipuladores de mídia são serviços dentro da Experience Manager Assets que executam ações específicas em ativos. Por exemplo, quando um arquivo de áudio MP3 é carregado no Experience Manager, um fluxo de trabalho aciona um manipulador MP3 que extrai os metadados e gera uma miniatura. Os manipuladores de mídia são usados com fluxos de trabalho. Os tipos MIME mais comuns são suportados no Experience Manager. Você pode executar tarefas específicas em ativos executando qualquer um dos seguintes procedimentos
Consulte Formatos compatíveis com os ativos para obter uma descrição de todos os formatos compatíveis com o Experience Manager Assets e os recursos compatíveis com cada formato.
Os seguintes manipuladores de mídia estão disponíveis no Experience Manager Assets e lidam com os tipos MIME mais comuns:
Nome do manipulador | Nome do serviço (no console do sistema) | Tipos MIME suportados |
---|---|---|
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 | áudio/mpeg Importante - Ao carregar um arquivo MP3, ele é processado usando uma biblioteca de terceiros. A biblioteca calcula um comprimento aproximado não preciso se o MP3 tiver uma taxa de bits variável (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 no caso de nenhum outro manipulador ter sido encontrado para extrair dados de um ativo |
Todos os manipuladores executam as seguintes tarefas:
É possível visualizar os manipuladores de mídia ativos:
http://localhost:4502/system/console/components
.com.day.cq.dam.core.impl.store.AssetStoreImpl
.Os manipuladores de mídia são serviços usados com fluxos de trabalho.
O Experience Manager tem alguns workflows padrão para processar ativos. Para visualizá-las, abra o console Fluxo de trabalho e clique no botão Modelos guia : os títulos de fluxo de trabalho que começam com o Experience Manager Assets são específicos dos ativos.
Os workflows existentes podem ser estendidos e novos podem ser criados para processar ativos de acordo com requisitos específicos.
O exemplo a seguir mostra como aprimorar a variável Sincronização AEM Assets fluxo de trabalho para que os subativos sejam gerados para todos os ativos, exceto documentos PDF.
Os manipuladores de mídia podem ser desativados ou ativados por meio do Console de gerenciamento da Web Apache Felix. Quando o manipulador de mídia está desativado, suas tarefas não são executadas nos ativos.
Para ativar/desativar um manipulador de mídia:
https://<host>:<port>/system/console/components
.com.day.cq.dam.handler.standard.mp3.Mp3Handler
.Para suportar um novo tipo de mídia ou executar tarefas específicas em um ativo, é necessário criar um manipulador de mídia. Esta seção descreve como proceder.
A melhor maneira de iniciar uma implementação é herdar de uma implementação abstrata fornecida que cuida da maioria das coisas e fornece um comportamento padrão razoável: o com.day.cq.dam.core.AbstractAssetHandler
classe .
Essa classe já fornece um descritor de serviço abstrato. Portanto, se você herdar dessa classe e usar o maven-sling-plugin, certifique-se de definir o sinalizador de herança como true
.
Implemente os seguintes métodos:
extractMetadata()
: extrai todos os metadados disponíveis.getThumbnailImage()
: cria uma imagem em miniatura do ativo passado.getMimeTypes()
: retorna os tipos MIME do ativo.Veja um exemplo de modelo:
package my.own.stuff; /** * @scr.component inherit="true" * @scr.service */ public class MyMediaHandler extends com.day.cq.dam.core.AbstractAssetHandler { // implement the relevant parts }
A interface e as classes incluem:
com.day.cq.dam.api.handler.AssetHandler
interface: Essa interface descreve o serviço que adiciona suporte para tipos MIME específicos. A adição de um tipo MIME requer a implementação dessa interface. A interface contém métodos para importar e exportar os documentos específicos, para criar miniaturas e extrair metadados.com.day.cq.dam.core.AbstractAssetHandler
classe: Essa classe serve como base para todas as outras implementações do manipulador de ativos e fornece funcionalidade comum usada.com.day.cq.dam.core.AbstractSubAssetHandler
:
Devem ser aplicados os seguintes métodos:
extractMetadata()
: esse método extrai todos os metadados disponíveis.getThumbnailImage()
: esse método cria uma imagem em miniatura do ativo passado.getMimeTypes()
: esse método retorna os tipos MIME do ativo.Veja um exemplo de modelo:
pacote my.own.stuff; /** * @scr.component hereit="true" * @scr.service */ classe pública MyMediaHandler estende com.day.cq.dam.core.AbstractAssetHandler
A interface e as classes incluem:
com.day.cq.dam.api.handler.AssetHandler
interface: Essa interface descreve o serviço que adiciona suporte para tipos MIME específicos. A adição de um tipo MIME requer a implementação dessa interface. A interface contém métodos para importar e exportar os documentos específicos, para criar miniaturas e extrair metadados.com.day.cq.dam.core.AbstractAssetHandler
classe: Essa classe serve como base para todas as outras implementações do manipulador de ativos e fornece funcionalidade comum usada.com.day.cq.dam.core.AbstractSubAssetHandler
classe: Essa classe serve como base para todas as outras implementações do manipulador de ativos e fornece a funcionalidade comum usada, além da funcionalidade usada frequentemente na extração de subativos.Nesta seção, você criará um Manipulador de texto específico que gera miniaturas com uma marca d'água.
Proceda do seguinte modo:
Consulte Ferramentas de desenvolvimento para instalar e configurar o Eclipse com um plug-in Maven e para configurar as dependências necessárias para o projeto Maven.
Após executar o procedimento a seguir, ao fazer upload de um arquivo de texto no Experience Manager, os metadados do arquivo são extraídos e duas miniaturas com uma marca d'água são geradas.
No Eclipse, crie myBundle
Projeto Maven:
Na barra de Menu, clique em Arquivo > Novo > Outro.
Na caixa de diálogo, expanda a pasta Maven, selecione Projeto Maven e clique em Próximo.
Verifique a Criar um projeto simples e a Usar locais padrão do Workspace e, em seguida, clique em Próximo.
Defina o projeto Maven com os seguintes valores:
Clique em Concluir.
Defina o Compilador Java™ para a versão 1.5:
Clique com o botão direito do mouse no myBundle
selecione Propriedades.
Selecione Java™ Compiler e defina as seguintes propriedades como 1.5:
Clique em OK. Na janela de diálogo, clique em Sim.
Substitua o código no arquivo pom.xml pelo seguinte código:
<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>
Criar o pacote com.day.cq5.myhandler
que contém as classes Java™ em myBundle/src/main/java
:
src/main/java
, selecione Novo, Pacote.com.day.cq5.myhandler
e clique em Finish.Crie a classe Java™ MyHandler
:
myBundle/src/main/java
, clique com o botão direito do mouse no botão com.day.cq5.myhandler
, selecione Novo e, em seguida, Classe.MyHandler.java
substitua o código existente pelo seguinte e salve as alterações: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/geometrixx/icons/certificate.png");
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 whitespace 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;
}
}
Compile a classe Java™ e crie o pacote:
myBundle-0.0.1-SNAPSHOT.jar
(contendo a classe compilada) é criado em myBundle/target
.No CRX Explorer, crie um nó em /apps/myApp
. Nome = install
, Tipo = nt:folder
.
Copiar o pacote myBundle-0.0.1-SNAPSHOT.jar
e armazene-o em /apps/myApp/install
(por exemplo, com WebDAV). O novo manipulador de texto agora está ativo no Experience Manager.
No seu navegador, abra o Console de Gerenciamento da Web Apache Felix. Selecione a guia Componentes e desative o manipulador de texto padrão com.day.cq.dam.core.impl.handler.TextHandler
.
O Experience Manager permite executar qualquer ferramenta de linha de comando em um fluxo de trabalho para converter ativos (como o ImageMagick) e adicionar a nova representação ao ativo. Instale a ferramenta de linha de comando no disco que hospeda o servidor do Experience Manager e adicione e configure uma etapa do processo para o fluxo de trabalho. O processo chamado CommandLineProcess
, filtra de acordo com tipos MIME específicos e cria várias miniaturas com base na nova representação.
As conversões a seguir podem ser executadas e armazenadas automaticamente no Experience Manager Assets:
Em sistemas que não são Windows, a ferramenta FFMpeg retorna um erro ao gerar representações para um ativo de vídeo que tem uma aspa simples (') no nome do arquivo. Se o nome do arquivo de vídeo incluir uma aspa simples, remova-o antes de fazer upload para o Experience Manager.
O CommandLineProcess
O processo executa as seguintes operações na ordem em que são listadas:
O exemplo a seguir mostra como configurar a etapa do processo da linha de comando. Toda vez que um ativo com o tipo MIME gif ou tiff é adicionado a /content/dam
no servidor Experience Manager, uma imagem invertida do original é criada junto com mais três miniaturas (140x100, 48x48 e 10x250).
Para fazer essa etapa do processo, use ImageMagick. Instale o ImageMagick no disco que hospeda o servidor Experience Manager:
Instale o ImageMagick. Consulte Documentação do ImageMagick para obter mais informações.
Configure a ferramenta para que você possa executá-la convert
na linha de comando.
Para ver se a ferramenta está instalada corretamente, execute o seguinte comando convert -h
na linha de comando.
Ele exibe uma tela de Ajuda com todas as opções possíveis da ferramenta de conversão.
Em algumas versões do Windows® (por exemplo, Windows® SE), o comando converter falha ao ser executado porque está em conflito com o utilitário de conversão nativo que faz parte da instalação do Windows®. Nesse caso, mencione o caminho completo do utilitário ImageMagick usado para converter arquivos de imagem em miniaturas. Por exemplo, "C:\Program Files\ImageMagick-6.8.9-Q16\convert.exe" -define jpeg:size=319x319 ${filename} -thumbnail 319x319 cq5dam.thumbnail.319.319.png
.
Para ver se a ferramenta é executada corretamente, adicione uma imagem JPG ao diretório de trabalho e execute o comando convert <image-name>.jpg -flip <image-name>-flipped.jpg
na linha de comando.
Uma imagem invertida é adicionada ao diretório.
Em seguida, adicione a etapa do processo da linha de comando ao fluxo de trabalho Atualizar ativo do DAM:
Vá para o Fluxo de trabalho console.
No Modelos edite a guia Ativo de atualização DAM modelo.
Altere as configurações do Representação ativada pela Web da seguinte maneira:
mime:image/gif,mime:image/tiff,tn:140:100,tn:48:48,tn:10:250,cmd:convert ${directory}/${filename} -flip ${directory}/${basename}.flipped.jpg
Salve o workflow.
Para testar o fluxo de trabalho modificado, adicione um ativo a /content/dam
.
myImage.tiff
e copie para /content/dam
, por exemplo, usando o WebDAV.http://localhost:4502/libs/wcm/core/content/damadmin.html
.myImage.tiff
e verifique se a imagem invertida e as três miniaturas foram criadas.Esta seção descreve como definir os Argumentos de processo do CommandLineProcess
. Separe os valores de Argumentos do processo usar vírgula e não iniciar um valor com um espaço em branco.
Argumento-Formato | Descrição |
---|---|
mime:<mime-type> | Argumento opcional. O processo é aplicado se o ativo tiver o mesmo tipo MIME que um dos argumentos. Vários tipos MIME podem ser definidos. |
tn:<width>:<height> | Argumento opcional. O processo cria uma miniatura com as dimensões definidas no argumento . Várias miniaturas podem ser definidas. |
cmd: <command> | Define o comando que é executado. A sintaxe depende da ferramenta de linha de comando. Somente um comando pode ser definido. As variáveis a seguir podem ser usadas para criar o comando: ${filename} : nome do arquivo de entrada, por exemplo original.jpg ${file} : nome completo do caminho do arquivo de entrada, por exemplo /tmp/cqdam0816.tmp/original.jpg ${directory} : diretório do arquivo de entrada, por exemplo /tmp/cqdam0816.tmp ${basename} : nome do arquivo de entrada sem sua extensão, por exemplo original ${extension} : extensão do arquivo de entrada, por exemplo jpg |
Por exemplo, se o ImageMagick estiver instalado no disco que hospeda o servidor do Experience Manager e se você criar uma etapa do processo usando CommandLineProcess como Implementação e os seguintes valores como Argumentos do 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
Em seguida, quando o workflow é executado, a etapa se aplica somente aos ativos que têm image/gif
ou mime:image/tiff
como mime-types. Ele cria uma imagem invertida do original, a converte em .jpg e cria três miniaturas que têm as dimensões: 140x100, 48x48 e 10x250.
Use o seguinte Argumentos do processo para criar as três miniaturas padrão usando o 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
Use o seguinte Argumentos do processo para criar a representação ativada para Web usando o 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
O CommandLineProcess
a etapa se aplica somente aos Ativos (nós do tipo dam:Asset
) ou descendentes de um ativo.