JODConverterでExcelファイルからpdfファイルを生成する例。
JODConverter(バージョン4)はMavenリポジトリーから取得できる。
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の設定ファイルも一緒に作っておけば完璧。
<?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)