概要
jodConverter を OnlineConverter で利用した際のメモ。
SpringBoot を利用していたため、JODConverter Spring Boot Starter を利用しての実装となっている。
環境
- SpringBoot:2.1.3.RELEASE
- JODConverter:4.1.0
- JODConverter Spring Boot Starter
OnlineConverter呼び出し側の実装
- 基本的にはLocalConverterを利用する時と変わらないが、application.yml に OnlineConverterサーバーのURLを指定する
- リクエスト時のURLは
【ymlに設定したURL】/lool/convert-to/【変換先の拡張子】
という形で送信される
- リクエスト時のURLは
application.yml
jodconverter:
online:
enabled: true
url: 【OnlineConverterサーバーのURL】
OnlineConverterサーバーの実装
-
build.gradle の dependencies に以下の設定を追記する
compile 'org.jodconverter:jodconverter-spring-boot-starter:4.1.0'
-
application.yml に LibreOffice のインストール先を設定する
application.yml
jodconverter:
enabled: true
officeHome: 【LibreOffice インストール先】
- リクエストを受け取るための Controller を実装する
- MultipartFile で変換元のファイルの受け取りを行う
- outputExtension で変換後の拡張子を指定する
@RestController
public class SampleController {
@Autowired
private DocumentConverter documentConverter;
@RequestMapping(path = "/api/jodconverter/lool/convert-to/{outputExtension}", method = RequestMethod.POST)
public Resource convert(
@RequestParam("data") MultipartFile file,
@PathVariable("outputExtension") String outputExtension
) throws IOException, OfficeException {
// 変換前ファイル情報取得
String inputExtension = FilenameUtils.getExtension(file.getOriginalFilename());
DocumentFormatRegistry registry = this.documentConverter.getFormatRegistry();
DocumentFormat inputFormat = registry.getFormatByExtension(inputExtension);
if (inputFormat == null) {
inputFormat = registry.getFormatByExtension("xlsx");
}
// 変換後拡張子設定
DocumentFormat outputFormat = registry.getFormatByExtension(outputExtension);
// 変換処理
try (
InputStream is = file.getInputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream();
) {
this.documentConverter.convert(is).as(inputFormat).to(os).as(outputFormat).execute();
return new ByteArrayResource(os.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
まとめ
OnlineConverter は今まで使う機会がなかったため、使い方の勉強になった。
ただ、LocalConverter のほうが OnlineConverter 利用時のサーバーの実装がない分簡単に導入できるので、
よほどの理由がない限り使わないかな。。。