PDFのページ表示設定の謎を解く

<font color=gray>**Acrobat Pro** をお使いの方は本記事を読む必要はありません。<font>

# はじめに

**PDF** ファイルのページ表示設定を**恒久的に**変更したいのです。具体的には単一ページ表示を見開きページ表示に変更したり左綴じを右綴じを変更して，それを固定化したいのです。

前者については下記に示すように **Acrobat Reader** の表示メニューから**一時的に**表示状態を変更することができますが，ファイル自体を書き換えている訳ではありません。


```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
  fontSize 16
}
</style>
title
<img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/d8834c91-50c2-e7bd-7a2a-c2a1bd319df6.png>
図１　Acrobat Reader の表示メニュー
end title
@enduml
```

後者も同様です。

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
  fontSize 16
}
</style>
title
<img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/af7dc9fa-5f5d-fcb5-f877-349ffe354a1d.png>
図２　Acrobat Reader の環境設定メニュー
end title
@enduml
```

ということで，**PDF** ファイルを書き換えて，毎回 **Acrobat Reader** の設定を変更しなくて済むようにしたいのです。

本記事は，どこをどのように変更すれば良いのかについて調査したものであり，具体的な変更手段（ソフトウエア・ツール）については述べていません。詳しく知りたい方は下記の記事を参照下さい。

[電子書籍PDFを見開きページ表示にして右綴じに書き換えた話 - Qiita](https://qiita.com/TETSURO1999/items/2bf3bb129b6a7045ac01)

# ページ表示モードについて整理する

筆者の調査によると，**PDF** のページ表示モードは以下に示すように合計 10 種類あります。

<table>
<caption>表１　<b>PDF</b> のページ表示モード一覧</caption>
<thead>
<tr><th style="text-align:center">ページ表示</th>
    <th style="text-align:center">表示単位</th>
    <th style="text-align:center">読む方向</th>
    <th style="text-align:center">表紙ページ</th></tr>
</thead>
<tbody>
<tr></tr>
<tr><td rowspan=9 style="text-align:center">区切り有り<br>（ページ表示）</td>
    <td style="text-align:center">一度に１ページ表示</td>
    <td colspan=2></td></tr>
<tr></tr>
<tr><td rowspan=7 style="text-align:center">一度に２ページ表示</td>
    <td rowspan=3 style="text-align:center">左から右</td>
    <td style="text-align:center">有り</td></tr>
<tr></tr>
<tr><td style="text-align:center">無し</td></tr>
<tr></tr>
<tr><td rowspan=3 style="text-align:center">右から左</td>
    <td style="text-align:center">有り</td></tr>
<tr></tr>
<tr><td style="text-align:center">無し</td></tr>
<tr></tr>
<tr><td rowspan=9 style="text-align:center">区切り無し<br>（カラム表示）</td>
    <td style="text-align:center">１列で表示</td>
    <td colspan=2></td></tr>
<tr></tr>
<tr><td rowspan=7 style="text-align:center">２列で表示</td>
    <td rowspan=3 style="text-align:center">左から右</td>
    <td style="text-align:center">有り</td></tr>
<tr></tr>
<tr><td style="text-align:center">無し</td></tr>
<tr></tr>
<tr><td rowspan=3 style="text-align:center">右から左</td>
    <td style="text-align:center">有り</td></tr>
<tr></tr>
<tr><td style="text-align:center">無し</td></tr>
</tbody>
</table>


これらの表示モードを **PDF** ではカタログ辞書で設定しています。以下にカタログ辞書のサンプルを示します。このうち `PageLayout` と `ViewerPreferences` の `Direction` という二つのパラメータで表示モードを決定しています。 

```postscript:PDF のカタログ辞書の例
1 0 obj
<< /Type /Catalog
   /Pages 2 0 R
   /PageLayout /TwoPageRight
   /ViewerPreferences << /Direction /R2L >>
