Converter WMF/EMF - contidos em um .odt, para SVG/JPG

Saudações!

Termos:
odt = openDocument format - texto
wmf = windows metafile
emf = enhanced metafile

Estou desenvolvendo uma aplicação para exportar o conteúdo de documentos .odt (openDocument) para um sistema mediaWiki, incluindo as imagens.

Como muitos já sabem, um documento '.odt" é um arquivo compactado contendo alguns arquivos e diretórios. Podendo ser explorado, dentre outras maneiras, renomeando um ‘arquivo.odt’ para ‘arquivo.zip’ e operando-o da mesma maneira que se faz com outros arquivos ‘.zip’.

Pois bem, dentre os diretórios compactados em um arquivo ‘.odt’, existe um diretório chamado ‘Pictures’, onde ficam armazenadas as imagens presentes no documento ‘.odt’.
As vezes ao se abrir um documento ‘.doc’ com o libreOffice e salva-lo como .odt, algumas imagens são salvas no formato ‘.wmf’.

Estou procurando a dois dias e ainda não achei um programa que converta especificamente os arquivos ‘.wmf’ armazenados em um arquivo ‘.odt’ para o formato ‘.svg’, ‘.jpg’ ou outro formato de imagem.

Curiosidade: ao digitar o comando abaixo no shell do Ubuntu espeficando um arquivo ‘.wmf’ contido em um documento ‘.odt’

$ file [arquivoDeImagemInternoOdt.wmf]

Aparece a seguinte mensagem - supondo tratar-se de um arquivo ‘.emf’ ao invés de ‘.wmf’ :

arquivoDeImagemInternoOdt.wmf:  Windows Enhanced Metafile (EMF) image data version 0x10000

Enquanto que o mesmo comando para um arquivo ‘.wmf’ convencional:

$ file [arquivoWmfConvencional.wmf]

Retorna a mensagem:

arquivoWmfConvencional.wmf:  ms-windows metafont .wmf

Ja tentei usar a API ‘Apache batik-1.7’ (http://xmlgraphics.apache.org/batik/download.cgi), especificamente a classe ‘org.apache.batik.transcoder.wmf.tosvg.WMFTranscoder’, e outra meia duzia de APIs.

Funciona com muitos arquivos ‘.wmf’, mas não, especificamente, com os ‘.wmf’ contidos em um documento ‘.odt’.

Alguém sabe como faço para converter esses ‘.wmf’ contidos no documento ‘.odt’?

Segue o código que faz uso da API ‘Apache batik-1.7’ e funcionou com arquivos ‘.wmf’ convencionais:

[code]import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.TranscodingHints;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.transcoder.wmf.tosvg.WMFHeaderProperties;
import org.apache.batik.transcoder.wmf.tosvg.WMFTranscoder;

/**
*

  • @author cristiano
    */
    public class Main {

    public static void main(String[] a) throws FileNotFoundException, IOException, TranscoderException {

     String path = "/home/cristiano/azip/wmf/fichas";
     boolean arquivoInvalido = false;
     File f = null;
     boolean one_file = true;
    
     if (path == null) {
         arquivoInvalido = true;
     } else {
         f = new File(path);
         if (f.isDirectory()) {
             one_file = false;
         } else if (!f.isFile()) {
             arquivoInvalido = true;
         }
     }
     if (arquivoInvalido) {
         System.err.println("Arquivo inválido");
         System.exit(1);
     }
     if (one_file) {
         wmf2svg(path);
         svg2Jpeg(path);
     } else {
         File[] ls = f.listFiles();
         for (int i = 0; i < ls.length; i++) {
             String name = ls[i].getName();
             int l = name.length();
             boolean ok = l > 4 && name.substring(l - 4).equalsIgnoreCase(".wmf");
             if (!ok) {
                 ok = l > 4 && name.substring(l - 4).equalsIgnoreCase(".emf");
             }
             if (ok) {
                 wmf2svg(path + "/" + name);
                 svg2Jpeg(path + "/" + name);
             }
         }
     }
     System.out.println("done");
    

    }

    private static void wmf2svg(String path) throws FileNotFoundException, TranscoderException {
    File inputFile = new File(path);
    if (!inputFile.isDirectory()) {
    try {

             File outputFile = new File(inputFile.getParentFile() + File.separator + "saida" + File.separator + inputFile.getName().substring(0, inputFile.getName().length() - 4) + ".svg");
             TranscoderInput input = new TranscoderInput(inputFile.toURI().toString());
             OutputStream stream = new FileOutputStream(outputFile);
             TranscoderOutput output = new TranscoderOutput(stream);
             WMFTranscoder transcoder = new WMFTranscoder();
             transcoder.transcode(input, output);
             System.out.println("Arquivo SVG convertido: '" + outputFile + "' ");
         } catch (Exception e) {
             System.err.println("Arquivo Problemático: " + inputFile);
             e.printStackTrace();
         }
     }
    

    }

    private static void svg2Jpeg(String path) {
    File inputFile = new File(path);
    if (!inputFile.isDirectory()) {
    try {

             File inputSVG = new File(inputFile.getParentFile() + File.separator + "saida" + File.separator + inputFile.getName().substring(0, inputFile.getName().length() - 4) + ".svg");
             File outputJPEG = new File(inputFile.getParentFile() + File.separator + "saida" + File.separator + inputFile.getName().substring(0, inputFile.getName().length() - 4) + ".jpg");
             JPEGTranscoder it = new JPEGTranscoder();
             ByteArrayOutputStream jpg = new ByteArrayOutputStream();
             it.transcode(new TranscoderInput(new FileInputStream(inputSVG)), new TranscoderOutput(jpg));
             FileOutputStream jpgOut = new FileOutputStream(outputJPEG);
             jpgOut.write(jpg.toByteArray());
             jpgOut.flush();
             System.out.println("Arquivo JPEG convertido: '" + outputJPEG + "' ");
         } catch (Exception e) {
             System.err.println("Arquivo Problemático: " + inputFile);
             e.printStackTrace();
         }
     }
    

    }[/code]