Preview de fichier eml

cancel
Showing results for 
Search instead for 
Did you mean: 
jeanjot
Active Member

Preview de fichier eml

Bonjour

Par default, lors du dépot de document mail par le protocole IMAP dans Alfresco, celui-ci est stocké en eml.

Mais, à partir de l'interface explorer ou Share il n'est pas possible de le visualiser. Or le fichier est soit un fichier texte soit un html.

Existe-t-il une possibilité d'avoir une preview de ces mails dans explorer et Share ?
9 Replies
rguinot
Customer

Re: Preview de fichier eml

possible au moins par un petit composant surf qui expose un web script qui manipule le contenu du fichier eml en question. cela ne devrait pas être long à réaliser
sylvain78
Member II

Re: Preview de fichier eml

Le problème est qu'il n'existe pas de transformation .eml => .swf pour la prévisualisation dans Share.

On peut en ajouter une en créant un fichier custom-swf-transform-context.xml dans shared/classes/alfresco/extension contenant :


<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>

   <bean id="transformer.complex.Mail.Pdf2swf"
        class="org.alfresco.repo.content.transform.ComplexContentTransformer"
        parent="baseContentTransformer" >
      <property name="transformers">
         <list>
            <ref bean="transformer.RFC822" />
            <ref bean="transformer.PdfBox.TextToPdf" />
            <ref bean="transformer.Pdf2swf" />
         </list>
      </property>
      <property name="intermediateMimetypes">
         <list>
            <value>text/plain</value>
            <value>application/pdf</value>
         </list>
      </property>
   </bean>

</beans>
* À noter que ceci ne fonctionne pas avec les courriels .msg.

Le problème ensuite est la prévisualisation des courriels encodés en UTF-8, car la transformation .txt => .pdf par PdfBox ne décode pas les caractères UTF-8 correctement.

Pour pallier au problème, on peut créer/étendre le "transformer" org.alfresco.repo.content.transform.TextToPdfContentTransformer avec le code suivant :


is = reader.getContentInputStream();

EncodingManager encodingManager = new EncodingManager();
transformer.getFont().setEncoding(encodingManager.getEncoding(COSName.WIN_ANSI_ENCODING));

pdf = transformer.createPDFFromText(new InputStreamReader(is, "utf-8"));
// dump it all to the writer
os = writer.getContentOutputStream();
pdf.save(os);
Ceci permet de décoder le contenu "utf-8" du message. On pourrait y ajouter la détection d'encodage pour généraliser l'utilité de la classe.
swiggy
Member II

Re: Preview de fichier eml

Merci pour le fix sur la preview eml, ça fonctionne bien
par contre je ne vois pas dans quel fichier se trouve TextToPdfContentTransformer pour la correction utf-8 ?  :?
Je suppose que c'est un fichier java qu'il faut recompiler ? est-ce qu'il y a un howto quelque part ?
Si quelqu'un peut m'aider…
Merci
dranakan
Active Member

Re: Preview de fichier eml

Hello,

Nous trouverions utile cette fonctionnalité. J'ai vu que les développeurs sont au courant (http://issues.alfresco.com/jira/browse/ALF-3246).
Actuellement en 34D, l'aperçu est-il prévu dans une prochaine version ? Devons-nous faire un développement personnalisé ?

Merci bien.
rguinot
Customer

Re: Preview de fichier eml

Un exemple de config est dispo ici : http://issues.alfresco.com/jira/browse/ALF-6200

Un peu de code spécifique (sans doute un transformer pour le rendition service) sera nécessaire si vous voulez améliorer le rendu
dranakan
Active Member

Re: Preview de fichier eml

Merci bien
dranakan
Active Member

Re: Preview de fichier eml

L'aperçu se crée !
Comme l'avait prédit rguinot, il y a des problèmes de rendu (les accents donne des caractères de ce style "é" -> "?%". La transformation de fichiers textes me pose aussi des problèmes : http://forums.alfresco.com/fr/viewtopic.php?f=8&t=4930#p22534
Il semble que le problème soit lié.

Je pense me baser sur l'exemple plus haut et http://wiki.alfresco.com/wiki/Content_Transformations#Developing_New_Transformations pour créer un transformer (texte avec accents -> PDF) mais avant quelqu'un a-t-il déjà fait ceci ?
Je vais aussi voir si je ne peux pas passer par OpenOffice…

Merci bien
dranakan
Active Member

Re: Preview de fichier eml

Hello,

J'ai créé un transformer personnalisé comme expliqué plus haut. Cela fonctionne avec les message UTF-8 (Content-Type: text/plain; charset=UTF-8) mais pas avec les autres types (par exemple: Content-Type: multipart/alternative;   boundary="—-=_NextPart_000_00E3_01CC2B6A.D7002360").