>>
endobj
```

このうち `PageLayout` は文書を開いたときに使われるページレイアウトを指定します。本パラメータを省略した場合はデフォルト値が採用されます。

<table>
<caption>表２　<code>PageLayout</code> の値</caption>
<thead>
<tr><th style="text-align:center">値</th>
    <th style="text-align:center">内容</th></tr>
</thead>
<tbody>
<tr></tr>
<tr><td><code>SinglePage</code></td>
    <td>一度に１ページを表示　※デフォルト</td></tr>
<tr></tr>
<tr><td><code>OneColumn</code></td>
    <td>ページを１列で表示</td></tr>
<tr></tr>
<tr><td><code>TwoColumnLeft</code></td>
    <td>奇数ページを左側にして２列で表示</td></tr>
<tr></tr>
<tr><td><code>TwoColumnRight</code></td>
    <td>奇数ページを右側にして２列で表示</td></tr>
<tr></tr>
<tr><td><code>TwoPageLeft</code></td>
    <td>一度に２ページを表示で，奇数ページを左側に表示</td></tr>
<tr></tr>
<tr><td><code>TwoPageRight</code></td>
    <td>一度に２ページを表示で，奇数ページを右側に表示</td></tr>
</tbody>
</table>

一方，`ViewerPreferences` の `Direction` はテキストを読み進める際にページをめくる決まった順序を指定します。本パラメータも省略可能です。左綴じなら `L2R`，右綴じなら `R2L` と一対一に対応しているため分かり易いでしょう。

<table>
<caption>表３　<code>ViewerPreferences</code> の <code>Direction</code> の値</caption>
<thead>
<tr><th style="text-align:center">値</th>
    <th style="text-align:center">内容</th></tr>
</thead>
<tbody>
<tr></tr>
<tr><td><code>L2R</code></td>
    <td>左から右へ　※デフォルト</td></tr>
<tr></tr>
<tr><td><code>R2L</code></td>
    <td>右から左へ（中国語，韓国語，日本語など縦書きの場合）</td></tr>
<tr></tr>
</tbody>
</table>

# 表紙を表示（表紙ページを単独表示）の実現方法

これまで表紙を表示（表紙ページを単独表示）はどうやって実現しているのか疑問だったのです。表紙の表示をオン／オフさせる第３のパラメータが存在するのだろうかと最新版の **PDF** 仕様を眺めてもそれらしい項目は見つかりませんでした。

そこで，よくよく **PDF** の仕様書を見直すと

> `TwoPageLeft` 奇数ページを左側にして２列で表示

ということに気づきました。`TwoPage` ではなく `TwoPageLeft` なのです。`TwoPageLeft` は一度に２ページ表示させるという意味に加えて，奇数ページを左側に配置するという意味も持ちます。このため右側にある偶数ページが左側の奇数ページよりも大きいときは左から右に読む `L2R`，すなわち左綴じとなります。このとき（単独で表示される）表紙ページはありません。一方，右側にある偶数ページが左側の奇数ページよりも小さいときは右から左に読む `R2L`，すなわち右綴じとなります。左側の奇数ページが 1 のとき右側の偶数ページが 0 になることはないので，ページ 1 を表紙ページとして単独表示させます。

以上より，表紙ページがない場合は，

- 右綴じ `R2L` の場合 `TwoPageRight` もしくは `TwoColumnRight`
- 左綴じ `L2R` の場合 `TwoPageLeft` もしくは `TwoColumnLeft`

とし，表紙ページを単独表示させたい場合は，

- 右綴じ `R2L` の場合 `TwoPageLeft` もしくは `TwoColumnLeft`
- 左綴じ `L2R` の場合 `TwoPageRight` もしくは `TwoColumnRight`

と `PageLayout` の設定を左右反転させる必要があるのです。

$\Huge\color{red}{\textsf{仕　様　が　分　か　り　に　く　い　わ！}}$

# まとめ

今回得られた結論を図３および図４にまとめました。

### ページ表示モードのとき

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M35 10  v70 h50 v-70" fill="black" />
<path d="M36 11  v68 h48 v-68" fill="white" />
<path d="M35 85  v70 h50 v-70" fill="black" />
<path d="M36 86  v68 h48 v-68" fill="white" />
<path d="M35 160 v70 h50 v-70" fill="black" />
<path d="M36 161 v68 h48 v-68" fill="white" />
<text x="35" y="65"  font-size="50" fill="black">１</text>
<text x="35" y="140" font-size="50" fill="black">２</text>
<text x="35" y="215" font-size="50" fill="black">３</text>
</svg>
title
<$FIGURE>
一度に１頁表示


<back:#eeeeee><font:monospaced>SinglePage</font></back>


<size:16>図３－１</size>
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M10 10  v70 h100 v-70" fill="black" />
<path d="M11 11  v68 h98  v-68" fill="white" />
<path d="M10 85  v70 h100 v-70" fill="black" />
<path d="M11 86  v68 h98  v-68" fill="white" />
<path d="M10 160 v70 h100 v-70" fill="black" />
<path d="M11 161 v68 h98  v-68" fill="white" />
<path d="M60 11  v68 h1 v-68" fill="lightgray" />
<path d="M60 86  v68 h1 v-68" fill="lightgray" />
<path d="M60 161 v68 h1 v-68" fill="lightgray" />
<text x="10" y="65"  font-size="50" fill="black">１</text>
<text x="60" y="65"  font-size="50" fill="black">２</text>
<text x="10" y="140" font-size="50" fill="black">３</text>
<text x="60" y="140" font-size="50" fill="black">４</text>
<text x="10" y="215" font-size="50" fill="black">５</text>
<text x="60" y="215" font-size="50" fill="black">６</text>
</svg>
title
<$FIGURE>
一度に２頁表示
(左綴じ)

<back:#eeeeee><font:monospaced>TwoPageLeft</font></back>
<back:#eeeeee><font:monospaced>(L2R)</font></back>

<size:16>図３－２</size>
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M60 10  v70 h50 v-70" fill="black" />
<path d="M61 11  v68 h48 v-68" fill="white" />
<path d="M10 85  v70 h100 v-70" fill="black" />
<path d="M11 86  v68 h98  v-68" fill="white" />
<path d="M10 160 v70 h100 v-70" fill="black" />
<path d="M11 161 v68 h98  v-68" fill="white" />
<path d="M60 86  v68 h1 v-68" fill="lightgray" />
<path d="M60 161 v68 h1 v-68" fill="lightgray" />
<text x="60" y="65"  font-size="50" fill="black">１</text>
<text x="10" y="140" font-size="50" fill="black">２</text>
<text x="60" y="140" font-size="50" fill="black">３</text>
<text x="10" y="215" font-size="50" fill="black">４</text>
<text x="60" y="215" font-size="50" fill="black">５</text>
</svg>
title
<$FIGURE>
一度に２頁表示
(左綴じ，表紙有)

<back:#eeeeee><font:monospaced>TwoPageRight</font></back>
<back:#eeeeee><font:monospaced>(L2R)</font></back>

<size:16>図３－３</size>
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M10 10  v70 h100 v-70" fill="black" />
<path d="M11 11  v68 h98  v-68" fill="white" />
<path d="M10 85  v70 h100 v-70" fill="black" />
<path d="M11 86  v68 h98  v-68" fill="white" />
<path d="M10 160 v70 h100 v-70" fill="black" />
<path d="M11 161 v68 h98  v-68" fill="white" />
<path d="M60 11  v68 h1 v-68" fill="lightgray" />
<path d="M60 86  v68 h1 v-68" fill="lightgray" />
<path d="M60 161 v68 h1 v-68" fill="lightgray" />
<text x="10" y="65"  font-size="50" fill="black">２</text>
<text x="60" y="66"  font-size="50" fill="black">１</text>
<text x="10" y="140" font-size="50" fill="black">４</text>
<text x="60" y="140" font-size="50" fill="black">３</text>
<text x="10" y="215" font-size="50" fill="black">６</text>
<text x="60" y="215" font-size="50" fill="black">５</text>
</svg>
title
<$FIGURE>
一度に２頁表示
(右綴じ)

<back:#eeeeee><font:monospaced>TwoPageRight</font></back>
<back:#eeeeee><font:monospaced>(R2L)</font></back>

<size:16>図３－４</size>
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M10 10  v70 h50 v-70" fill="black" />
<path d="M11 11  v68 h48 v-68" fill="white" />
<path d="M10 85  v70 h100 v-70" fill="black" />
<path d="M11 86  v68 h98  v-68" fill="white" />
<path d="M10 160 v70 h100 v-70" fill="black" />
<path d="M11 161 v68 h98  v-68" fill="white" />
<path d="M60 86  v68 h1 v-68" fill="lightgray" />
<path d="M60 161 v68 h1 v-68" fill="lightgray" />
<text x="10" y="65"  font-size="50" fill="black">１</text>
<text x="10" y="140" font-size="50" fill="black">３</text>
<text x="60" y="140" font-size="50" fill="black">２</text>
<text x="10" y="215" font-size="50" fill="black">５</text>
<text x="60" y="215" font-size="50" fill="black">４</text>
</svg>
title
<$FIGURE>
一度に２頁表示
(右綴じ，表紙有)

<back:#eeeeee><font:monospaced>TwoPageLeft</font></back>
<back:#eeeeee><font:monospaced>(R2L)</font></back>

<size:16>図３－５</size>
end title
@enduml
```

