Проблемы с JODConverter

Я использую библиотеку JODConverter V 3.0 Beta 4 вместе с Open Office 3.4 и пытаюсь преобразовать некоторые файлы в формат PDF/A-1. Однако после запуска офис-менеджера он просто зависает и ничего не происходит. Вот вывод:

Jul 26, 2012 12:04:03 PM org.artofsolving.jodconverter.office.ProcessPoolOfficeManager <init>
INFO: ProcessManager implementation is PureJavaProcessManager

C:\Users\Chris\AppData\Local\Temp\ArFile\PDF\blah.pdf : C:\Users\Chris\Documents\blah.txt

Jul 26, 2012 12:04:04 PM org.artofsolving.jodconverter.office.OfficeProcess start
INFO: starting process with acceptString 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1' and profileDir 'C:\Users\Chris\AppData\Local\Temp\.jodconverter_socket_host-127.0.0.1_port-2002'
Jul 26, 2012 12:04:04 PM org.artofsolving.jodconverter.office.OfficeProcess start
INFO: started process

В строке посередине выводятся имя выходного файла и имя входного файла, разделенные двоеточием, как вы можете видеть, что они являются допустимыми значениями...

Вот мой класс конвертера:

package com.allcare.arfile;

import com.sun.star.beans.PropertyValue;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.document.DocumentFamily;
import org.artofsolving.jodconverter.document.DocumentFormat;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;


public class FileConverter 
{
OfficeManager officeManager;
String tempFilePath;

public FileConverter() 
{
    officeManager = new DefaultOfficeManagerConfiguration()
            //.setRetryTimeout(30000L)
            //.setTaskExecutionTimeout(60000L)
            .buildOfficeManager();
    tempFilePath = System.getProperty("java.io.tmpdir") + "\\ArFile\\PDF\\";
}

// if possible this function converts a file to a PDF/A-1 compliant file
public File convertToPdf(File inputFile, Log logger, User user)
{        
    if (isConvertableToPDF(inputFile.getName())) // REMEMBER TO CHANGE THE IF STATEMENT IN THE createMetadata() section to reflect this 
    {
        new File(tempFilePath).mkdirs();
        String filename = inputFile.getName();
        filename = filename.substring(0, filename.lastIndexOf("."));

        File outputFile = new File(tempFilePath + filename + ".pdf");

        System.out.println(outputFile + " : " + inputFile);

        officeManager.start(); // may tweak the start and stop code to appear elsewhere for additional efficiency

        DocumentFormat docFormat = new DocumentFormat("Portable Document Format", "pdf", "application/pdf");
        Map map = new HashMap();
        map.put("FilterName", "writer_pdf_Export");
        PropertyValue[] aFilterData = new PropertyValue[1];
        aFilterData[0] = new PropertyValue();
        aFilterData[0].Name = "SelectPdfVersion";
        aFilterData[0].Value = 1;
        map.put("FilterData", aFilterData);
        docFormat.setStoreProperties(DocumentFamily.TEXT, map);

        OfficeDocumentConverter docConverter = new OfficeDocumentConverter(officeManager);
        docConverter.convert(inputFile, outputFile, docFormat);

        officeManager.stop();

        return outputFile;
    }

    return inputFile;
}

// returns true if the file format is known to be convertible into the PDF/A-1 format
public boolean isConvertableToPDF(String filename)
{
    if (filename.endsWith(".doc") || filename.endsWith(".txt") || filename.endsWith(".xls") 
            || filename.endsWith(".ppt") || filename.endsWith(".docx"))
    {
        return true;
    }

    return false;
}

}

Я использую сокеты Java, и до того, как я использовал сокеты, конвертер работал нормально, но после того, как я перешел на сокеты, он начал зависать. Я не имею понятия почему...

4 ответа

Решение

Проблема может быть здесь:

officeManager.start(); // may tweak the start and stop code ...

Если код ожидает завершения запущенного процесса, он может подождать, пока вы не убьете службу OpenOffice, после чего произойдет сбой остальной части программы. Убедитесь, что вы запускаете службу в фоновом режиме, чтобы основная программа могла продолжаться. Или запустите сервер OpenOffice вручную (вне вашей программы). не waitFor() так как сервис никогда не закончится.

Ваш System.out.println() выше печатается, так что до там все еще работает.

Проблема решилась сама собой после перезагрузки ПК, понятия не имею почему....

Похоже, это была проблема с выбранным вами портом, я знаю, что сталкивался с такими прикольными вещами с использованием объектов сокетов Java.

Мы разрабатываем проект, который имеет возможности преобразования на лету, и мы также наткнулись на эту странную проблему. Решением было использовать менеджер процессов sigar, а не менеджер процессов java. Он более надежный и последовательный, но для него нужны нативные библиотеки.

Другие вопросы по тегам