transformation de document Office en PDF [Résolu]

cancel
Showing results for 
Search instead for 
Did you mean: 
niko
Member II

Re: transformation de document Office en PDF [Résolu]

Bonjour,

Je suis interressé par cette fonction java de conversions de documents en pdf. Seulement j'avoue ne pas vraiment comprendre le fonctionnement. A quoi font référence les 'this' dans la fonction? Comment est-il possible d'appeler cette fonction?

Merci de vos réponses!
niko
Member II

Re: transformation de document Office en PDF [Résolu]

Je me permets de faire un petit up!
Si une personne pouvait m'aider et m 'expliquer un peu plus en détails le fonctionnement du code de huberd, ce serait vraiment gentil, et ca me donnerait + qu'un bon coup de pouce!

Merci!

Niko
huberd
Member II

Re: transformation de document Office en PDF [Résolu]

Bonjour,

Pour répondre à tes questions :

A quoi font référence les 'this' dans la fonction?

concernant l'opérateur this vas voir ici :  http://www.commentcamarche.net/forum/affich-39084-a-quoi-sert-l-operateur-this-en-java

Comment est-il possible d'appeler cette fonction?

Pour ce qui est de l'appel, il existe plusieurs manière de faire :
- Soit par un workflow ou une action , ce que je fait
- Soit par une règle

Voici un extrait de ma classe de création de PDF qui comprend la fonction makePDF.
ackage org.alfresco.community.utility.document;

import java.awt.Color;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.faces.context.FacesContext;

import org.alfresco.community.config.GetConfig;
import org.alfresco.community.definitions.CommunityConstante;
import org.alfresco.community.repo.Content;
import org.alfresco.community.util.MyLogger;
import org.alfresco.community.util.OfficeTransform;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.CopyService;
import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.service.cmr.repository.NoTransformerException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.rule.RuleServiceException;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.TempFileProvider;
import org.alfresco.web.bean.repository.Repository;
import org.apache.log4j.Logger;
import org.pdfbox.exceptions.COSVisitorException;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDPage;
import org.pdfbox.pdmodel.edit.PDPageContentStream;
import org.pdfbox.pdmodel.font.PDFont;
import org.pdfbox.pdmodel.font.PDTrueTypeFont;
import org.pdfbox.pdmodel.graphics.xobject.PDJpeg;
import org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

public class PDFTools {
   
   private static final long serialVersionUID = 1L;

   private static final Logger logger = Logger.getLogger(PDFTools.class);
   
   private static final String MIMETYPE_WORD_2007 = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
   private static final String MIMETYPE_EXCEL_2007 = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

    // Get Services
   static NodeService nodeService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getNodeService();
   //static NamespaceService namespaceService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getNamespaceService();
   static ContentService contentService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getContentService();
   static MimetypeService mimetypeService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getMimetypeService();
   static CopyService copyService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getCopyService();
   
    /**
     * Executed in a new transaction so that failures don't cause the entire transaction to rollback.
     * @param sourceNodeRef
     * @param contentReader
     * @param destinationNodeRef
     * @param contentWriter
     */
   private static void doTransform(NodeRef sourceNodeRef, ContentReader contentReader,
                              NodeRef destinationNodeRef, ContentWriter contentWriter)   

   {
       // Transformation options
       //TransformationOptions options = new TransformationOptions(sourceNodeRef, ContentModel.PROP_NAME, destinationNodeRef, ContentModel.PROP_NAME);         
       
       // try to pre-empt the lack of a transformer      
        if (contentService.isTransformable(contentReader, contentWriter) == false)
        {
            throw new NoTransformerException(contentReader.getMimetype(), contentWriter.getMimetype());
        }
       
        // transform
        contentService.transform(contentReader, contentWriter);
   }
   