### カラム表示モードのとき

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M35 25 v210 h50 v-210" fill="black" />
<path d="M36 26 v208 h48 v-208" fill="white" />
<path d="M36 95  h48 v1 h-48" fill="lightgray" />
<path d="M36 165 h48 v1 h-48" fill="lightgray" />
<text x="35" y="80"  font-size="50" fill="black">１</text>
<text x="35" y="150" font-size="50" fill="black">２</text>
<text x="35" y="220" font-size="50" fill="black">３</text>
</svg>
title
<$FIGURE>
１列で表示


<back:#eeeeee><font:monospaced>OneColumn</font></back>


<size:16>図４－１</size>
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M10 25 v210 h100 v-210" fill="black" />
<path d="M11 26 v208 h98  v-208" fill="white" />
<path d="M11 95  h98 v1 h-98" fill="lightgray" />
<path d="M11 165 h98 v1 h-98" fill="lightgray" />
<path d="M60 26 v208 h1 v-208" fill="lightgray" />
<text x="10" y="80"  font-size="50" fill="black">１</text>
<text x="60" y="80"  font-size="50" fill="black">２</text>
<text x="10" y="150" font-size="50" fill="black">３</text>
<text x="60" y="150" font-size="50" fill="black">４</text>
<text x="10" y="220" font-size="50" fill="black">５</text>
<text x="60" y="220" font-size="50" fill="black">６</text>
</svg>
title
<$FIGURE>
２列で表示
(左綴じ)

