S-JIS[2017-09-12] 変更履歴

JODConverter 4.0.0サンプル

JODConverterでExcelファイルからpdfファイルを生成する例。


環境構築

JODConverter(バージョン4)はMavenリポジトリーから取得できる。

Gradleの場合は以下のような感じ。

build.gradle:

apply plugin: 'java'
apply plugin: 'eclipse'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile('org.jodconverter:jodconverter-core:4.0.0-RELEASE')
    compile('ch.qos.logback:logback-classic:1.1.11')
}

task wrapper(type: Wrapper) {
    gradleVersion '4.1'
    jarFile file('.buildtools/gradlew.jar')
}

slf4jが入っていないと、実行時に以下のようなログが出力される。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

logbackを入れておけば(一緒にslf4jも入るので)このログは出なくなる。

logbackの設定ファイルも一緒に作っておけば完璧。

src/main/resources/logback.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE logback>
<configuration>
  <appender name="STDOUT"
      class="ch.qos.logback.core.ConsoleAppender">
    <target>System.out</target>
    <encoder>
      <pattern>%d{HH:mm:ss} %-5level %msg%n</pattern>
    </encoder>
  </appender>

  <root>
    <level value="INFO" />
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

JODConverterを実行するには、実行環境にLibreOffice(あるいはOpenOffice)がインストールされている必要がある。


package com.example.jod;

import java.io.File;

import org.jodconverter.OfficeDocumentConverter;
import org.jodconverter.office.DefaultOfficeManagerBuilder;
import org.jodconverter.office.OfficeException;
import org.jodconverter.office.OfficeManager;
public class JodExample {

	public static void main(String... args) throws OfficeException {
		OfficeManager officeManager = new DefaultOfficeManagerBuilder().build();
		OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);

		System.out.println("officeManager start");
		officeManager.start();
		try {
			System.out.println("convert start");

			converter.convert(new File("D:/data/dq10/DQ10.xls"), new File("D:/temp/jodconverter/dq10.pdf"));

			System.out.println("convert end");
		} finally {
			officeManager.stop();
		}
	}
}

最初にOfficeManagerを生成する。これがLibreOfficeを呼び出す役割を持っていると思われる。
インスタンス生成後にstartさせる。
(実行できるようになるまで数秒だけ時間がかかる)

あとはOfficeDocumentConverterのconvertメソッドを呼び出すだけ。

生成されるpdfは、Excelファイル内の全シートが対象になる。
ページのサイズは、Excelファイルの印刷設定が使われるようだ。

↓実行例

officeManager start
20:48:41 INFO Submitting task 'Start' and waiting...
20:48:41 INFO Starting process with acceptString 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1;urp;StarOffice.ServiceManager' and profileDir 'C:\Users\HISHID~1\AppData\Local\Temp\.jodconverter_socket_host-127.0.0.1_port-2002_tcpNoDelay-1'
20:48:42 INFO Started process; pid = 5220
20:48:43 INFO Connected: 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1'
convert start
20:48:43 INFO Executing default conversion task...
convert end
20:48:48 INFO Stopping the office manager...
20:48:48 INFO Submitting task 'Stop' and waiting...
20:48:48 INFO Disconnected: 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1'
20:48:48 INFO process exited with code 0
20:48:49 INFO Office manager stopped

OfficeManagerをstartさせないと、以下のような例外が発生する。(環境によって出る例外が違うかも)

Exception in thread "main" org.jodconverter.office.OfficeException: Could not get the process exit code
	at org.jodconverter.office.OfficeProcess.getExitCode(OfficeProcess.java:206)
	at org.jodconverter.office.ManagedOfficeProcess.doEnsureProcessExited(ManagedOfficeProcess.java:80)
	at org.jodconverter.office.ManagedOfficeProcess.doStopProcess(ManagedOfficeProcess.java:135)
	at org.jodconverter.office.ManagedOfficeProcess.access$000(ManagedOfficeProcess.java:40)
	at org.jodconverter.office.ManagedOfficeProcess$5.call(ManagedOfficeProcess.java:302)
	at org.jodconverter.office.ManagedOfficeProcess$5.call(ManagedOfficeProcess.java:298)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
	at org.jodconverter.office.ExitCodeRetryable.attempt(ExitCodeRetryable.java:43)
	at org.jodconverter.office.Retryable.execute(Retryable.java:69)
	at org.jodconverter.office.ExitCodeRetryable.execute(ExitCodeRetryable.java:23)
	at org.jodconverter.office.Retryable.execute(Retryable.java:48)
	at org.jodconverter.office.ExitCodeRetryable.execute(ExitCodeRetryable.java:23)
	at org.jodconverter.office.OfficeProcess.getExitCode(OfficeProcess.java:201)
	... 9 more
Exception in thread "main" java.lang.IllegalStateException: This office manager is currently stopped.
	at org.jodconverter.office.ProcessPoolOfficeManager.execute(ProcessPoolOfficeManager.java:104)
	at org.jodconverter.OfficeDocumentConverter.convert(OfficeDocumentConverter.java:130)
	at org.jodconverter.OfficeDocumentConverter.convert(OfficeDocumentConverter.java:103)
	at org.jodconverter.OfficeDocumentConverter.convert(OfficeDocumentConverter.java:84)
	at com.example.jod.JodExample.main(JodExample.java:21)

JODConverterへ戻る / 技術メモへ戻る
メールの送信先:ひしだま