WebアプリでPDF文書を自動生成 on Ubuntu20.04 LTS

# 関連記事一覧

LibreOfficeでPDF文書を自動生成
https://qiita.com/nanbuwks/items/8ea939ad497fec29c069

LibreOffice で MySQL連動 PDF帳票を作る
https://qiita.com/nanbuwks/items/d4696542760cf4b8a24a

WebアプリでPDF文書を自動生成 on Ubuntu14.04 LTS
https://qiita.com/nanbuwks/items/7dbd2a0a79b232f864b4

WebアプリでPDF文書を自動生成 on Ubuntu20.04 LTS (この記事)
https://qiita.com/nanbuwks/items/f11e4e3aabac33f9a32b

# 概要


「WebアプリでPDF文書を自動生成 on Ubuntu14.04 LTS」
https://qiita.com/nanbuwks/items/7dbd2a0a79b232f864b4

ではサーバ版の Ubuntu を使ったので、libjpgをインストールしたりフォントをインストールしたりする必要がありました。

今回は、日本語デスクトップ版 Ubuntu を使い、あらかじめターミナル操作で PDF が生成できるようにすることで理解のしやすいやりかたを説明します。



# 環境


- Ubuntu 20.04 LTS ja Desktop
- LibreOffice 6.4.6.2 40(Build:2)
- PHP 7.4.3
- Apache/2.4.41 (Ubuntu)

# 事前準備

## LAMP

ApacheとPHPはインストールして、PHPが実行できるようにしておきます。



## PDF作成環境
「LibreOffice で MySQL連動 PDF帳票を作る」
https://qiita.com/nanbuwks/items/d4696542760cf4b8a24a
でローカル操作で PDF が生成できるようにしておきます。

## 作業ディレクトリ作成

スクリプトやテンプレートを置くディレクトリを作成し、www-data で書き込みできるようにしておきます。
今回の例ではわかりやすく /var/www/html/mkpdf としました。
なお、このような外部からWebアクセスできるディレクトリに配置するのはセキュリティ的な心配がない場合に限り、通常は外部からWebアクセスできないディレクトリに配置するのが望ましいです。

## テンプレートファイル設置

Libreofficeでテンプレートファイルを作り、作業ディレクトリに配置します。今回は「テンプレート.ods」としました。

# スクリプトを作成

以下の mkpdf.sh を作成し、作業ディレクトリに配置します。

```

cp $1 $1.work
rm content.xml
unzip $1.work content.xml
xmllint --format content.xml > original_xmllint.xml
python3 db.py original_xmllint.xml $2 | sed s/##TODAY##/"`date +%Y年%-m月%-d日`"/g  > content.xml
zip $1.work content.xml
soffice --headless --convert-to pdf $1.work
```

としておきます。

```

$ python3 mkpdf.sh テンプレート.ods 123

```

として、テンプレート.ods.pdf が正常にできていることを確認します。


# phpを作成

mkpdf.php を /var/www/html/mkpdf/ に配置します。

```

<!DOCTYPE HTML><HTML><HEAD><META CHARSET=UTF-8>
<TITLE></TITLE> <link rel="stylesheet" href="style.css"></HEAD><BODY>
<?php


$key= $_GET["key"];
exec("./mkpdf.sh テンプレート.ods ".$key);

<HR>
<HR>
<iframe src="テンプレート.ods.pdf" name="sample" width="100%" height="400">
</iframe>
</BODY></HTML>

```

# 権限を付与

まずは作業ディレクトリの関連ファイルオーナーをwww-data とします。

```

$ sudo chown www-data:www-data *
```
次に mkpdf.php をブラウザで開いてみますが、うまく動いていないようです。

/var/log/apache2/error.log には以下のようにエラーが記録されていました。

```

(process:1000732): dconf-CRITICAL **: 22:05:32.478: unable to create directory '/var/www/.cache/dconf': Permission denied.  dconf will not work properly.
LibreOffice 6.4 - Fatal Error: The application cannot be started. 
User installation could not be completed. 
Unable to init server: Could not connect: Connection refused
```

dconf ってナンだ？ Linux でのアプリの設定を保存する仕組みだそうです。ユーザーのホームディレクトリに作成されるっぽいですね。
www-data でユーザーログオンして確認してみようとしたら・・・

```

$ sudo su - www-data
This account is currently not available.
```

となりました。 /etc/passwd で確認すると



```

www-data:x:33:33:www-data:/usr/sbin/nologin
```

となっていてログインできない設定になってますね。vipw で編集し、

```

www-data:x:33:33:www-data:/var/www:/bin/bash
```
としました。
ホームディレクトリが /var/www となりますが、

```

$ ls -alh /var/www
合計 12K
drwxr-xr-x  3 root root 4.0K  3月  9 22:35 .
drwxr-xr-x 15 root root 4.0K  3月  9 22:35 ..
```
となっているので

```
$ sudo chown -R www-data:www-data /var/www


```

とするとphpが実行でき、pdf が表示されました。

なお、このサーバでは  /var/www 以下を一括で www-data オーナーにしても問題ありませんが、セキュリティ要件との兼ね合いで適宜アレンジしてください。