見出し画像

スライドの見た目なおしプロジェクト - PDF に含まれるフォント情報からスライドアップロードサービス上で適切に文字が解釈されるかを知りたかった

サイボウズ株式会社 開発本部 PeopleExperience チーム Developer Concourse Unit の西原 ( @tomio2480 ) です.スライドをよくする会の活動報告記事です.スライドをよくする会とは,Web 上のスライドアップロードサービスにアップロードした PDF が正しく解釈され,文字起こしの文字化けや太字をはじめとする表示の乱れが消滅する未来を目指した取り組みです.


pdffonts が吐き出す情報のみで機械的に判定することは難しそう

最初に今回の中間報告の結論を書きましたが,まさにこのとおりです.以前の記事で,アップロードした PDF が文字化けを起こしたり,太字の掠れを起こしたりする現象を,アップロード前に見つけるために pdffonts コマンドを使ってあたりをつけようと書きました.

しかし今回,問題の起こっている PDF をいくつか無作為に抽出して,pdffonts の結果をみたところ,必ずしも以前考えた pdffonts の結果パターンでは特定できないことがわかりました.

以下に問題が発生しているスライドと,pdffonts の結果の対を掲載します.

文字起こしの文字化けのみが起きている事例

ただし,文字起こしの文字化けにもパターンがあるため,全てを同じに扱うことはできないのかなと思っています.もしかすると,問題の起源は同じでも対策は同一で構わない可能性もありますが,そこもわかっていません.

その時、スクラムマスターが動いた —最高のチームワークを実現するために— / A mind of SCRUM MASTER

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
CQGWQW+AvenirNext-Bold                         TrueType          yes yes no            9  0
LDQESH+AvenirNext-Medium                       TrueType          yes yes no           10  0
TZFREJ+HiraginoSans-W6                         CID Type 0C       yes yes no            8  0
VQPLNA+HiraginoSans-W4                         CID Type 0C       yes yes no           20  0
UPVPCD+HiraKakuProN-W3                         CID Type 0C       yes yes no           69  0
VUQFGL+17                                      TrueType          yes yes yes          62  0
KDNLWA+LucidaGrande-Bold                       TrueType          yes yes yes         108  0
SpeakerDeck 「その時、スクラムマスターが動いた —最高のチームワークを実現するために— / A mind of SCRUM MASTER」リンク先のスライドの文字起こしが文字化けしている様子のスクリーンショットです
よくある黄金文字化けパターン

よくみる文字化けパターンと書きましたが,他にどんなパターンが見られるかの例については,前回の記事をご覧ください.様々な国の文字だけでなく,記号が現れることもあります.

欧文フォントである AvenirNext は化けずに,日本語フォントである HiraginoSans と HirakakuProN が化けている雰囲気を感じます.ここの ToUnicode CMap が存在しないことに原因があるのかなと思っていますが,実際どうなのかは検証していません.

ToUnicode CMap という専門用語が出ましたが,端的に必要な知識が全て述べられている素晴らしいページがありますので,ここにリンクします.

簡単に説明すると,文字情報から文字見た目情報であるグリフへの変換を行う CMap あるいは cmap という変換テーブルが存在し,PDF から文字情報を取り出すためには,その逆変換を行う ToUnicode CMap というテーブルを用いて(ToUnicode CMap の情報が正しい情報であれば)正確に戻すことができるはずです.文字セットによってはこれがない方がうまく機能する,と先のリンク先にも書いてあるように,必ずしもこの ToUnicode CMap が含まれないからといって,うまく文字情報を取り出せないわけではありません.このあたりも素晴らしいページがあるので,リンクしておきます.

スクラムマスターが見たサイボウズの変化 -アジャイルの先にあるもの- / EASG

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
EZMNRW+AvenirNext-Bold                         TrueType          yes yes no            9  0
PRVZHM+AvenirNext-Medium                       TrueType          yes yes no           10  0
YLPHAR+HiraginoSans-W6                         CID Type 0C       yes yes no            8  0
UWSOXZ+HiraginoSans-W4                         CID Type 0C       yes yes no           11  0
DWAGAP+AppleColorEmoji                         TrueType          yes yes yes          34  0
MXKFYQ+HiraKakuProN-W6                         CID Type 0C       yes yes no           84  0
QIUYZK+HiraKakuProN-W3                         CID Type 0C       yes yes no           85  0
DNFSDD+AvenirNext-Regular                      TrueType          yes yes no           86  0
PLKNKR+HiraKakuProN-W3                         CID Type 0C       yes yes no          263  0
WAEHTI+17                                      TrueType          yes yes yes         256  0
SpeakerDeck 「スクラムマスターが見たサイボウズの変化 -アジャイルの先にあるもの- / EASG」リンク先のスライドの文字起こしが文字化けしている様子のスクリーンショットです
こちらも黄金文字化けパターン

最初の事例と同じ方が作られているため,使われているフォントも同じパターンのように見受けられます.どうでもいいことですが,AvenirNext-Medium と AvenirNext-Regular がいるのが気になりました.

