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)