Est-ce possible d'avoir un aperçu avec des accents pour tous types d'emails ?

Transformer utilisé :
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.charset.Charset;

import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.TransformationOptions;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.TextToPDF;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.encoding.EncodingManager;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import org.alfresco.repo.content.transform.AbstractContentTransformer2;
/**
* Convert Text with accents (UTF-8) to PDF.
*
*
*/
public class TextUtfToPdfContentTransformer extends AbstractContentTransformer2
{
    private static final Log logger = LogFactory.getLog(TextUtfToPdfContentTransformer.class);
   
    private TextToPDF transformer;
   
    public TextUtfToPdfContentTransformer()
    {
        transformer = new TextToPDF();
    }
   
    public void setStandardFont(String fontName)
    {
        try
        {
            transformer.setFont(PDType1Font.getStandardFont(fontName));
        }
        catch (Throwable e)
        {
            throw new AlfrescoRuntimeException("Unable to set Standard Font for PDF generation: " + fontName, e);
        }
    }
   
    public void setTrueTypeFont(String fontName)
    {
        try
        {
            transformer.setFont(PDTrueTypeFont.loadTTF(null, fontName));
        }
        catch (Throwable e)
        {
            throw new AlfrescoRuntimeException("Unable to set True Type Font for PDF generation: " + fontName, e);
        }
    }
   
    public void setFontSize(int fontSize)
    {
        try
        {
            transformer.setFontSize(fontSize);
        }
        catch (Throwable e)
        {
            throw new AlfrescoRuntimeException("Unable to set Font Size for PDF generation: " + fontSize);
        }
    }
   
    /**
     * Only supports Text to PDF
     */
    public boolean isTransformable(String sourceMimetype, String targetMimetype, TransformationOptions options)
    {
        if ( (!MimetypeMap.MIMETYPE_TEXT_PLAIN.equals(sourceMimetype) &&
              !MimetypeMap.MIMETYPE_TEXT_CSV.equals(sourceMimetype) &&
              !MimetypeMap.MIMETYPE_XML.equals(sourceMimetype) ) ||
            !MimetypeMap.MIMETYPE_PDF.equals(targetMimetype))
        {
            // only support (text/plain OR text/csv OR text/xml) to (application/pdf)
            return false;
        }
        else
        {
            return true;
        }
    }

    @Override
    protected void transformInternal(
            ContentReader reader,
            ContentWriter writer,
            TransformationOptions options) throws Exception
    {
        PDDocument pdf = null;
        InputStream is = null;
        InputStreamReader ir = null;
        OutputStream os = null;
        try
        {
           logger.debug("Working…");
            is = reader.getContentInputStream();
            EncodingManager encodingManager = new EncodingManager();
            transformer.getFont().setEncoding(encodingManager.getEncoding(COSName.WIN_ANSI_ENCODING));

            pdf = transformer.createPDFFromText(new InputStreamReader(is, "UTF-8"));
            // dump it all to the writer
            os = writer.getContentOutputStream();
            pdf.save(os);
        }
        finally
        {
            if (pdf != null)
            {
                try { pdf.close(); } catch (Throwable e) {e.printStackTrace(); }
            }
            if (ir != null)
            {
                try { ir.close(); } catch (Throwable e) {e.printStackTrace(); }
            }
            if (is != null)
            {
                try { is.close(); } catch (Throwable e) {e.printStackTrace(); }
            }
            if (os != null)
            {
                try { os.close(); } catch (Throwable e) {e.printStackTrace(); }
            }
        }
    }
   
    protected InputStreamReader buildReader(InputStream is, String encoding, String node)
    {
        // If they gave an encoding, try to use it
        if(encoding != null)
        {
            Charset charset = null;
            try
            {
                charset = Charset.forName(encoding);
            } catch(Exception e)
            {
                logger.warn("JVM doesn't understand encoding '" + encoding +
                        "' when transforming " + node);
            }
            if(charset != null)
            {
                logger.debug("Processing plain text in encoding " + charset.displayName());
                return new InputStreamReader(is, charset);
            }
        }
       
        // Fall back on the system default
        logger.debug("Processing plain text using system default encoding");
        return new InputStreamReader(is);
    }
}

Bean pour utiliser le transformer


<bean id="transformer.complex.Mail.Pdf2swf"
        class="org.alfresco.repo.content.transform.ComplexContentTransformer"
        parent="baseContentTransformer" >
      <property name="transformers">
         <list>
            <ref bean="transformer.RFC822" />
            <ref bean="transformer.PdfBox.TextUtfToPdf" />
            <ref bean="transformer.Pdf2swf" />
         </list>
      </property>
      <property name="intermediateMimetypes">
         <list>
            <value>text/plain</value>
            <value>application/pdf</value>
         </list>
      </property>
   </bean>