KubeCon+CNConに見るetcdの未来

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
TFWZYD+AvenirNext-DemiBold                     TrueType          yes yes no            9  0
TKHSOK+AvenirNext-Regular                      TrueType          yes yes no           11  0
GFGMCG+HiraKakuProN-W6                         CID Type 0C       yes yes no           10  0
BJUKNJ+HiraKakuProN-W3                         CID Type 0C       yes yes no           12  0
YFMIBI+HiraKakuProN-W3                         CID Type 0C       yes yes no           23  0
QOQOQP+HiraKakuProN-W6                         CID Type 0C       yes yes no           24  0
ERBRND+ArialMT                                 TrueType          yes yes yes          21  0
JYVKLH+AvenirNext-Regular                      TrueType          yes yes no           22  0
WOMEIW+ArialMT                                 TrueType          yes yes yes          55  0
IPSXHC+AvenirNext-Regular                      TrueType          yes yes no           57  0
LPSHSX+HiraKakuProN-W3                         CID Type 0C       yes yes no           56  0
PRUFZP+HiraginoSans-W3                         CID Type 0C       yes yes no           58  0
NYHHBJ+AvenirNext-DemiBold                     TrueType          yes yes no           53  0
UWMANR+ArialMT                                 TrueType          yes yes yes          71  0
CIILAS+AvenirNext-Regular                      TrueType          yes yes no           72  0
MSKFUX+HiraKakuProN-W6                         CID Type 0C       yes yes no           69  0
CNQSXV+AvenirNext-DemiBold                     TrueType          yes yes no           68  0
BFFTZB+AvenirNext-DemiBold                     TrueType          yes yes no           78  0
ESOBKD+HiraKakuProN-W3                         CID Type 0C       yes yes no           82  0
DNMFGJ+ArialMT                                 TrueType          yes yes yes          80  0
KPQGEK+HiraginoSans-W3                         CID Type 0C       yes yes no           83  0
MLJOMQ+AvenirNext-Regular                      TrueType          yes yes no           81  0
MFGJRW+AvenirNext-DemiBold                     TrueType          yes yes no           89  0
NKLYXD+HiraKakuProN-W6                         CID Type 0C       yes yes no           90  0
QYOQYJ+AvenirNext-Regular                      TrueType          yes yes no           91  0
MSCHYE+HiraKakuProN-W6                         CID Type 0C       yes yes no           98  0
PXQQBG+HiraKakuProN-W3                         CID Type 0C       yes yes no          102  0
JKVJDT+AvenirNext-DemiBold                     TrueType          yes yes no           97  0
TSXYAK+HiraginoSans-W3                         CID Type 0C       yes yes no          103  0
WLZKBJ+ArialMT                                 TrueType          yes yes yes         100  0
SNBDZJ+AvenirNext-Regular                      TrueType          yes yes no          101  0
SHQIUA+AvenirNext-Regular                      TrueType          yes yes no          113  0
OVHZUR+AvenirNext-DemiBold                     TrueType          yes yes no          123  0
HEFVHM+ArialMT                                 TrueType          yes yes yes         126  0
DBVPUM+AvenirNext-Regular                      TrueType          yes yes no          127  0
AGRULI+HiraKakuProN-W6                         CID Type 0C       yes yes no          124  0
PZYNTT+HiraKakuProN-W3                         CID Type 0C       yes yes no          128  0
JNBGFJ+AvenirNext-DemiBold                     TrueType          yes yes no          134  0
POAKLG+AvenirNext-Regular                      TrueType          yes yes no          136  0
SVXHSL+HiraKakuProN-W6                         CID Type 0C       yes yes no          135  0
WBRFHJ+HiraKakuProN-W6                         CID Type 0C       yes yes no          142  0
FOBVQL+HiraginoSans-W3                         CID Type 0C       yes yes no          146  0
MCBWCU+ArialMT                                 TrueType          yes yes yes         145  0
AGUOJT+AvenirNext-Regular                      TrueType          yes yes no          147  0
UEOQKO+AvenirNext-DemiBold                     TrueType          yes yes no          143  0
LYLYVV+HiraginoSans-W3                         CID Type 0C       yes yes no          153  0
VSMNKK+AvenirNext-Regular                      TrueType          yes yes no          154  0
SZPFXW+AvenirNext-DemiBold                     TrueType          yes yes no          164  0
EZRVRH+HiraKakuProN-W3                         CID Type 0C       yes yes no          162  0
GVRMBV+HiraKakuProN-W6                         CID Type 0C       yes yes no          165  0
FQDELH+ArialMT                                 TrueType          yes yes yes         161  0
VNDMIP+AvenirNext-Regular                      TrueType          yes yes no          163  0
DFHVYB+AvenirNext-DemiBold                     TrueType          yes yes no          173  0
MOFVHO+AvenirNext-Regular                      TrueType          yes yes no          176  0
CHUSMD+ArialMT                                 TrueType          yes yes yes         185  0
BLPJHU+AvenirNext-Regular                      TrueType          yes yes no          187  0
ADTAQE+HiraKakuProN-W3                         CID Type 0C       yes yes no          186  0
ISLQZN+HiraKakuProN-W6                         CID Type 0C       yes yes no          188  0
BYARGQ+HiraKakuProN-W3                         CID Type 0C       yes yes no          196  0
LOAUGW+ArialMT                                 TrueType          yes yes yes         195  0
NIIFJI+AvenirNext-Regular                      TrueType          yes yes no          197  0
SRYXCK+HiraKakuProN-W6                         CID Type 0C       yes yes no          198  0
RFGCOH+HiraKakuProN-W6                         CID Type 0C       yes yes no          208  0
MTYZNW+AvenirNext-Regular                      TrueType          yes yes no          207  0
IHOZLO+AvenirNext-DemiBold                     TrueType          yes yes no          220  0
HOSVWR+AvenirNext-Regular                      TrueType          yes yes no          223  0
UTRAZB+HiraginoSans-W3                         CID Type 0C       yes yes no          231  0
UJZHUZ+AvenirNext-Regular                      TrueType          yes yes no          232  0
BSOVNR+AvenirNext-Regular                      TrueType          yes yes no          242  0
CGBTHU+HiraKakuProN-W6                         CID Type 0C       yes yes no          239  0
YCQYPS+AvenirNext-DemiBold                     TrueType          yes yes no          238  0
BICJFW+ArialMT                                 TrueType          yes yes yes         251  0
IXLDBS+AvenirNext-Regular                      TrueType          yes yes no          252  0
JUWODJ+AvenirNext-DemiBold                     TrueType          yes yes no          254  0
UQETXN+HiraKakuProN-W3                         CID Type 0C       yes yes no          253  0
ZURYUH+AvenirNext-DemiBold                     TrueType          yes yes no          260  0
IBJNSX+AvenirNext-Regular                      TrueType          yes yes no          261  0
YDOXTV+HiraKakuProN-W3                         CID Type 0C       yes yes no          272  0
ZVFYWS+AvenirNext-DemiBold                     TrueType          yes yes no          267  0
STHYVY+HiraginoSans-W3                         CID Type 0C       yes yes no          273  0
UBQVXP+ArialMT                                 TrueType          yes yes yes         270  0
YIEWLC+AvenirNext-Regular                      TrueType          yes yes no          271  0
IQKCXG+HiraKakuProN-W6                         CID Type 0C       yes yes no          268  0
MSPUIM+AvenirNext-DemiBold                     TrueType          yes yes no          281  0
SNIHKO+AvenirNext-Regular                      TrueType          yes yes no          284  0
JMGADH+ArialMT                                 TrueType          yes yes yes         294  0
KLFTZV+AvenirNext-Regular                      TrueType          yes yes no          296  0
HCMHXD+AvenirNext-DemiBold                     TrueType          yes yes no          297  0
UBDSTH+HiraginoSans-W3                         CID Type 0C       yes yes no          295  0
RKBZQM+AvenirNext-Regular                      TrueType          yes yes no          304  0
FYLOPH+HiraKakuProN-W6                         CID Type 0C       yes yes no          303  0
RDDKVS+AvenirNext-Regular                      TrueType          yes yes no          315  0
SBXWAY+HiraKakuProN-W6                         CID Type 0C       yes yes no          312  0
ONFAUE+AvenirNext-Regular                      TrueType          yes yes no          326  0
KLNOSM+HiraKakuProN-W6                         CID Type 0C       yes yes no          323  0
DVBZFM+ArialMT                                 TrueType          yes yes yes         325  0
COHMAH+HiraginoSans-W3                         CID Type 0C       yes yes no          327  0
GCPYLN+HiraKakuProN-W6                         CID Type 0C       yes yes no          334  0
LELDZL+AvenirNext-DemiBold                     TrueType          yes yes no          333  0
MMEDSF+AvenirNext-Regular                      TrueType          yes yes no          335  0
CXGYQB+AvenirNext-DemiBold                     TrueType          yes yes no          343  0
ZZFLFR+AvenirNext-Regular                      TrueType          yes yes no          346  0
YVFJOF+ArialMT                                 TrueType          yes yes yes         357  0
VWJSMT+AvenirNext-Regular                      TrueType          yes yes no          359  0
ZRUHGF+HiraKakuProN-W6                         CID Type 0C       yes yes no          354  0
AJBMKF+HiraKakuProN-W3                         CID Type 0C       yes yes no          358  0
RHNEBM+AvenirNext-DemiBold                     TrueType          yes yes no          355  0
CNNTMI+HiraKakuProN-W6                         CID Type 0C       yes yes no          365  0
HYGQXR+ArialMT                                 TrueType          yes yes yes         374  0
AQGQYC+AvenirNext-Regular                      TrueType          yes yes no          375  0
WWGNNF+HiraKakuProN-W6                         CID Type 0C       yes yes no          372  0
FCYBAD+HiraKakuProN-W3                         CID Type 0C       yes yes no          376  0
SpeakerDeck 「KubeCon+CNConに見るetcdの未来」リンク先のスライドの文字起こしが文字化けしている様子のスクリーンショットです
こちらも割とよく見るパターン

