トイ・プロジェクトどしてubuntuサーバでexcelファイルをpdfで変換しようとしました。
excelファイルをpdfに変換の際、よく使われる方法はpywin32を用いてpdfで変換するのですが、問題は
windows OS だけで動く
のが問題でした。僕の場合はLinuxで動作するのが必要でした。
なので探した方法は二つがありました。
1. Adobe Developer site のAPIを利用する。
Adobe Developer Siteを見るとpdf関連apiをAdobe社が提供することがわかります。自分が開発者で登録してAPIキーをもらって使います。珍しいのはAPIがzipファイルで提供されますが、このAPIキーがそのまま適用されています。別に設定ファイルを触る必要はないです。
java, nodejs, ・netは全部支援し、pythonはpdfからテキストを洗いだすのみ支援するので注意して下さい。
2. unoserverを設置して利用する
Adobeの開発者で登録するのは有効期間があって更新するべきし、言語の制約もあるのでちょっと不便です。それで改めて探した方法はubuntu用のlibreofficeを使用することでした。
でもpdf変換のためにlibreoffice全体をインストールするのはかなり時間もかかるし、サイズも大きいです。そのためlibreofficeの変換機能だけをREST APIで提供するのがunoserverです。これをdocker container化して誰かがhub.docker.comで共有しました。
適当なAlphine versionを選択して(ここには「edge」を選びました)docker pullをもらってdocker containerを立ち上げます。内部ポートは2004番を使うのでポート・マッピングを2004でさせました。
docker pull libreofficedocker/libreoffice-unoserver:edge
docker run -d --name unoserver -p 2004:2004 libreofficedocker/libreoffice-unoserver:edge
これでunoserverをubuntuサーバに立ち上げました。
さ…簡単にテストをやってみましょう。クライアントはcurlを用いました。exceltest.xlsxをfile.pdfで変換の結果は下のようです。
curl -s -v \
--request POST \
--url http://127.0.0.1:2004/request \
--header 'Content-Type: multipart/form-data' \
--form "file=@/home/ubuntu/exceltest.xlsx" \
--form 'convert-to=pdf' \
--output 'file.pdf'
遂行結果は下のようです。
* Trying 127.0.0.1:2004...
* Connected to 127.0.0.1 (127.0.0.1) port 2004 (#0)
> POST /request HTTP/1.1
> Host: 127.0.0.1:2004
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 39785
> Content-Type: multipart/form-data; boundary=------------------------996e3a5643b7c2b7
>
} [39785 bytes data]
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Content-Length: 157671
< Content-Type: application/pdf
< Last-Modified: Mon, 01 Apr 2024 15:39:51 GMT
< Date: Mon, 01 Apr 2024 15:39:51 GMT
<
{ [3917 bytes data]
* Connection #0 to host 127.0.0.1 left intact
file.pdfが正確にできました。