印刷・PDF変換を自動化!! LibreOfficeをコマンドラインから使用する

2018年9月29日土曜日

t f B! P L

印刷・PDF変換を自動化!! LibreOfficeをコマンドラインから使用する

LibreOffceタイトル

LibreOffice(リブレオフィス)とは

Windows, Mac OS, Linux などのOSで動作する Offce アプリケーションです。
Microsoft Office などの Offce系アプリと相互互換性があります。

今回やる事

LibreOffice にはコマンドライン機能があり、
コマンドだけで Excel を PDF に変換できたりします。
今回は、このコマンド機能について色々試してみようと思います。

LibreOffice のコマンド構文

[構文]
{install}/program/soffice {parameter}}

[使用可能な parameter]

--help / -h / -?           ヘルプを表示 します。
--version                  バージョンを表示
--writer                   起動時に、空白の Writer ドキュメントを開く
--calc                     起動時に、空白の Calc ドキュメントを開く
--draw                     起動時に、空白の Draw ドキュメントを開く
--impress                  起動時に、空白の Impress ドキュメントを開く
--math                     起動時に、空白の Math ドキュメントを開く
--global                   起動時に、空白の Writer マスタドキュメントを開く
--web                      起動時に、空白の HTML 形式ドキュメントを開く
--show {filename.odp}      Impress ファイルを開いて、プレゼンテーションを開始する
--minimized                起動時に、ウィンドウを最小化
--invisible                非表示モードで起動。
                           画面には何も表示させず、API 経由で処理を行うような場合に使用。
                           また、終了時は kill コマンド等で、プロセスを自分で終了させる必要があります。
--norestore                LibreOffice のシステムに障害が発生した場合の再起動およびファイルの復元機能を使用不可にします。
--nofirststartwizard       開始ウィザードを無効化
--quickstart               クイックスタートを開始します。
--accept={UNO string}      LibreOffice ソフトウェアに対して、「UNO Acceptor Threads」の作成時に「UNO Accept String」を使用するよう通知します。詳細情報については、LibreOffice デベロッパー向けガイド を参照してください。
--unaccept={UNO string}    --accept = {UNO string}で作成されたアクセプタを閉じます。 開いているアクセプタをすべて閉じるには、 - unaccept = allを使用します。
-o {filename}              {filename} で指定するファイルを、テンプレートの場合も含めて、編集可能な状態で開くようにします。
--view {filename}          {filename} で指定するファイルのコピーを一時的に作成し、読み取り専用で開きます。
-n {filename}              {filename} で指定するファイルをテンプレートとして、新規ドキュメントを作成します。
--nologo                   起動時のスプラッシュ画面を非表示
--nodefault                起動時にスプラッシュ画面以外は何も表示しない。
--display {display}        Sets the DISPLAY environment variable on UNIX-like platforms to the value {display}. This parameter is only supported by the start script for the LibreOffice software on UNIX-like platforms

-p {filename1} {filename2} ...                   
       指定されたファイルをデフォルトプリンターで印刷して終了します。
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
--pt {Printername} {filename1} {filename2} ...   
       指定されたファイルを {Printername} で指定するプリンターで印刷して終了させます。
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
--headless                
       ユーザーインターフェイスなしでアプリケーションを使用できる「ヘッドレスモード」で起動します。
       この特殊モードは、アプリケーションがAPIを介して外部クライアントによって制御される場合に使用できます。
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
--infilter={filter}
       orces an input filter type, if possible. Eg. --infilter="Calc Office Open XML".
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
--convert-to output_file_extension[:output_filter_name] [--outdir output_dir] files
       ファイルの変換を行います。(このコマンドについては詳細を後述します)
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- 
--print-to-file [--printer-name printer_name] [--outdir output_dir] files
       ファイルをファイルにバッチプリントします。

ユースケース別の使用例

(case 1) LibreOffice ドキュメントを PDF に変換する

PDF への変換は --convert-to コマンドで行います。
変換可能はファイルは以下の通りです。

  • .doc, .docx (MS Word形式)
  • .xls, .xlsx (MS Excel形式)
  • .ppt, .pptx (MS Power Point形式)
  • .txt (テキストファイル)
  • .html (HTMLドキュメント)
  • .odt, .ods などの LibreOffice ドキュメント

[変換を行うコマンドのサンプル]

# Writer ドキュメントを PDF 変換し、カレントディレクトリに出力します
soffice  --headless --convert-to pdf filename.doc

# Writer ドキュメントを PDF 変換し、-outdirで指定したディレクトに出力します
soffice  --headless --convert-to pdf -outdir /home/user filename.doc 

# ワイルドカード指定で、複数のファイルを一括で PDF に変換する
soffice  --headless --convert-to pdf -outdir /home/user *.doc 

(case 2) LibreOffice ドキュメントを 自動的に印刷する

[やりたい事]
出力するプリンタ毎にフォルダを作成し、
ドキュメント作成時に、指定プリンタに自動プリントしてみます。
※ PowerShell と LibreOffice のコマンドを組み合わせて実現します。
これは帳票作成は1つのサーバで集中作成するけど、
プリントは別々のプリンタで行いたい場合に便利です。

(1) 印刷を行うプリンタの数だけ、フォルダを作成します。

rootpath/  
 ├ printername1/
 │    ここに印刷ドキュメントを配置
 ├ printername2/
 │    ここに印刷ドキュメントを配置
 ・・・

(2) ドキュメントの作成を監視するスクリプトを作成します。

[powershell でのサンプル]

$dir = $Args[0] #引数に監視を行うディレクトリを渡します
 
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "$dir"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true 
 
$action = { $path = $Event.SourceEventArgs.FullPath
            $printer = ((Get-Item $path).Directory).Name
            soffice --pt $printer $path
          }    
 
# ファイル作成のイベントが発火したら、印刷アクションを呼ぶ
Register-ObjectEvent $watcher "Created" -Action $action

# 無限ループ
while ($true) {sleep 1}

実運用で利用するには、ファイルの監視を行う powershell を
Start-Job で別の powershell からバックグラウンドジョブとして呼び出して下さい。

LibreOffice Calcで1シート目しか印刷されない問題

LibreOffice Calc で複数シートを印刷する時に、
1枚目のシートしか印刷できなない問題が発生する場合があります。
その時は、↓の設定を行う事で、複数シートの印刷が行えるようになります。

  • 印刷したい全てのシートを選択したあと,「書式>印刷範囲>追加」をする.
  • 印刷したい全てのシートを選択したあと,「書式>印刷範囲>編集」で「シート全体」に設定する.
スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