ものすごい量の同じフォントが含まれているようで,ちょっとびっくりしました.以前の記事を書いた時点では,同じフォントが複数含まれていたら,太字にしたかったものと,通常のウェイトで使いたかったものが混在していると言ってよいか,と思っていたのですが,残念ながら今回は太字掠れ問題は起きていませんでした.同じフォントが何個も個別に含まれることもあるのかと学びがありました.

Accessible な実装を求めたら大変だった

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
BJGCBP+AvenirNext-Bold                         TrueType          yes yes no            8  0
VQVKTT+LucidaGrande-Bold                       TrueType          yes yes yes          11  0
UXHFXI+HiraginoSans-W6                         CID Type 0C       yes yes no            9  0
IPIDWT+AvenirNext-Regular                      TrueType          yes yes no           20  0
LHIDVW+HiraginoSans-W3                         CID Type 0C       yes yes no           19  0
OYUFBX+HiraginoSans-W4                         CID Type 0C       yes yes no           53  0
VWOYPJ+Meiryo-Bold                             CID TrueType      yes yes yes          58  0
EEFTHT+AvenirNext-Medium                       TrueType          yes yes no           52  0
MWHDHV+Meiryo-Bold                             CID TrueType      yes yes yes          96  0
JPIGVY+HiraKakuProN-W3                         CID Type 0C       yes yes no          138  0
PTSRFG+HiraKakuProN-W6                         CID Type 0C       yes yes no          168  0
SpeakerDeck 「Accessible な実装を求めたら大変だった」リンク先のスライドの文字起こしが文字化けしている様子のスクリーンショットです
こちらもよくあるパターン