<back:#eeeeee><font:monospaced>TwoColumnLeft</font></back>
<back:#eeeeee><font:monospaced>(L2R)</font></back>

<size:16>図４－２</size>
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M60 25 v70 h-50 v140 h100 v-210" fill="black" />
<path d="M61 26 v70 h-50 v138 h98  v-208" fill="white" />
<path d="M61 95  h48 v1 h-48" fill="lightgray" />
<path d="M11 165 h98 v1 h-98" fill="lightgray" />
<path d="M60 96 v138 h1 v-138" fill="lightgray" />
<text x="60" y="80"  font-size="50" fill="black">１</text>
<text x="10" y="150" font-size="50" fill="black">２</text>
<text x="60" y="150" font-size="50" fill="black">３</text>
<text x="10" y="220" font-size="50" fill="black">４</text>
<text x="60" y="220" font-size="50" fill="black">５</text>
</svg>
title
<$FIGURE>
２列で表示
(左綴じ，表紙有)

<back:#eeeeee><font:monospaced>TwoColumnRight</font></back>
<back:#eeeeee><font:monospaced>(L2R)</font></back>

<size:16>図４－３</size>
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M10 25 v210 h100 v-210" fill="black" />
<path d="M11 26 v208 h98  v-208" fill="white" />
<path d="M11 95  h98 v1 h-98" fill="lightgray" />
<path d="M11 165 h98 v1 h-98" fill="lightgray" />
<path d="M60 26 v208 h1 v-208" fill="lightgray" />
<text x="10" y="80"  font-size="50" fill="black">２</text>
<text x="60" y="80"  font-size="50" fill="black">１</text>
<text x="10" y="150" font-size="50" fill="black">４</text>
<text x="60" y="150" font-size="50" fill="black">３</text>
<text x="10" y="220" font-size="50" fill="black">６</text>
<text x="60" y="220" font-size="50" fill="black">５</text>
</svg>
title
<$FIGURE>
２列で表示
(右綴じ)

