SpringBoot + JODConverter で OnlineConverter を使ってみた


概要

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/【変換先の拡張子】という形で送信される
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 利用時のサーバーの実装がない分簡単に導入できるので、
よほどの理由がない限り使わないかな。。。