こちらでも同じフォントが登場する現象を確認できました.Meiryo-Bold が日本語も含まれるフォントっぽい感じで ToUnicode CMap が含まれていますが,残念ながら文字化けしています.これが単体でも同じことが起きるのか,あるいは別のフォントが文字化けしていて巻き込まれているのかは,まだわかっていません.

ObservationSallowDive

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
AAAAAB+Klee-Demibold                           CID Type 0C       yes yes no            6  0
AAAAAC+HiraKakuProN-W3                         CID Type 0C       yes yes no           15  0
AAAAAD+Klee-Medium                             CID Type 0C       yes yes no           23  0
AAAAAE+Menlo-Regular                           TrueType          yes yes no           44  0
AAAAAF+Menlo-Bold                              TrueType          yes yes no           54  0
SpeakerDeck 「ObservationSallowDive」リンク先のスライドの文字起こしが文字化けしている様子のスクリーンショットです
こちらは英文も文字化けしています

英文も化けている理由としては,化けている部分が Menlo ではなく,Klee が用いられているからではないかなと推測します.Klee のところを見ると他の欧文フォントと違って TrueType ではなく CID Type 0C に分類されています.この 2 つの違いについては,以下のサイトに説明がありましたので,リンクしておきます.

Androidの自動バックアップまとめ

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
AAAAAB+HiraKakuProN-W6                         CID Type 0C       yes yes no            6  0
AAAAAE+AppleColorEmoji                         TrueType          yes yes yes          15  0
AAAAAC+HiraKakuProN-W3                         CID Type 0C       yes yes no           12  0
SpeakerDeck 「Android自動バックアップまとめ」リンク先のスライドの文字起こしが文字化けしている様子のスクリーンショットです
一つ前のスライドと同じく英字も化けている

使われているフォントが HiraKakuProN と AppleColorEmoji しかないので,他の英字部分も HiraKakuProN が使われていることがわかります.そのため,英字部分も日本語部分と同じく化けてしまっているのでしょう.

試験に役立つモデリングの紹介/The Introduction to Modeling for Testing

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
NFPYSE+YuGothic-Regular                        TrueType          yes yes yes          10  0
BSFWDU+YuGothic-Light                          TrueType          yes yes yes          12  0
FEWCDF+YuGothic-Light                          TrueType          yes yes yes          23  0
EWVNMV+YuGothic-Regular                        TrueType          yes yes yes          21  0
WICVJS+YuGothic-Bold                           TrueType          yes yes yes          42  0
IGTZSD+ArialMT                                 TrueType          yes yes yes          65  0
HXVBJL+YuGothic-Regular                        TrueType          yes yes yes          72  0
OFFNMK+SegoeUIEmoji                            TrueType          yes yes yes          93  0
YDSSZO+TsukuARdGothic-Bold                     CID Type 0C       yes yes no           82  0
ZRIJYJ+TsukuARdGothic-Bold                     CID Type 0C       yes yes no           91  0
JLYCXN+ArialMT                                 TrueType          yes yes yes          79  0
WJZPSG+YuGothic-Regular                        TrueType          yes yes yes          81  0
COPMLS+YuGothic-Light                          TrueType          yes yes yes         108  0
CFKZDU+YuGothic-Regular                        TrueType          yes yes yes         119  0
MMJQBB+ArialMT                                 TrueType          yes yes yes         204  0
CCCPGX+YuGothic-Regular                        TrueType          yes yes yes         219  0
FOCVIJ+YuGothic-Regular                        TrueType          yes yes yes         252  0
QHHKSS+YuGothic-Regular                        TrueType          yes yes yes         256  0
SpeakerDeck 「Android自動バックアップまとめ」リンク先のスライドの文字起こしが一部だけ文字化けしている様子のスクリーンショットです
ほとんどうまくいっているが画像右下の一部だけ化けている

ほとんどうまくいっているのに,一部だけうまく反映できていません.こういった例もあるので,一概にぱっと見 OK だから全部 OK ともなりません.スライドの 6 枚目を見てみましょう.

SpeakerDeck 「Android自動バックアップまとめ」リンク先のスライド p. 6 のスクリーンショットです.スライド内に書かれている図の部分だけ異なる見た目のフォントが使われています.
図中の「外部サービス」「販売管理システム」だけ化けていると見られる

スライドの大部分は YuGothic を使われていますが,この 6 枚目のスライドの図中の文字にだけ TsukuARdGothic が使われていて,この部分が化けているようです.

文字起こしの文字化けと太字の掠れがどちらも起きてしまっている事例