<back:#eeeeee><font:monospaced>TwoColumnRight</font></back>
<back:#eeeeee><font:monospaced>(R2L)</font></back>

<size:16>図４－４</size>
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
title {
  fontStyle normal
}
</style>
sprite FIGURE <svg width="120" height="240">
<path d="M10 25 v210 h100 v-140 h-50 v-70" fill="black" />
<path d="M11 26 v208 h98  v-138 h-50 v-70" fill="white" />
<path d="M11 95  h48 v1 h-48" fill="lightgray" />
<path d="M11 165 h98 v1 h-98" fill="lightgray" />
<path d="M60 96 v138 h1 v-138" fill="lightgray" />
<text x="10" y="80"  font-size="50" fill="black">１</text>
<text x="10" y="150" font-size="50" fill="black">３</text>
<text x="60" y="150" font-size="50" fill="black">２</text>
<text x="10" y="220" font-size="50" fill="black">５</text>
<text x="60" y="220" font-size="50" fill="black">４</text>
</svg>
title
<$FIGURE>
２列で表示
(右綴じ，表紙有)

<back:#eeeeee><font:monospaced>TwoColumnLeft</font></back>
<back:#eeeeee><font:monospaced>(R2L)</font></back>

<size:16>図４－５</size>
end title
@enduml
```
# 備考

市販の **PDF** の中には

- 表紙を表示
- 見開きページ表示
- 右から左へ読む

という右綴じ（いわゆる和書）の設定になっているものが多いのですが，本記事の理論によれば

- `PageLayout` は `TwoPageLeft` もしくは `TwoColumnLeft`
- `ViewerPreferences` の `Direction` は `R2L`

となっているはずなのです。しかし何故か`PageLayout` が `TwoPageRight` という設定になっているものがあります。これで正しく読めるのでそのままにしていますが，何故正しく読めるのかは分かっていません。

本件については継続調査中です。進展があり次第，追加報告記事を書きたいと思います。

# 参考文献

- [横浜工文社　荒井文吉，手書きPDF入門，1999年11月](https://kobu.com/docs/pdf/pdfxhand.htm)

- アドビシステムズ，PDFリファレンス第2版 (Version 1.3)，2001年9月

- [アドビシステムズ，PDFリファレンス第6版 (Version 1.7)，2006年6月 <img width=16 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/66e66c9d-a6f3-f215-951a-9d79cc94a9d6.png">](https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/pdfreference1.7old.pdf)

- [アドビシステムズ，ISO 32000-1 規格書，2008年7月 <img width=16 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/66e66c9d-a6f3-f215-951a-9d79cc94a9d6.png">](https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/PDF32000_2008.pdf)

- [PDFを扱う開発のお供にQPDFのすすめ - Qiita](https://qiita.com/ssc-ynakamura/items/343e3669c216c8e23e1b)