スライドの見た目なおしプロジェクト - 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
よくみる文字化けパターンと書きましたが,他にどんなパターンが見られるかの例については,前回の記事をご覧ください.様々な国の文字だけでなく,記号が現れることもあります.
欧文フォントである 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
最初の事例と同じ方が作られているため,使われているフォントも同じパターンのように見受けられます.どうでもいいことですが,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
ものすごい量の同じフォントが含まれているようで,ちょっとびっくりしました.以前の記事を書いた時点では,同じフォントが複数含まれていたら,太字にしたかったものと,通常のウェイトで使いたかったものが混在していると言ってよいか,と思っていたのですが,残念ながら今回は太字掠れ問題は起きていませんでした.同じフォントが何個も個別に含まれることもあるのかと学びがありました.
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
こちらでも同じフォントが登場する現象を確認できました.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
英文も化けている理由としては,化けている部分が 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
使われているフォントが 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
ほとんどうまくいっているのに,一部だけうまく反映できていません.こういった例もあるので,一概にぱっと見 OK だから全部 OK ともなりません.スライドの 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
一部だけうまくいっているのは先ほどの例と逆なだけで,現象としては同じものになります.
図中の文字が正しく起こされているとはいえ,文字情報だけ文字起こしされたところで,元々伝えたかったことが伝わるのかはなんとも言えません.何も伝わらないよりはいいでしょうけれども,実際は図で表現されたグルーピングや位置関係が重要であって,中に書いてある文字はその一部でしかないからです.
さらに注目すべきは文字に起こされている順番です.スライド内位置の左上から順というわけでもないのです.これは推測に過ぎませんが,テキストボックスを作った順番に起こされているのではないかなと感じています.
また,このスライドには太字掠れ問題も含まれています.見る限り p. 30 の一枚のみこの問題が発生しているようです.
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
文字化けの問題は,図中の説明に HiraginoSans あるいは HiraKakuProN が登場しているところで発生しているものと思われます.
自分に絶対フォント感がないもので,どのフォントなのかは特定できていませんが,なんとなく含まれているフォントに別のウェイトのものがない 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
ものすごい量の MeiryoUI が出てきていますが,実はそんなにたくさんのフォントが含まれているわけではないようです.そしてなんと,今までのパターンと違って,全てのフォントに ToUnicode CMap が含まれているのにも関わらず,文字化けが発生しています.そこが今までと違うパターンの文字が出ている所以なのかもしれません.
ここで,この記事の初めの方に紹介した記事での記載を思い出します.ToUnicode CMap を削除してしまう方法もありだと書かれています.多分,今回のようなパターンで ToUnicode CMap があるのにも関わらずうまくいかないときに試すといいのかなと思いました.もしかすると,消したら今度はいつものパターンの文字化けに切り替わるだけなのかもしれませんが……
また,太字掠れに関する問題もある括りとしましたが,実は文字の方ではなくて図形の方に問題が現れています.これに関してはフォントを見たところでわからないので,事例を挙げておくにとどめます.
太字の掠れだけ起きている事例
製品セキュリティのおしごと / 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
こちらは単純で UDDigiKyokashoNK に R があるのに B がないため,太字掠れ問題が発生していると考えられます.文字起こしの文字化けは起きていませんが,これは含まれるどのフォントにも ToUnicode CMap が適切に設定されているからかなと思います.
ここで一つ思ったことは,今回のようにレギュラーウェイトのフォントしかなければ機械的に判定することもできそうですが,もしレギュラーフォントとボールドフォントの両方が含まれていたら,機械的に判定することは難しいだろうなということです.
また,ボールドフォントしか入っていなくても,それをさらに太字にする操作をしていたり,あるいはレギュラーフォントを全箇所で太字にして使っていたりすると,PDF に含まれるフォントとしては一つになる可能性があって,そうなるとやはり機械的に発見するのは難しいでしょう.
結局すべては目 grep なのか……?
pdffonts を叩いてわかる情報だけでなんとかしようとすると,結局目で確認して異常がないかどうかを判定するしかなさそうです.ただ,PDF のメタ情報を読むことのできるツールを使うと,もっと他の情報がわかることもあります.もっとじっくりこのメタ情報を見ていけば,何か肝になる情報を得られるかもしれません.
その肝になるメタ情報を見つけて,機械的に判定し,また機械的に適正な PDF になるような修正をかけられれば,晴れてスライドをよくする自動化の完成です.再びそこを目指して PDF の奥地に向かうのでした——————