maneki-cndt-2020.pdf

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
MGGXQJ+TsukuARdGothic-Bold                     CID Type 0C       yes yes no           17  0
RTXQRX+MeiryoUI                                TrueType          yes yes yes          16  0
JGYKMN+TsukuARdGothic-Bold                     CID Type 0C       yes yes no           13  0
KIGJZA+TsukuARdGothic-Bold                     CID Type 0C       yes yes no           14  0
DDGNCA+TsukuARdGothic-Bold                     CID Type 0C       yes yes no           37  0
ZOHLNH+MeiryoUI                                TrueType          yes yes yes          39  0
UHSICX+Wingdings-Regular                       TrueType          yes yes yes          41  0
DYLKNL+MeiryoUI                                TrueType          yes yes yes          59  0
IATMTG+TsukuARdGothic-Bold                     CID Type 0C       yes yes no           60  0
KPRPCI+MeiryoUI                                TrueType          yes yes yes          77  0
QRTOZZ+Wingdings-Regular                       TrueType          yes yes yes         153  0
MJUQRB+MeiryoUI                                TrueType          yes yes yes         167  0
IQYASF+TsukuARdGothic-Regular                  CID Type 0C       yes yes no          431  0
OXUFAZ+TsukuARdGothic-Regular                  CID Type 0C       yes yes no          432  0
NVPDXI+TsukuARdGothic-Bold                     CID Type 0C       yes yes no          438  0
OYAQZR+TsukuARdGothic-Bold                     CID Type 0C       yes yes no          439  0
LCDTKN+TsukuARdGothic-Regular                  CID Type 0C       yes yes no          503  0
EFQOWI+AppleColorEmoji                         TrueType          yes yes yes         512  0
NTLTPR+TsukuARdGothic-Regular                  CID Type 0C       yes yes no          528  0
SpeakerDeck 「maneki-cndt-2020.pdf」リンク先のスライドの文字起こしの大部分が文字化けしている様子のスクリーンショットです
先ほどの例とは逆に一部だけ成功している

一部だけうまくいっているのは先ほどの例と逆なだけで,現象としては同じものになります.

SpeakerDeck 「maneki-cndt-2020.pdf」リンク先のスライド p. 13 のスクリーンショットです.スライド内に書かれている図の部分とタイトル部分で異なる見た目のフォントが使われています.
今度は図中の文字だけ文字起こしが成功している

図中の文字が正しく起こされているとはいえ,文字情報だけ文字起こしされたところで,元々伝えたかったことが伝わるのかはなんとも言えません.何も伝わらないよりはいいでしょうけれども,実際は図で表現されたグルーピングや位置関係が重要であって,中に書いてある文字はその一部でしかないからです.

さらに注目すべきは文字に起こされている順番です.スライド内位置の左上から順というわけでもないのです.これは推測に過ぎませんが,テキストボックスを作った順番に起こされているのではないかなと感じています.

また,このスライドには太字掠れ問題も含まれています.見る限り p. 30 の一枚のみこの問題が発生しているようです.

SpeakerDeck 「maneki-cndt-2020.pdf」リンク先のスライド p. 30 の一部のスクリーンショットです.太字に指定したつもりの文字が掠れている様子です.
p. 30 の太字掠れ
SpeakerDeck 「maneki-cndt-2020.pdf」リンク先のスライド p. 31 の一部のスクリーンショットです.こちらの文字は掠れていません.
p. 31 は掠れていないが,太字指定しているかどうかは不明

pdffonts の結果からは TsukuARdGothic-Regular よりも TsukuARdGothic-Bold の方がたくさん含まれているように見えるため,多くの部分では適切にウェイトの大きいフォントを指定できているものと思われます.ただ,p. 30 に関してだけは,TsukuARdGothic-Regular を Ctrl+b か [B] ボタンで太字にした際に,うまく別のウェイトに切り替わらずこうなってしまったんじゃないかと推測します.