Logs

14:35:39,027 User:System DEBUG [content.transform.ContentTransformerRegistry] Searched for transformer:
   source mimetype: message/rfc822
   target mimetype: image/png
   transformers: []
14:35:39,438 User:System DEBUG [content.transform.ContentTransformerRegistry] Searched for transformer:
   source mimetype: message/rfc822
   target mimetype: application/x-shockwave-flash
   transformers: [ComplexContentTransformer[ average=99664ms]]
14:35:39,441 User:System DEBUG [content.transform.ContentTransformerRegistry] Searched for transformer:
   source mimetype: message/rfc822
   target mimetype: application/x-shockwave-flash
   transformers: [ComplexContentTransformer[ average=99664ms]]
14:35:39,443 User:System DEBUG [manageoffice.transformer.TextUtfToPdfContentTransformer] Working…
14:35:39,948 User:System DEBUG [util.exec.RuntimeExec] Execution result:
   os:         Linux
   command:    [/usr/local/bin/pdf2swf, -T, 9, -s, poly2bitmap,subpixels=72, /opt/Alfresco/tomcat/temp/Alfresco/RuntimeExecutableContentTransformerWorker_source_5580025634285233592.pdf, -o, /opt/Alfresco/tomcat/temp/Alfresco/RuntimeExecutableContentTransformerWorker_target_8960526334669163264.swf]
   succeeded:  true
   exit code:  0
   out:        NOTICE  processing PDF page 1 (612x792:0:0) (move:0:0)
NOTICE  processing PDF page 2 (612x792:0:0) (move:0:0)
NOTICE  Writing SWF file /opt/Alfresco/tomcat/temp/Alfresco/RuntimeExecutableContentTransformerWorker_target_8960526334669163264.swf

   err:
14:35:40,180 User:admin DEBUG [content.transform.ContentTransformerRegistry] Searched for transformer:
   source mimetype: application/x-shockwave-flash
   target mimetype: text/plain
   transformers: []
14:35:40,225 User:admin DEBUG [content.transform.ContentTransformerRegistry] Searched for transformer:
   source mimetype: message/rfc822
   target mimetype: text/plain
   transformers: [EMLTransformer[ average=3ms]]
14:35:40,262 User:admin DEBUG [content.transform.ContentTransformerRegistry] Searched for transformer:
   source mimetype: application/x-shockwave-flash
   target mimetype: text/plain
   transformers: []

J'ai aussi testé le code qui est actuellement sur le SVN (https://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root/projects/repository/source/ja...) . Je pensais qu'il était générique car il prend en compte l'encoding (reader.getEncoding()). Cependant cela ne va pas mieux (voir pire car les accents en UTF-8 ne sont pas gérés). J'ai tenté un mix des 2 méthodes… ok pour UTF-8 mais tous les mails ne sont pas bien traités… :

logger.debug("Working…");
            is = reader.getContentInputStream();
           
            EncodingManager encodingManager = new EncodingManager();
            transformer.getFont().setEncoding(encodingManager.getEncoding(COSName.WIN_ANSI_ENCODING));          
             ir = buildReader(is, reader.getEncoding(), reader.getContentUrl());
            
             pdf = transformer.createPDFFromText(ir);
             // dump it all to the writer
             os = writer.getContentOutputStream();
             pdf.save(os);


Merci bien.
zomurn
Member II

Re: Preview de fichier eml

Je n'arrive pas à afficher la preview des .eml malgré le lien de rguinot et ce tutorial : http://loftux.com/2010/12/16/previews-of-outlook-msg-files/
Alfresco démarre bien, mais rien ne se passe au niveau de la preview. J'ai mis le code dans /alfresco-3.4.d/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/extension/msg-preview-context.xml
La message "Ce document ne peut pas être prévisualisé." est toujours présent.
Je suis sous Alfresco 3.4.d CE

Une petite erreur de config de mon côté et ça marche.

Pour la preview des vignettes :

<bean id="transformer.complex.Email2image"
         class="org.alfresco.repo.content.transform.ComplexContentTransformer"
         parent="baseContentTransformer" >
        <property name="transformers">
          <list>
             <ref bean="transformer.RFC822" />
            <ref bean="transformer.complex.Text.Image" />
          </list>
        </property>
        <property name="intermediateMimetypes">
          <list>
            <value>text/plain</value>
          </list>
        </property>
   </bean>