#人生戦略実行マニュアル

悔いない人生への終活戦略立案と終活戦術実行

ConfluenceでPDFの日本語が表示されない問題の解決方法

概要

  • Keynote等で作成したPDFをConfluence(コンフルエンス)に添付したが、プレビューで日本語が消えてしまう

問題

 概要で記載の通りドキュメント管理を Confluence で一本化しようとしたが、PDFをアップロードしたときに日本語部分がきちんと表示されず困ってしまった。Atlassian に問い合わせたところ以前から起きているらしいが、解決策や暫定対策は特にないそうだ。

[CONFCLOUD-68832] Mac OS font character of multi-byte is missing when using PDF macro. - Create and track feature requests for Atlassian products.

 これは不便な上、Atlassianの優先度も低い(Low)ので、esa に戻るか違うドキュメントツールに乗り換えるか迷ったが、偶然解決策を見つけたのでここに記載しておく。

解決策

 まずは対策方法を記載。sedコマンドを使うので、LinuxMacによって叩き方が違うので注意。

## GNU(Linux), MacOS(High Sierra)はコッチみたい?
$ LANG=C LC_ALL=C sed -i '' s'|/Registry (Adobe) /Ordering (Japan1) /Supplement [0-9]|/Registry(Adobe) /Ordering(Identity) /Supplement 0|g' /path/to/pdf

## BSD(MacOSX)
$ LANG=C LC_ALL=C sed -i 's|/Registry (Adobe) /Ordering (Japan1) /Supplement [0-9]|/Registry(Adobe) /Ordering(Identity) /Supplement 0|g' /path/to/pdf

 上記コマンドによって、Confluenceでは使えない Adobe-Japan1-6Adobe-Identity-0 に変換することでフォントを表示することが可能となる。下記のエラーが出たら、GNUの方を使ってみてください。

invalid command code m

フォントの仕組みと本件の原因

 ここから仕組みを知りたい人向け。解決すればそれでいい人は閉じてどうぞ。

 原因を知りたい人は、まずは下記の画像を見てほしい。

引用:CMap・cmap(Character Map) | フォント用語集 | 文字の手帖 | 株式会社モリサワ

 私は今まで Unicodeの値(例:U+3042)がフォントファイル内でマッピングされているのかと思っていたが、そうではなかった。Unicodeとフォントの間に CMap/cmap を用いて、フォントと紐付けが行われている。

  • CMap:文字コードをPostScript言語で使われるCID(Character ID)フォントと紐付ける
  • cmap:CIDを元にGID(Glyph ID、TrueTypeまたはOpenTypeなど)フォントと紐付ける

 CIDには Adobe-Japan1-3~1-6, Adobe-Identity-0 などの種類があり(5種類以外にあるのかは不明)、Keynoteで生成されるPDFは Adobe-Japan1-6 のCIDで生成している。しかし、 Confluence では Adobe-Japan1-6 の CMap を持っていないため、日本語が表示されなくなってしまう。  Adobe-Identity-0 は Adobe-Japan1-6 の CMap が含んでいるため、切り替えることが可能であり、切り替え後も正しくマッピングされる。

 SlideShareも表示されないということは同じようなライブラリでも使っているのだろうか??

参考

 勉強になりました。ありがとうございます。

 SlideShareでハマっていた人の記事。これを見たときに Confluence も同じなのではとピンときた。

 上記の記事で回答されていた人の解説記事。原因について知りたい人はこちらを参照。

 上記の解説記事で紹介されていたCID/cmapの解説

 Adobeの資料

PDF構造解説

PDF構造解説