ScrumTraining2020

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
YZUUBR+Calibri-Bold                            TrueType          yes yes yes          10  0
DTAWZK+MS-Gothic                               TrueType          yes yes yes          19  0
URLJGN+Calibri-Bold                            TrueType          yes yes yes          21  0
AFCMSM+AvenirNext-Medium                       TrueType          yes yes no           30  0
AAVMZI+AvenirNext-Medium                       TrueType          yes yes no           29  0
AWTWZC+MS-Gothic                               TrueType          yes yes yes          39  0
DVLHRR+AvenirNext-Medium                       TrueType          yes yes no           59  0
UUZFTV+AvenirNext-Medium                       TrueType          yes yes no           60  0
SMGEBL+MS-Gothic                               TrueType          yes yes yes          62  0
BLONBM+Calibri-Bold                            TrueType          yes yes yes          82  0
FNLSNF+HiraginoSans-W6                         CID Type 0C       yes yes no           87  0
IQGMML+AvenirNext-Bold                         TrueType          yes yes no           88  0
UWPSXG+AvenirNext-Medium                       TrueType          yes yes no          107  0
CYZFEV+MS-Gothic                               TrueType          yes yes yes         109  0
ILAJCG+HiraKakuProN-W6                         CID Type 0C       yes yes no          151  0
AVSSWB+AvenirNext-Regular                      TrueType          yes yes no          230  0
TCRSNB+AvenirNext-Regular                      TrueType          yes yes no          231  0
NONSUO+AvenirNext-Regular                      TrueType          yes yes no          244  0
MHFYFO+MS-Gothic                               TrueType          yes yes yes         243  0
BMCTUZ+Calibri-Bold                            TrueType          yes yes yes         251  0
VIKENI+MS-Gothic                               TrueType          yes yes yes         265  0
OAFPIA+MS-Gothic                               TrueType          yes yes yes         275  0
KFJMTH+AvenirNext-Medium                       TrueType          yes yes no          276  0
EYFPQD+AvenirNext-Medium                       TrueType          yes yes no          273  0
IRMMHH+ArialMT                                 TrueType          yes yes yes         296  0
OSPZHJ+MS-Gothic                               TrueType          yes yes yes         298  0
EASFKP+AvenirNext-Medium                       TrueType          yes yes no          299  0
TXEPWM+MS-Gothic                               TrueType          yes yes yes         306  0
BNHIRP+Calibri-Bold                            TrueType          yes yes yes         327  0
BILOMN+HiraKakuProN-W3                         CID Type 0C       yes yes no          337  0
DBJXGM+AvenirNext-Medium                       TrueType          yes yes no          334  0
ENMFKM+MS-Gothic                               TrueType          yes yes yes         336  0
PCCRCK+MS-Gothic                               TrueType          yes yes yes         360  0
VTGJJE+Calibri-Bold                            TrueType          yes yes yes         362  0
OEVXDR+MS-Gothic                               TrueType          yes yes yes         364  0
PXYGUX+MS-Gothic                               TrueType          yes yes yes         372  0
ZVDVHS+AvenirNext-Medium                       TrueType          yes yes no          373  0
LMEQOD+AvenirNext-Medium                       TrueType          yes yes no          370  0
HSHGMX+AvenirNext-Medium                       TrueType          yes yes no          384  0
TJHNNP+MS-Gothic                               TrueType          yes yes yes         386  0
KCAEOL+MS-Gothic                               TrueType          yes yes yes         398  0
OTPTGH+AvenirNext-Medium                       TrueType          yes yes no          399  0
DOWDZE+MS-Gothic                               TrueType          yes yes yes         401  0
FJPHHT+AvenirNext-Medium                       TrueType          yes yes no          413  0
NPQPPX+MS-Gothic                               TrueType          yes yes yes         415  0
NXPKXA+Calibri-Bold                            TrueType          yes yes yes         446  0
CPYXGL+MS-Gothic                               TrueType          yes yes yes         469  0
SSRBSM+AvenirNext-Medium                       TrueType          yes yes no          470  0
SpeakerDeck 「ScrumTraining2020」リンク先のスライドの文字起こしの一部が文字化けしている様子のスクリーンショットです
一部ページ,あるいはページ中の一部で文字化けが発生している

文字化けの問題は,図中の説明に HiraginoSans あるいは HiraKakuProN が登場しているところで発生しているものと思われます.

SpeakerDeck 「ScrumTraining2020」リンク先のスライド p. 13 の一部のスクリーンショットです.太字に指定したつもりの文字が掠れている様子です.
太字指定していると思われる文字の掠れ

自分に絶対フォント感がないもので,どのフォントなのかは特定できていませんが,なんとなく含まれているフォントに別のウェイトのものがない MS-Gothic なのかなと思っています.

また,こちらもたくさんのフォントが含まれていますが,前に出てきた例と同じく,同じフォントが大量に含まれているだけです.

