Conversion Word vers HTML avec JOD et OpenOffice

Baptiste Autin, le 30 avril 2013

En combinant OpenOffice et la librairie JODConverter, on peut facilement intégrer dans une application J2EE/Spring un service de conversion de documents Office vers HTML (ou vers PDF).

Voici la marche à suivre :

1. Installez OpenOffice sur votre serveur
2. Recopiez ma classe d’exemple ConvertorJod (ci-dessous) dans votre webapp, et modifiez votre fichier applicationContext en conséquence
3. Modifiez en particulier le chemin menant à votre répertoire d’installation d’Office, ainsi que celui menant au répertoire de profil à utiliser
4. Lancez votre webapp. Un processus soffice.bin devrait apparaître dans la liste des processus de votre serveur, et vos logs devraient ressembler à quelque chose comme :

	DEBUG - Starting LibreOffice server...
	org.artofsolving.jodconverter.office.ProcessPoolOfficeManager
	INFO: ProcessManager implementation is PureJavaProcessManager
	org.artofsolving.jodconverter.office.OfficeProcess prepareInstanceProfileDir
	org.artofsolving.jodconverter.office.OfficeProcess start
	INFO: starting process with acceptString 'socket,host=127.0.0.1,port=8100,tcpNoDelay=1' and profileDir (...)
	org.artofsolving.jodconverter.office.OfficeProcess start
	INFO: started process
	org.artofsolving.jodconverter.office.OfficeConnection connect
	INFO: connected: 'socket,host=127.0.0.1,port=8100,tcpNoDelay=1'
	DEBUG [localhost-startStop-1] (ConvertorJod.java:48) [] - LibreOffice server started...

Votre application ayant correctement démarré, votre service de conversion est maintenant disponible pour vos autres beans. Le démarrage du processus de conversion ayant été réalisé une seule fois (au démarrage de l’ApplicationContext), les temps de conversion sont plutôt bons (de l’ordre d’une à deux secondes pour un document de taille moyenne).

Remarques importantes
Si vous ne précisez pas de répertoire de template, c’est un répertoire par défaut qui sera choisi, et si celui-ci n’existe pas, le démon soffice.bin ne se lancera pas.
Ceci est particulièrement important dans le cas d’une webapp, car votre serveur d’application ne s’exécute probablement pas sous un compte utilisateur disposant d’un répertoire de template OpenOffice.
Éventuellement, faites un copier-coller d’un répertoire correspondant à un utilisateur existant (sous Windows, vous le trouverez sous C:\Users\\AppData\Roaming\OpenOffice.org\)
Il faut également que des droits d’écriture soient positionnés sur le répertoire de template. Autrement, vous aurez une erreur :

java.net.ConnectException: connection failed: 'socket,host=127.0.0.1,port=8100,tcpNoDelay=1'; java.net.ConnectException: Connection refused: connect

package test.convertor;

import java.io.File;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.apache.log4j.Logger;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.document.DocumentFormat;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeConnectionProtocol;
import org.artofsolving.jodconverter.office.OfficeException;
import org.artofsolving.jodconverter.office.OfficeManager;
import org.springframework.stereotype.Service;

@Service
public class ConvertorJod implements AbstractFileConvertor {

	protected final Logger logger = Logger.getLogger(getClass());

	private OfficeManager officeManager = null;
	private OfficeDocumentConverter converter = null;

	@PostConstruct
	protected void initOfficeManager() {
		logger.debug("Starting conversion service...");

		DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();

		configuration.setPortNumber(8100);
		configuration.setConnectionProtocol(OfficeConnectionProtocol.SOCKET);

		configuration.setTemplateProfileDir(new File("D:\\openoffice\\3"));
		configuration.setOfficeHome(new File("C:\\Program Files (x86)\\OpenOffice.org 3"));

		configuration.setTaskExecutionTimeout(30000L);

		officeManager = configuration.buildOfficeManager();
		converter = new OfficeDocumentConverter(officeManager);

		officeManager.start();

		logger.debug("Conversion service started");
	}

	@PreDestroy
	protected void preDrestroy() {
		logger.debug("Stopping conversion service...");
		officeManager.stop();
		logger.debug("Conversion service stopped");
	}

	@Override
	public void convertToHtml(final File source, final File destination) throws OfficeException {

		DocumentFormat outputFormat = converter.getFormatRegistry().getFormatByExtension("html");    // "html" ou "pdf"

		logger.debug("Converting " + source.getName());

		converter.convert(source, destination, outputFormat);
	}
}

Et voici l’interface Java du service (à injecter dans tous vos beans métier ayant besoin de réaliser des conversions de documents) :

package test.convertor;

import java.io.File;

import org.artofsolving.jodconverter.office.OfficeException;

public interface AbstractFileConvertor {

	void convertToHtml(File source, File destination) throws OfficeException;

}

Un commentaire sur “Conversion Word vers HTML avec JOD et OpenOffice”

  1. gio dit :

    It works pretty good word to html. But html to word with html with img base64 image are not converted in the doc.

Laisser une réponse

«     »