    /**
     * Transform name from original extension to new extension
     * @param mimetypeService
     * @param original
     * @param newMimetype
     * @param alwaysAdd
     * @return
     */
    //public static String transformName(MimetypeService mimetypeService, String original, String newMimetype, boolean alwaysAdd)
    public static String transformName(String original, String newMimetype, boolean alwaysAdd)
    {
        // get the current extension
        int dotIndex = original.lastIndexOf('.');
        StringBuilder sb = new StringBuilder(original.length());
        if (dotIndex > -1)
        {
            // we found it
            sb.append(original.substring(0, dotIndex));
           
            // add the new extension
            String newExtension = mimetypeService.getExtension(newMimetype);
            sb.append('.').append(newExtension);
        }
        else
        {
            // no extension so dont add a new one
            sb.append(original);
           
            if (alwaysAdd == true)
            {              
                // add the new extension
                String newExtension = mimetypeService.getExtension(newMimetype);
                sb.append('.').append(newExtension);
            }
        }
        // done
        return sb.toString();
    }   

  /**
    * Make PDF
    * @param sourceNodeRef
    * @param copyNodeRef
    * @throws COSVisitorException
    * @throws IOException
    */
    public static void makePDF(NodeRef sourceNodeRef, NodeRef destNodeRef) throws COSVisitorException, IOException {
       MyLogger.debugInfo("Published in PDF format", 2, 14);
       ContentReader contentReader = contentService.getReader(sourceNodeRef, ContentModel.PROP_CONTENT);
        if(contentReader != null) {
           // get the writer and set it up
           ContentWriter contentWriter = contentService.getWriter(destNodeRef, ContentModel.PROP_CONTENT, true);
            // Only do the transformation if some content is avalaible
             contentWriter.setMimetype(MimetypeMap.MIMETYPE_PDF); // new mimeType
              contentWriter.setEncoding(contentReader.getEncoding()); // original encoding

              // Try and transform the content - failure are caught and allow to fail silently
              // This is unique to this action, and is essentially a broken pattern.
              // Client should rather get the exception and then decide to replay with rules/action turned off or not.
              // TODO: Check failure patterns for actions.
             
              String mymetype = contentService.getWriter(sourceNodeRef, ContentModel.PROP_CONTENT, true).getMimetype().toString();
              try {
                 if (GetConfig.msoffice() && (mymetype.equals(MimetypeMap.MIMETYPE_WORD) ||
                                            mymetype.equals(MIMETYPE_WORD_2007) ||
                                            mymetype.equals(MimetypeMap.MIMETYPE_EXCEL) ||
                                          mymetype.equals(MIMETYPE_EXCEL_2007))) {
                    //try {
                      OfficeTransform.convertToPDF(sourceNodeRef,contentReader, destNodeRef, contentWriter);
                    /*   } catch (IOException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                   }*/   
                 }
                 else {
                    doTransform(sourceNodeRef,contentReader,destNodeRef,contentWriter);
                 }
                 
              }
              catch(NoTransformerException e) {
                 if (logger.isDebugEnabled()) {
                    logger.debug("No transformer found to execute rule: \n" +
                          "   reader: " + contentReader + "\n" +
                          "   writer: " + contentWriter + "\n"); // +
                          //"   action: " + this);
                 }
              }
        }

   …

    }

Pour appeler ma foction de convertion de PDF :

PDFTools.makePDF(NodeRefSource(), NodeRefPDF());

Attention :
La conversion de document office Word (doc, docx) Excel (xls, xlsx) nécéssite l'installation de OpenOffice en mode serveur sur le serveur Alfresco. Il est également préférable d'installer la version la plus récente soit une 3.2 (à ce jour) ou supérieure.

En ce qui me concerne, dans mon référentiel Alfresco, je m'occupe de convertir que du document Office (2000 et 2007). Open Office ne m'apportant pas satisfaction au niveau du rendu des documents produits par Office 2007, j'ai donc développé un module qui s'appuie sur Office 2007 et de l'addon Microsoft SaveAsPDF pour Office 2007 que j'ai installé sur mon serveur Alfresco.