2018-12-セキュリティ / 2018-12 security

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
NOYXBE+MeiryoUI-Bold                           CID TrueType      yes yes yes          17  0
IMTPGJ+MeiryoUI                                CID TrueType      yes yes yes          18  0
TBKYNS+Meiryo                                  CID TrueType      yes yes yes          44  0
NCBVFV+ArialMT                                 TrueType          yes yes yes          43  0
PGAYTV+MeiryoUI-Bold                           CID TrueType      yes yes yes          40  0
ADGKKG+MeiryoUI                                CID TrueType      yes yes yes          41  0
NWKAME+MeiryoUI-Bold                           CID TrueType      yes yes yes          64  0
UCFEOU+MeiryoUI-Bold                           CID TrueType      yes yes yes          84  0
DZGVXK+MeiryoUI                                CID TrueType      yes yes yes          85  0
RAJDHK+MeiryoUI                                CID TrueType      yes yes yes         130  0
HQJZAP+ArialMT                                 TrueType          yes yes yes         132  0
ETZJBM+MeiryoUI-Bold                           CID TrueType      yes yes yes         127  0
QZDNIW+MeiryoUI-Bold                           CID TrueType      yes yes yes         152  0
KGJHYW+MeiryoUI                                CID TrueType      yes yes yes         155  0
KPQWPM+ArialMT                                 TrueType          yes yes yes         157  0
KPWPHE+ArialMT                                 TrueType          yes yes yes         182  0
ASXJBY+MeiryoUI-Bold                           CID TrueType      yes yes yes         177  0
MYULUC+MeiryoUI                                CID TrueType      yes yes yes         180  0
RCJMHB+MeiryoUI-Bold                           CID TrueType      yes yes yes         204  0
RCCWHL+MeiryoUI-Bold                           CID TrueType      yes yes yes         225  0
MKLOGX+MeiryoUI                                CID TrueType      yes yes yes         226  0
NEJEGO+MeiryoUI-Bold                           CID TrueType      yes yes yes         244  0
TNAIUG+MeiryoUI                                CID TrueType      yes yes yes         245  0
MPOXAU+MeiryoUI-Bold                           CID TrueType      yes yes yes         267  0
XFKCCL+MeiryoUI                                CID TrueType      yes yes yes         268  0
YXFIGG+MeiryoUI                                CID TrueType      yes yes yes         291  0
VOECZK+MeiryoUI-Bold                           CID TrueType      yes yes yes         290  0
BMLAOJ+MeiryoUI                                CID TrueType      yes yes yes         311  0
GAPEUV+MeiryoUI-Bold                           CID TrueType      yes yes yes         314  0
RSJOHQ+MeiryoUI-Bold                           CID TrueType      yes yes yes         340  0
FZQYPY+MeiryoUI                                CID TrueType      yes yes yes         341  0
ZYFSLB+MeiryoUI-Bold                           CID TrueType      yes yes yes         359  0
FCYMAM+MeiryoUI                                CID TrueType      yes yes yes         360  0
USAZSI+MeiryoUI-Bold                           CID TrueType      yes yes yes         378  0
OQINER+MeiryoUI                                CID TrueType      yes yes yes         379  0
SEEYOC+MeiryoUI-Bold                           CID TrueType      yes yes yes         399  0
GWFAXU+MeiryoUI                                CID TrueType      yes yes yes         400  0
XFBTSH+Meiryo-Bold                             CID TrueType      yes yes yes         418  0
XZOKPH+MeiryoUI                                CID TrueType      yes yes yes         419  0
DDFEZN+Meiryo                                  CID TrueType      yes yes yes         422  0
OAZLKB+MeiryoUI-Bold                           CID TrueType      yes yes yes         442  0
TJGBND+MeiryoUI                                CID TrueType      yes yes yes         443  0
OLYSLP+Meiryo-Bold                             CID TrueType      yes yes yes         461  0
UGFOCC+MeiryoUI                                CID TrueType      yes yes yes         462  0
UUKPLY+MeiryoUI-Bold                           CID TrueType      yes yes yes         463  0
HKSCFI+MeiryoUI-Bold                           CID TrueType      yes yes yes         481  0
WLOUFF+MeiryoUI                                CID TrueType      yes yes yes         482  0
TMRLRE+Meiryo-Bold                             CID TrueType      yes yes yes         500  0
RIKCHE+MeiryoUI                                CID TrueType      yes yes yes         501  0
FQZBYS+ArialMT                                 TrueType          yes yes yes         503  0
PXVGAW+ArialMT                                 TrueType          yes yes yes         526  0
MHSRNA+MeiryoUI-Bold                           CID TrueType      yes yes yes         523  0
NFUVQQ+MeiryoUI                                CID TrueType      yes yes yes         524  0
CYXBMM+ArialMT                                 TrueType          yes yes yes         547  0
SGOYBL+MeiryoUI-Bold                           CID TrueType      yes yes yes         544  0
UNEIKL+MeiryoUI                                CID TrueType      yes yes yes         545  0
ZANATU+MeiryoUI                                CID TrueType      yes yes yes         567  0
DSYUHG+ArialMT                                 TrueType          yes yes yes         569  0
JVANLU+MeiryoUI-Bold                           CID TrueType      yes yes yes         566  0
TJQVRB+MeiryoUI-Bold                           CID TrueType      yes yes yes         587  0
LUJCRT+MeiryoUI                                CID TrueType      yes yes yes         588  0
QHHCWM+Meiryo-Bold                             CID TrueType      yes yes yes         608  0
NSHVTT+MeiryoUI                                CID TrueType      yes yes yes         609  0
JVONKO+MeiryoUI-Bold                           CID TrueType      yes yes yes         612  0
UAZJDR+MeiryoUI                                CID TrueType      yes yes yes         637  0
XSHZAJ+MeiryoUI-Bold                           CID TrueType      yes yes yes         640  0
TLNITF+Meiryo-Bold                             CID TrueType      yes yes yes         636  0
WQZGOY+MeiryoUI-Bold                           CID TrueType      yes yes yes         664  0
XLLYOG+MeiryoUI                                CID TrueType      yes yes yes         665  0
LIGJPS+ArialMT                                 TrueType          yes yes yes         690  0
RDCMJX+MeiryoUI-Bold                           CID TrueType      yes yes yes         687  0
DGKZQK+MeiryoUI                                CID TrueType      yes yes yes         688  0
WCALCK+MeiryoUI                                CID TrueType      yes yes yes         709  0
PEBTRX+MeiryoUI-Bold                           CID TrueType      yes yes yes         708  0
AQIZGY+MeiryoUI-Bold                           CID TrueType      yes yes yes         729  0
TMVDGX+MeiryoUI                                CID TrueType      yes yes yes         730  0
SCSQHM+MeiryoUI-Bold                           CID TrueType      yes yes yes         753  0
MECUIU+MeiryoUI                                CID TrueType      yes yes yes         754  0
CBTROQ+MeiryoUI-Bold                           CID TrueType      yes yes yes         774  0
IGPEHT+MeiryoUI                                CID TrueType      yes yes yes         779  0
DGDOAK+MeiryoUI-Bold                           CID TrueType      yes yes yes         821  0
OGKPHM+MeiryoUI                                CID TrueType      yes yes yes         822  0
RPCOBK+MeiryoUI-Bold                           CID TrueType      yes yes yes         842  0
YLQTMM+MeiryoUI                                CID TrueType      yes yes yes         847  0
JCHEOV+MeiryoUI-Bold                           CID TrueType      yes yes yes         889  0
GNCFAV+MeiryoUI                                CID TrueType      yes yes yes         890  0
UOBQIE+MeiryoUI                                CID TrueType      yes yes yes         940  0
WHSOQH+Wingdings-Regular                       TrueType          yes yes yes         942  0
FERGZM+MeiryoUI-Bold                           CID TrueType      yes yes yes         939  0
ZHEZJM+MeiryoUI-Bold                           CID TrueType      yes yes yes         964  0
ITZBDX+MeiryoUI                                CID TrueType      yes yes yes         965  0
MHAFYL+MeiryoUI-Bold                           CID TrueType      yes yes yes         988  0
GYYEPC+Wingdings-Regular                       TrueType          yes yes yes         991  0
AYGDOE+MeiryoUI                                CID TrueType      yes yes yes         989  0
TNHMHU+MeiryoUI-Bold                           CID TrueType      yes yes yes        1012  0
PICYSL+MeiryoUI                                CID TrueType      yes yes yes        1013  0
SJRAKC+MeiryoUI-Bold                           CID TrueType      yes yes yes        1033  0
KQURUJ+MeiryoUI                                CID TrueType      yes yes yes        1034  0
BXQJXV+MeiryoUI-Bold                           CID TrueType      yes yes yes        1054  0
FMZLXE+MeiryoUI                                CID TrueType      yes yes yes        1055  0
CHPCIX+ArialMT                                 TrueType          yes yes yes        1057  0
CPCJAW+MeiryoUI-Bold                           CID TrueType      yes yes yes        1075  0
VDIGWT+MeiryoUI                                CID TrueType      yes yes yes        1076  0
KSLEDE+MeiryoUI                                CID TrueType      yes yes yes        1095  0
RWBBEO+MeiryoUI-Bold                           CID TrueType      yes yes yes        1094  0
SNKZDR+MeiryoUI-Bold                           CID TrueType      yes yes yes        1113  0
CXTDKS+MeiryoUI                                CID TrueType      yes yes yes        1114  0
SAGQMU+MeiryoUI-Bold                           CID TrueType      yes yes yes        1137  0
QIWDMU+MeiryoUI                                CID TrueType      yes yes yes        1138  0
SpeakerDeck 「2018-12-セキュリティ / 2018-12 security」リンク先のスライドの文字起こしが文字化けしている様子のスクリーンショットです
今までと少し違うパターンで文字化けが発生している

