1

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

4 に答える 4

4

問題は次の場所にある可能性があります。

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

コードが開始されたプロセスが終了するのを待っている場合、OpenOffice サービスを強制終了するまで待機することがあり、その後プログラムの残りの部分が失敗します。メイン プログラムが続行できるように、必ずバックグラウンド サービスでサービスを開始してください。または、OpenOffice サーバーを手動で (プログラム外で) 起動します。waitFor()サービスが終了することはありませんので、しないでください。

上記System.out.println()は印刷されるため、そこまではまだ機能しています。

于 2012-07-27T13:21:29.973 に答える
3

PCを再起動すると問題は解決しましたが、理由はわかりません....

于 2012-07-30T03:40:51.903 に答える
0

オンザフライ変換機能を備えたプロジェクトを開発しており、この奇妙な問題にも遭遇しました。解決策は、純粋な Java プロセス マネージャーよりも sigar プロセス マネージャーを使用することでした。より堅牢で一貫性がありますが、ネイティブ ライブラリが必要です。

于 2012-07-31T12:23:05.770 に答える
0

選択したポートに問題があったようです。Java ソケット オブジェクトを使用して、そのようなファンキーなものに出くわしたことは知っています。

于 2012-08-03T23:52:25.703 に答える