ものすごい量の MeiryoUI が出てきていますが,実はそんなにたくさんのフォントが含まれているわけではないようです.そしてなんと,今までのパターンと違って,全てのフォントに ToUnicode CMap が含まれているのにも関わらず,文字化けが発生しています.そこが今までと違うパターンの文字が出ている所以なのかもしれません.

ここで,この記事の初めの方に紹介した記事での記載を思い出します.ToUnicode CMap を削除してしまう方法もありだと書かれています.多分,今回のようなパターンで ToUnicode CMap があるのにも関わらずうまくいかないときに試すといいのかなと思いました.もしかすると,消したら今度はいつものパターンの文字化けに切り替わるだけなのかもしれませんが……

また,太字掠れに関する問題もある括りとしましたが,実は文字の方ではなくて図形の方に問題が現れています.これに関してはフォントを見たところでわからないので,事例を挙げておくにとどめます.

SpeakerDeck 「2018-12-セキュリティ / 2018-12 security」リンク先のスライド全体に共通する部分のスクリーンショットです.図形の半透明になるべき部分が灰色になってしまい,図の色が狂っています.
アンチエイリアスも含め半透明を効かせたい部分がおかしくなっている

太字の掠れだけ起きている事例

製品セキュリティのおしごと / Product Security

name                                           type              emb sub uni prob object ID
---------------------------------------------- ----------------- --- --- --- ---- ---------
TFVQWC+UDDigiKyokashoNK-R                      CID TrueType      yes yes yes         627  0
TDPGWC+MeiryoUI                                CID TrueType      yes yes yes          58  0
EECUUG+Wingdings-Regular                       CID TrueType      yes yes yes          63  0
SpeakerDeck 「製品セキュリティのおしごと / Product Security」リンク先のスライド p. 1 の一部のスクリーンショットです.太字に指定したつもりの文字が掠れている様子です.
太字の方だけ掠れていて,通常の太さのフォントは掠れていない

こちらは単純で UDDigiKyokashoNK に R があるのに B がないため,太字掠れ問題が発生していると考えられます.文字起こしの文字化けは起きていませんが,これは含まれるどのフォントにも ToUnicode CMap が適切に設定されているからかなと思います.

ここで一つ思ったことは,今回のようにレギュラーウェイトのフォントしかなければ機械的に判定することもできそうですが,もしレギュラーフォントとボールドフォントの両方が含まれていたら,機械的に判定することは難しいだろうなということです.

また,ボールドフォントしか入っていなくても,それをさらに太字にする操作をしていたり,あるいはレギュラーフォントを全箇所で太字にして使っていたりすると,PDF に含まれるフォントとしては一つになる可能性があって,そうなるとやはり機械的に発見するのは難しいでしょう.

結局すべては目 grep なのか……?

pdffonts を叩いてわかる情報だけでなんとかしようとすると,結局目で確認して異常がないかどうかを判定するしかなさそうです.ただ,PDF のメタ情報を読むことのできるツールを使うと,もっと他の情報がわかることもあります.もっとじっくりこのメタ情報を見ていけば,何か肝になる情報を得られるかもしれません.

その肝になるメタ情報を見つけて,機械的に判定し,また機械的に適正な PDF になるような修正をかけられれば,晴れてスライドをよくする自動化の完成です.再びそこを目指して PDF の奥地に向かうのでした——————

この記事が気に入ったらサポートをしてみませんか?