Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PDFのコピペが
文字化けするのはなぜか?
— CID/GIDと原ノ味フォント—
細田 真道
http://www.trueroad.jp
2021 年 2 月 26 日
細田 真道 PDF コピペ文字化け 2021-02-26 1 / 49
...
自己紹介
自己紹介
楽譜作成プログラム LilyPond コミッタ
ビルドシステム、フォント、PDF 出力等
GNU 公式文書フォーマット Texinfo コミッタ
国際化、XƎTEX/LuaTEX、Unicode、日本語対応等
は ら の あ...
自己紹介
は ら の ま ち
原ノ町駅
2019 年には何回も行きました
月刊ビジネスコミュニケーション 2020 年 9 月号 p.26∼
名前は似てますが
は ら の あ じ
原ノ味フォントとは関係ありません
細田 真道 PDF コピペ文字...
はじめに
はじめに
細田 真道 PDF コピペ文字化け 2021-02-26 4 / 49
はじめに
はじめに
データ分析したいけどPDFしかない
テキスト抽出したら文字化けした!
PDFを作って配りたい /
PDF帳票を生成したい
コピペが文字化けする!
コピペできない!
これらを何とかします!
細田 真道 PDF コピペ文字化け ...
目次
1. はじめに
2. どんな文字化け?
どんな文字化け?
化ける PDF を作ってみる
3. なぜ文字化けする?
なぜ文字化けする?
PDF の中身を紐解く
コピペのしくみ
康熙部首文字化け問題
PDF の作られ方を紐解く
4. 文字化け...
どんな文字化け?
どんな文字化け?
細田 真道 PDF コピペ文字化け 2021-02-26 7 / 49
どんな文字化け? どんな文字化け?
どんな文字化け?
化ける文字
「見」
「高」
「長」
「玉」など
比較的簡単な漢字
何が起きるか
PDF からテキストをコピペすると、
似たような別の字に化ける
住所を集計しようとすると、長野の「長」や
埼玉...
どんな文字化け? 化ける PDF を作ってみる
化けるPDFを作ってみる(1/3)
環境
Windows 10 20H2
Google Chrome 88.0.4324.182
Acrobat Reader DC 2021.001.20140
...
どんな文字化け? 化ける PDF を作ってみる
化けるPDFを作ってみる(2/3)
HTML を Chrome で開き、①メニューを出し、②「印刷」を選択
③送信先を「PDF に保存」にし、④「保存」ボタンを押して PDF 生成
細田 真道 P...
どんな文字化け? 化ける PDF を作ってみる
化けるPDFを作ってみる(3/3)
PDF を Acrobat Reader で開き、Ctrl+A で全選択し、Ctrl+C でコピー
メモ帳を開き、Ctrl+V でペースト
「見」
「長」
「高...
なぜ文字化けする?
なぜ文字化けする?
細田 真道 PDF コピペ文字化け 2021-02-26 12 / 49
なぜ文字化けする? なぜ文字化けする?
なぜ文字化けする?
PDFのしくみ1
PDF 内に普通のテキストは存在しない
どのフォントの、どのグリフ(字形)を、
どこに配置するか、の情報のみ存在する
グリフはフォント固有の番号で指定する
CID/G...
なぜ文字化けする? PDF の中身を紐解く
PDFの中身をのぞいてみよう
中身を直接見てもわからない
一部が圧縮されている
テキストエディタで見れるよう変換
QPDF を使う
Ubuntu や Fedora などパッケージあり
圧縮の解除と改行...
なぜ文字化けする? PDF の中身を紐解く
PDFの中身
BT と ET で囲まれた部分を探す
foobar.html.qdf 抜粋(BT と ET で囲まれた部分)
BT
/P <</MCID 0 >>BDC
/F4 16 Tf
1 0 0 ...
なぜ文字化けする? PDF の中身を紐解く
PDFの文字出力
foobar.html.qdf 抜粋(Tj オペレータとそのパラメータ)
<0a4209c4092e098109b609f9092609c80c20092d0b9c0be3090b0...
なぜ文字化けする? コピペのしくみ
コピペの実現方法は?
PDF内部はCID/GIDで文字を指定
フォントのグリフを指定する番号
表示するには非常に都合が良い
Unicode などの文字コードとは関係が無い
コピペするには文字コードが必要
細田...
なぜ文字化けする? コピペのしくみ
コピペの実現方法は?
PDF内部はCID/GIDで文字を指定
フォントのグリフを指定する番号
表示するには非常に都合が良い
Unicode などの文字コードとは関係が無い
コピペするには文字コードが必要
To...
なぜ文字化けする? コピペのしくみ
ToUnicode CMap
foobar.html.qdf 抜粋
(“/F4” フォント用 ToUnicode CMap の一部)
14 beginbfchar
<0901> <3042>
<090B> <...
なぜ文字化けする? 康熙部首文字化け問題
康熙部首・CJK部首補助
こ う き
康熙部首(康煕部首)
康熙字典(1716 年)の部首
https://www.unicode.org/charts/PDF/U2F00.pdf
CJK部首補助
康熙...
なぜ文字化けする? 康熙部首文字化け問題
なぜ取り違えるか?
問題のあるToUnicode CMapを作るのは
PDF作成ツール
つまり PDF 作成ツールに問題がある8
広く使われていても問題あるツールがある
フォントにも依存する
問題のある...
なぜ文字化けする? PDF の作られ方を紐解く
PDFの作られ方
テキストをPDF化するときは
1 文字コード (Unicode) を CID/GID へ変換
OpenType フォントに内蔵されている
cmap テーブルを使う
2 CID/G...
なぜ文字化けする? PDF の作られ方を紐解く
cmapテーブル
トリガーになるフォントの例(メイリオ)
変換元 Unicode 符号位置 変換先 GID
… …
U+2F92 GID+2500
… …
U+898B GID+2500
… …
...
なぜ文字化けする? PDF の作られ方を紐解く
文字化け発生メカニズム
問題がある PDF 作成ツールの ToUnicode CMap 生成方法10
cmap 正変換後に変換元 Unicode 情報を捨てている
変換前が U+898B CJK ...
文字化けを修正するには?
文字化けを修正するには?
細田 真道 PDF コピペ文字化け 2021-02-26 24 / 49
文字化けを修正するには?
文字化けを修正するには?
誰かからもらったPDFが文字化けする
ときどうすればよいか
データ分析したい
テキスト抽出してからデータ分析したい
PDF ビュワー上で検索したい
PDF のまま必要なフレーズを探したい
細田...
文字化けを修正するには? テキストを抽出したら正規化する
正規化する
テキスト抽出したら
「康熙部首ブロック」
「CJK 部首補助ブロック」
の文字を対応する
「CJK 統合漢字ブロック」
の文字へ置き換える
データ分析用ならこれで十分では?
...
文字化けを修正するには? PDF 内部の ToUnicode CMap を書き換え
ToUnicode CMap書き換え
かなり荒業ではあるが
PDF内部のToUnicode CMapを
書き換える方法もある
拙作ツール pdf-fix-tuc...
文字化けしない PDF を作るには?
文字化けしないPDFを
作るには?
細田 真道 PDF コピペ文字化け 2021-02-26 28 / 49
文字化けしない PDF を作るには? PDF 作成時の文字化け対策
トリガーを引かない
フォントだけ使う
お勧めはしない
古いフォントが多い
IPA 明朝/IPA ゴシック/
MS 明朝/MS ゴシック etc.
最近のフォントはトリガーを引く...
文字化けしない PDF を作るには? PDF 作成時の文字化け対策
対策済みPDF作成ツールを使う
最新の日本語TEXは対策済み
LuaTEX-ja/pTEX+dvipdfmx etc.
Ubuntu や Fedora などパッケージがあり、
...
文字化けしない PDF を作るには? 対策済み PDF 作成ツールのしくみ
どんな対策?
CJKの複雑な事情を考慮する必要がある
欧米基準で何も考えないと化けてしまう
文字化け発生メカニズムをつぶす
正変換後も変換元 Unicode を覚えてお...
文字化けしない PDF を作るには? 対策済み PDF 作成ツールのしくみ
LuaTEXの対策
変換元Unicode符号位置を覚えておく
極めて正攻法、一番よい方法
ただし、アーキテクチャ的に
元の Unicode 符号位置が失われてしまう
フ...
文字化けしない PDF を作るには? 対策済み PDF 作成ツールのしくみ
pTEX+dvipdfmx/XETEXの対策
cmapテーブルn対1対応の考慮
康熙部首ブロックなどの優先順位を下げる
複数のUnicode符号位置候補がある場合は
優...
文字化けしない PDF を作るには? 対策済み PDF 作成ツールのしくみ
pTEX+dvipdfmx/XETEXの対策
cmapテーブルn対1対応の考慮
康熙部首ブロックなどの優先順位を下げる
複数のUnicode符号位置候補がある場合は
優...
文字化けしない PDF を作るには? Adobe-Japan1 (AJ1)
Adobe-Japan1 (AJ1)
日本語で使われる様々な文字を集め、
識別のためCIDを割り当てたもの
AJ1 規格のフォント同士は
CID が同じなら同じ文字を表...
文字化けしない PDF を作るには? Adobe-Japan1 (AJ1)
文字コードをCID/GIDへ変換
現代的な機構(前述の方法)
OpenType の cmap テーブルを使う
フォント毎に CID/GID が違ってよい
AJ1 でもよ...
文字化けしない PDF を作るには? Adobe-Japan1 (AJ1)
AJ1をPDFからコピペする
AJ1規格のフォントなら
共通のToUnicode CMapが使える
フォント個別に用意する必要が無い
多くの PDF ビュワーが自分で持...
文字化けしない PDF を作るには? Adobe-Japan1 (AJ1)
AJ1フォント
AJ1フォントのメリット
pTEX の和文フォントは AJ1 が最適
ToUnicode CMap 不要でコピペ可能
等々
しかし、
実用的な AJ1 ...
原ノ味フォント
は ら の あ じ
原ノ味フォント
細田 真道 PDF コピペ文字化け 2021-02-26 38 / 49
原ノ味フォント 原ノ味フォント
は ら の あ じ
原ノ味フォント
明朝・ゴシックそれぞれ 7 ウェイト全 14 フォント
原ノ味明朝 ExtraLight 原ノ味角ゴシック ExtraLight
原ノ味明朝 Light 原ノ味角ゴシック Li...
原ノ味フォント 原ノ味フォント
原ノ味フォント採用例
日本語 TEX デフォルト和文フォント
TEX Live 2020 から採用
原ノ味フォントを全面的に使用した書籍多数
iOS テスト全書(PEAKS、2019 年 12 月)
機械学習 1...
原ノ味フォント 原ノ味フォント
原ノ味フォントのグリフ
商業出版に耐えうる品質の
大量のグリフ(字形)を
個人で作れるわけがないですよね
細田 真道 PDF コピペ文字化け 2021-02-26 41 / 49
原ノ味フォント 原ノ味フォント
原ノ味フォントのグリフ
商業出版に耐えうる品質の
大量のグリフ(字形)を
個人で作れるわけがないですよね
巨人の肩に立つ
Adobe のオープンソースフォント
源ノ明朝/源ノ角ゴシック13
のグリフを利用させてい...
原ノ味フォント 源ノフォント
源ノ明朝/源ノ角ゴシック
豊富なウェイト、グリフ
明朝・ゴシック 7 ウェイト全 14 フォント
AJ1-6 全漢字グリフ搭載
Adobe-Identity0 (AI0)フォント
非 AJ1 フォント
日本語用では...
原ノ味フォント 生成プログラム
生成プログラム
全自動で生成
GUI での手動調整は一切なし
プログラム化できないことはしない
OSSとして公開
https://github.com/trueroad/HaranoAjiFonts-genera...
原ノ味フォント OSS にしてよかったこと
OSSにしてよかったこと(1/3)
位置調整が必要なグリフがあった
ギリシャ文字・キリル文字等
源ノと AJ1 規格では字幅が異なる
源ノはプロポーショナル幅(グリフ依存)
AJ1 は全角幅
字幅を広...
原ノ味フォント OSS にしてよかったこと
OSSにしてよかったこと(2/3)
縦書きグリフに不足があった
JIS X 0208 で 4 グリフだけ不足
横書き用「‖」
「°」
「′」
「″」は存在
90度回転+平行移動できれば作れそう
いただ...
原ノ味フォント OSS にしてよかったこと
OSSにしてよかったこと(3/3)
プロポーショナルかなグリフ
搭載要望と実装アイディアをいただいた
いただいたアイディアを実装!
全角かな(字幅が同じ)
いろはにほへとちりぬるを
プロポーショナルか...
おわりに
おわりに
細田 真道 PDF コピペ文字化け 2021-02-26 47 / 49
おわりに
おわりに
どんな文字化け?
なぜ文字化けする?
文字化けを修正するには?
文字化けしないPDFを作るには?
原ノ味フォント
細田 真道 PDF コピペ文字化け 2021-02-26 48 / 49
おわりに
関連資料
本資料
ソースファイルや関連資料を公開します
https://github.com/trueroad/tr-NTTtech05
不十分なところや間違いなどあれば
ご連絡ください
より詳しく知りたいなら
TeXConf 201...
Upcoming SlideShare
Loading in …5
×

of

PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 1 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 2 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 3 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 4 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 5 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 6 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 7 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 8 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 9 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 10 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 11 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 12 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 13 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 14 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 15 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 16 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 17 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 18 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 19 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 20 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 21 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 22 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 23 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 24 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 25 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 26 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 27 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 28 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 29 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 30 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 31 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 32 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 33 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 34 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 35 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 36 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 37 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 38 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 39 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 40 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 41 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 42 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 43 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 44 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 45 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 46 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 47 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 48 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 49 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 50 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 51 PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~ Slide 52
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

20 Likes

Share

Download to read offline

PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~

Download to read offline

NTT Tech Conference #5 Presentation

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~

  1. 1. PDFのコピペが 文字化けするのはなぜか? — CID/GIDと原ノ味フォント— 細田 真道 http://www.trueroad.jp 2021 年 2 月 26 日 細田 真道 PDF コピペ文字化け 2021-02-26 1 / 49 NTT Tech Conference #5 Presentation Copyright (C) 2021 Masamichi Hosoda
  2. 2. 自己紹介 自己紹介 楽譜作成プログラム LilyPond コミッタ ビルドシステム、フォント、PDF 出力等 GNU 公式文書フォーマット Texinfo コミッタ 国際化、XƎTEX/LuaTEX、Unicode、日本語対応等 は ら の あ じ 原ノ味フォント主催 日本語 TEX デフォルト和文フォント(2020∼) 第 10 回日本 OSS 奨励賞受賞 LilyPond FIT2018 FIT 論文賞受賞 URL http://www.trueroad.jp GitHub trueroad Twitter @trueroad_jp Facebook trueroad.jp GPG Key fingerprint 49B8 ED79 B6A8 C46E 2F6D ABB3 FCD0 C162 1E80 A02D 細田 真道 PDF コピペ文字化け 2021-02-26 2 / 49
  3. 3. 自己紹介 は ら の ま ち 原ノ町駅 2019 年には何回も行きました 月刊ビジネスコミュニケーション 2020 年 9 月号 p.26∼ 名前は似てますが は ら の あ じ 原ノ味フォントとは関係ありません 細田 真道 PDF コピペ文字化け 2021-02-26 3 / 49
  4. 4. はじめに はじめに 細田 真道 PDF コピペ文字化け 2021-02-26 4 / 49
  5. 5. はじめに はじめに データ分析したいけどPDFしかない テキスト抽出したら文字化けした! PDFを作って配りたい / PDF帳票を生成したい コピペが文字化けする! コピペできない! これらを何とかします! 細田 真道 PDF コピペ文字化け 2021-02-26 5 / 49
  6. 6. 目次 1. はじめに 2. どんな文字化け? どんな文字化け? 化ける PDF を作ってみる 3. なぜ文字化けする? なぜ文字化けする? PDF の中身を紐解く コピペのしくみ 康熙部首文字化け問題 PDF の作られ方を紐解く 4. 文字化けを修正するには? テキストを抽出したら正 規化する PDF 内部の ToUnicode CMap を書き換え 5. 文字化けしない PDF を作る には? PDF 作成時の文字化け 対策 対策済み PDF 作成ツール のしくみ Adobe-Japan1 (AJ1) 6. 原ノ味フォント 原ノ味フォント 源ノフォント 生成プログラム OSS にしてよかったこと 7. おわりに 細田 真道 PDF コピペ文字化け 2021-02-26 6 / 49
  7. 7. どんな文字化け? どんな文字化け? 細田 真道 PDF コピペ文字化け 2021-02-26 7 / 49
  8. 8. どんな文字化け? どんな文字化け? どんな文字化け? 化ける文字 「見」 「高」 「長」 「玉」など 比較的簡単な漢字 何が起きるか PDF からテキストをコピペすると、 似たような別の字に化ける 住所を集計しようとすると、長野の「長」や 埼玉の「玉」などが化けてうまくいかない PDF でテキスト検索できない 化けるPDFと化けないPDFがある 化ける PDF がたくさん出回っている 本資料 PDF は化けません!(対策済み) 細田 真道 PDF コピペ文字化け 2021-02-26 8 / 49
  9. 9. どんな文字化け? 化ける PDF を作ってみる 化けるPDFを作ってみる(1/3) 環境 Windows 10 20H2 Google Chrome 88.0.4324.182 Acrobat Reader DC 2021.001.20140 いずれも 2021 年 2 月現在の最新版 適当なHTML(文字化けしていない) foobar.html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> </head> <body> <p>初 見 は ハ 長 調 で 高 音 の 白 玉 が あっ た</p> </body> </html> 細田 真道 PDF コピペ文字化け 2021-02-26 9 / 49
  10. 10. どんな文字化け? 化ける PDF を作ってみる 化けるPDFを作ってみる(2/3) HTML を Chrome で開き、①メニューを出し、②「印刷」を選択 ③送信先を「PDF に保存」にし、④「保存」ボタンを押して PDF 生成 細田 真道 PDF コピペ文字化け 2021-02-26 10 / 49 ←① ←② ←③ ←④
  11. 11. どんな文字化け? 化ける PDF を作ってみる 化けるPDFを作ってみる(3/3) PDF を Acrobat Reader で開き、Ctrl+A で全選択し、Ctrl+C でコピー メモ帳を開き、Ctrl+V でペースト 「見」 「長」 「高」 「音」 「白」 「玉」が化けた! ( 「初」や「調」 、ひらがな、カタカナは化けなかった) 細田 真道 PDF コピペ文字化け 2021-02-26 11 / 49
  12. 12. なぜ文字化けする? なぜ文字化けする? 細田 真道 PDF コピペ文字化け 2021-02-26 12 / 49
  13. 13. なぜ文字化けする? なぜ文字化けする? なぜ文字化けする? PDFのしくみ1 PDF 内に普通のテキストは存在しない どのフォントの、どのグリフ(字形)を、 どこに配置するか、の情報のみ存在する グリフはフォント固有の番号で指定する CID/GID (Character ID/Glyph ID)2 同じ形のグリフでもフォントによって 番号が異なることがある Unicode のような普通の文字コードは 使われない 1 大多数の PDF の場合。あてはまらない PDF もあります。本ページ以降も同様です。 2 ほぼ同じ意味ですがフォントの種類によって CID/GID どちらを使うかが異なります。 細田 真道 PDF コピペ文字化け 2021-02-26 13 / 49
  14. 14. なぜ文字化けする? PDF の中身を紐解く PDFの中身をのぞいてみよう 中身を直接見てもわからない 一部が圧縮されている テキストエディタで見れるよう変換 QPDF を使う Ubuntu や Fedora などパッケージあり 圧縮の解除と改行やインデント等して 見やすくした QDF 形式に変換3 $ qpdf --qdf foobar.html.pdf foobar.html.qdf 3 QDF をテキストエディタで編集した後で PDF へ戻すコマンド fix-qdf もあります。 細田 真道 PDF コピペ文字化け 2021-02-26 14 / 49
  15. 15. なぜ文字化けする? PDF の中身を紐解く PDFの中身 BT と ET で囲まれた部分を探す foobar.html.qdf 抜粋(BT と ET で囲まれた部分) BT /P <</MCID 0 >>BDC /F4 16 Tf 1 0 0 -1 8 33 Tm <0a4209c4092e098109b609f9092609c80c20092d0b9c0be3090b09010922091e> Tj EMC ET パラメータが先、オペレータが後の後置記法 Tf: フォントを指定するオペレータ “/F4” フォント(別途定義)をサイズ 16 で指定している Tm: 座標系を指定するオペレータ “1 0 0 -1 8 33” で座標系を指定している Tj: 文字を出力するオペレータ “<” と “>” で囲まれた部分で出力する文字を指定している 細田 真道 PDF コピペ文字化け 2021-02-26 15 / 49
  16. 16. なぜ文字化けする? PDF の中身を紐解く PDFの文字出力 foobar.html.qdf 抜粋(Tj オペレータとそのパラメータ) <0a4209c4092e098109b609f9092609c80c20092d0b9c0be3090b09010922091e> Tj パラメータから 16 進数 4 桁ずつ取り出し GID4 とする GID を使い “/F4” フォント(メイリオ)からグリフを取り出す 16 進数 4 桁 GID5 グリフ 0a42 GID+2626 初 09c4 GID+2500 見 092e GID+2350 は 0981 GID+2433 ハ … … … 4 ここで “/F4” フォントとして使われているメイリオは GID で指定します。 5 CID/GID は “CID+” または “GID+” に 10 進数を付けて表記します。 細田 真道 PDF コピペ文字化け 2021-02-26 16 / 49
  17. 17. なぜ文字化けする? コピペのしくみ コピペの実現方法は? PDF内部はCID/GIDで文字を指定 フォントのグリフを指定する番号 表示するには非常に都合が良い Unicode などの文字コードとは関係が無い コピペするには文字コードが必要 細田 真道 PDF コピペ文字化け 2021-02-26 17 / 49
  18. 18. なぜ文字化けする? コピペのしくみ コピペの実現方法は? PDF内部はCID/GIDで文字を指定 フォントのグリフを指定する番号 表示するには非常に都合が良い Unicode などの文字コードとは関係が無い コピペするには文字コードが必要 ToUnicode CMapを使う CID/GID → Unicode 符号位置 の変換テーブル フォント毎に用意する フォントによって対応関係が異なる ことがある コピペできる PDF には埋め込まれている 細田 真道 PDF コピペ文字化け 2021-02-26 17 / 49
  19. 19. なぜ文字化けする? コピペのしくみ ToUnicode CMap foobar.html.qdf 抜粋 (“/F4” フォント用 ToUnicode CMap の一部) 14 beginbfchar <0901> <3042> <090B> <304C> <091E> <305F> <0922> <3063> <0926> <3067> <0981> <30CF> <09B6> <2ED1> <09C4> <2F92> <09C8> <2FBC> <09F9> <8ABF> <0A42> <521D> <0B9C> <2F69> <0BE3> <2F5F> <0C20> <2FB3> endbfchar CID/ GID ひらがな・カタカナ 「あ」 「が」 「た」 「っ」 「で」 「ハ」 CJK 部首補助「長」 康熙部首「見」 康熙部首「高」 CJK 統合漢字「調」 CJK 統合漢字「初」 康熙部首「白」 康熙部首「玉」 康熙部首「音」 1 行が 16 進数 4 桁表記の 変換元 CID/GID と 変換先 Unicode 符号位置 の順番で並んでいる6 化けた文字は変換先が CJK 部首補助 (U+2E??) か 康熙部首 (U+2F??) 7 で 通常の漢字ではない! 化けなかった文字は変換先が 通常の漢字(CJK 統合漢字: U+4E00∼U+9FFF 他)か ひらがなカタカナ(U+30??) 6 これとは異なる形式のこともあります。 7 Unicode コードポイント 符号位置は “U+” の後に 16 進数 4∼6 桁を付けて表記します。 細田 真道 PDF コピペ文字化け 2021-02-26 18 / 49
  20. 20. なぜ文字化けする? 康熙部首文字化け問題 康熙部首・CJK部首補助 こ う き 康熙部首(康煕部首) 康熙字典(1716 年)の部首 https://www.unicode.org/charts/PDF/U2F00.pdf CJK部首補助 康熙字典に載っていない部首 https://www.unicode.org/charts/PDF/U2E80.pdf 通常の漢字(CJK統合漢字)と 同じ形のものがある 同形が異 Unicode 符号位置にある これらを取り違えると文字化けが発生 細田 真道 PDF コピペ文字化け 2021-02-26 19 / 49
  21. 21. なぜ文字化けする? 康熙部首文字化け問題 なぜ取り違えるか? 問題のあるToUnicode CMapを作るのは PDF作成ツール つまり PDF 作成ツールに問題がある8 広く使われていても問題あるツールがある フォントにも依存する 問題のある PDF 作成ツールで使うと、 トリガーを引いてしまうフォント9 と そうでないフォントがある 最近のフォントの多くはトリガーになる 8 PostScript 経由のフロー等では PDF 作成ツールの前工程に問題がある場合もあります。 9 フォント規格としては問題なく、フォントが悪いわけではありません。 細田 真道 PDF コピペ文字化け 2021-02-26 20 / 49
  22. 22. なぜ文字化けする? PDF の作られ方を紐解く PDFの作られ方 テキストをPDF化するときは 1 文字コード (Unicode) を CID/GID へ変換 OpenType フォントに内蔵されている cmap テーブルを使う 2 CID/GID でグリフを指定 Tj オペレータのパラメータに CID/GID をセット 文字 コード 変換 変換テーブル (マッピング) CID 指定 グリフ 細田 真道 PDF コピペ文字化け 2021-02-26 21 / 49
  23. 23. なぜ文字化けする? PDF の作られ方を紐解く cmapテーブル トリガーになるフォントの例(メイリオ) 変換元 Unicode 符号位置 変換先 GID … … U+2F92 GID+2500 … … U+898B GID+2500 … … 康熙部首「見」 CJK 統合漢字「見」 GID が同じ! トリガーにならないフォントの例(MS ゴシック) 変換元 Unicode 符号位置 変換先 GID … … U+898B GID+12386 … … 康熙部首「見」無し! CJK 統合漢字「見」 同じ GID が 他に無い 細田 真道 PDF コピペ文字化け 2021-02-26 22 / 49
  24. 24. なぜ文字化けする? PDF の作られ方を紐解く 文字化け発生メカニズム 問題がある PDF 作成ツールの ToUnicode CMap 生成方法10 cmap 正変換後に変換元 Unicode 情報を捨てている 変換前が U+898B CJK 統合漢字「見」だったことを忘れる 変換先 CID/GID から cmap テーブルの逆変換で生成 GID+2500 から逆変換しようとする cmap テーブルが n 対 1 対応なのを考慮していない 番号が小さくて先に見つかる U+2F92 康熙部首「見」を採用 これにより U+898B が U+2F92 に化けてしまう! 変換元 Unicode 符号位置 変換先 GID … … U+2F92 GID+2500 … … U+898B GID+2500 … … 康熙部首「見」 CJK 統合漢字「見」 GID が同じ! 正変換 逆変換 10 あくまでも推定ですが、昔の XƎTEX (xdvipdfmx) はこれで化けました。 細田 真道 PDF コピペ文字化け 2021-02-26 23 / 49
  25. 25. 文字化けを修正するには? 文字化けを修正するには? 細田 真道 PDF コピペ文字化け 2021-02-26 24 / 49
  26. 26. 文字化けを修正するには? 文字化けを修正するには? 誰かからもらったPDFが文字化けする ときどうすればよいか データ分析したい テキスト抽出してからデータ分析したい PDF ビュワー上で検索したい PDF のまま必要なフレーズを探したい 細田 真道 PDF コピペ文字化け 2021-02-26 25 / 49
  27. 27. 文字化けを修正するには? テキストを抽出したら正規化する 正規化する テキスト抽出したら 「康熙部首ブロック」 「CJK 部首補助ブロック」 の文字を対応する 「CJK 統合漢字ブロック」 の文字へ置き換える データ分析用ならこれで十分では? 他の正規化も必要になることが多いはず 全角半角の統一 丸数字を丸のない数字へ統一 等々 細田 真道 PDF コピペ文字化け 2021-02-26 26 / 49
  28. 28. 文字化けを修正するには? PDF 内部の ToUnicode CMap を書き換え ToUnicode CMap書き換え かなり荒業ではあるが PDF内部のToUnicode CMapを 書き換える方法もある 拙作ツール pdf-fix-tuc https://github.com/trueroad/pdf-fix-tuc ToUnicode CMap の康熙部首などを CJK 統合漢字へ書き換えるツール PDFビュワーで検索も できるようになる 細田 真道 PDF コピペ文字化け 2021-02-26 27 / 49
  29. 29. 文字化けしない PDF を作るには? 文字化けしないPDFを 作るには? 細田 真道 PDF コピペ文字化け 2021-02-26 28 / 49
  30. 30. 文字化けしない PDF を作るには? PDF 作成時の文字化け対策 トリガーを引かない フォントだけ使う お勧めはしない 古いフォントが多い IPA 明朝/IPA ゴシック/ MS 明朝/MS ゴシック etc. 最近のフォントはトリガーを引く IPAex 明朝/IPAex ゴシック/メイリオ/游 etc. ライセンスも心配 MS 明朝/MS ゴシックは Windows の一部 (Linux など他の OS で使える?) アップデートで仕様が変わる可能性も? 解決になっていない 細田 真道 PDF コピペ文字化け 2021-02-26 29 / 49
  31. 31. 文字化けしない PDF を作るには? PDF 作成時の文字化け対策 対策済みPDF作成ツールを使う 最新の日本語TEXは対策済み LuaTEX-ja/pTEX+dvipdfmx etc. Ubuntu や Fedora などパッケージがあり、 インストールも簡単 サーバサイドでの PDF 帳票や報告書の 自動生成にも使えそう 定型フォーマットに文章や数字を 流し込んで PDF を作るのは得意 この資料も TEX で作成 他のツールは? どんな対策が必要? 細田 真道 PDF コピペ文字化け 2021-02-26 30 / 49
  32. 32. 文字化けしない PDF を作るには? 対策済み PDF 作成ツールのしくみ どんな対策? CJKの複雑な事情を考慮する必要がある 欧米基準で何も考えないと化けてしまう 文字化け発生メカニズムをつぶす 正変換後も変換元 Unicode を覚えておく cmap テーブルが n 対 1 なのを考慮する もう一つの対策も… どれかができれば対策OK 日本語 TEX の対策例を紹介します 問題のある OSS があるなら ぜひ貢献してください! 細田 真道 PDF コピペ文字化け 2021-02-26 31 / 49
  33. 33. 文字化けしない PDF を作るには? 対策済み PDF 作成ツールのしくみ LuaTEXの対策 変換元Unicode符号位置を覚えておく 極めて正攻法、一番よい方法 ただし、アーキテクチャ的に 元の Unicode 符号位置が失われてしまう フロー11 にせざるを得ない場合は使えない 11 CID/GID しか格納されていない中間形式 (PostScript や XƎTEX の xdv 等) を経由するなど。 細田 真道 PDF コピペ文字化け 2021-02-26 32 / 49
  34. 34. 文字化けしない PDF を作るには? 対策済み PDF 作成ツールのしくみ pTEX+dvipdfmx/XETEXの対策 cmapテーブルn対1対応の考慮 康熙部首ブロックなどの優先順位を下げる 複数のUnicode符号位置候補がある場合は 優先順位が高いものを使う 大抵の場合で使えるが GSUB テーブルの グリフ置き換え12 などがあると破綻も 12 横書き用「 」を vert フィーチャで縦書き用「 」へ置き換えるなど。 細田 真道 PDF コピペ文字化け 2021-02-26 33 / 49
  35. 35. 文字化けしない PDF を作るには? 対策済み PDF 作成ツールのしくみ pTEX+dvipdfmx/XETEXの対策 cmapテーブルn対1対応の考慮 康熙部首ブロックなどの優先順位を下げる 複数のUnicode符号位置候補がある場合は 優先順位が高いものを使う 大抵の場合で使えるが GSUB テーブルの グリフ置き換え12 などがあると破綻も ToUnicode CMapを生成しない New!! Adobe-Japan1 規格などの CID-keyed フォントの場合に限る フォントは限定されるものの デメリットがほとんどない 12 横書き用「 」を vert フィーチャで縦書き用「 」へ置き換えるなど。 細田 真道 PDF コピペ文字化け 2021-02-26 33 / 49
  36. 36. 文字化けしない PDF を作るには? Adobe-Japan1 (AJ1) Adobe-Japan1 (AJ1) 日本語で使われる様々な文字を集め、 識別のためCIDを割り当てたもの AJ1 規格のフォント同士は CID が同じなら同じ文字を表す 「見」は必ず CID+1887 初版のAJ1-0は1992年制定 最新のAJ1-7は2019年制定 OpenType フォント規格(初版 1997 年) より古い歴史がある OpenType の cmap テーブルに依存せず 文字コードから CID を得る機構がある 細田 真道 PDF コピペ文字化け 2021-02-26 34 / 49
  37. 37. 文字化けしない PDF を作るには? Adobe-Japan1 (AJ1) 文字コードをCID/GIDへ変換 現代的な機構(前述の方法) OpenType の cmap テーブルを使う フォント毎に CID/GID が違ってよい AJ1 でもよい LuaTEX/XƎTEX などのモダン TEX や 普通の Windows アプリなどで使われる OpenType登場前の機構 AJ1 専用の外部テーブルを使う CMap リソース すべての日本語フォントは CID が同一 AJ1 でなければならない pTEX など伝統的な日本語 TEX で使われる まだバリバリ現役で広く使われている 細田 真道 PDF コピペ文字化け 2021-02-26 35 / 49
  38. 38. 文字化けしない PDF を作るには? Adobe-Japan1 (AJ1) AJ1をPDFからコピペする AJ1規格のフォントなら 共通のToUnicode CMapが使える フォント個別に用意する必要が無い 多くの PDF ビュワーが自分で持っている PDF 内に埋め込む必要なし コピペに最適な調整済になっている 康熙部首文字化けしない GSUB 置き換えにも対応 等々 どんな PDF でもコピペできる ToUnicode CMap を生成できない PDF 作成ツールでも問題なし 細田 真道 PDF コピペ文字化け 2021-02-26 36 / 49
  39. 39. 文字化けしない PDF を作るには? Adobe-Japan1 (AJ1) AJ1フォント AJ1フォントのメリット pTEX の和文フォントは AJ1 が最適 ToUnicode CMap 不要でコピペ可能 等々 しかし、 実用的な AJ1 フォントは 非フリーだけだった 無いなら作る! 原ノ味フォントを制作することに 細田 真道 PDF コピペ文字化け 2021-02-26 37 / 49
  40. 40. 原ノ味フォント は ら の あ じ 原ノ味フォント 細田 真道 PDF コピペ文字化け 2021-02-26 38 / 49
  41. 41. 原ノ味フォント 原ノ味フォント は ら の あ じ 原ノ味フォント 明朝・ゴシックそれぞれ 7 ウェイト全 14 フォント 原ノ味明朝 ExtraLight 原ノ味角ゴシック ExtraLight 原ノ味明朝 Light 原ノ味角ゴシック Light 原ノ味明朝 Regular 原ノ味角ゴシック Normal 原ノ味明朝 Medium 原ノ味角ゴシック Regular 原ノ味明朝 SemiBold 原ノ味角ゴシック Medium 原ノ味明朝 Bold 原ノ味角ゴシック Bold 原ノ味明朝 Heavy 原ノ味角ゴシック Heavy AJ1-6 漢字グリフすべて搭載(JIS X 0208/JIS X 0213 全漢字グリフ含む) JIS X 0208 グリフすべて搭載(漢字・非漢字・横書き・縦書きすべて含む) 細田 真道 PDF コピペ文字化け 2021-02-26 39 / 49
  42. 42. 原ノ味フォント 原ノ味フォント 原ノ味フォント採用例 日本語 TEX デフォルト和文フォント TEX Live 2020 から採用 原ノ味フォントを全面的に使用した書籍多数 iOS テスト全書(PEAKS、2019 年 12 月) 機械学習 100 +ページ エッセンス (インプレス、2019 年 12 月) [改訂第 8 版]L A TEX2e 美文書作成入門 (技術評論社、2020 年 11 月) 付録に「原ノ味フォント全グリフ」収録 その他 TEX 組版で出版される書籍の多くが採用 この資料も原ノ味フォント使用! 細田 真道 PDF コピペ文字化け 2021-02-26 40 / 49
  43. 43. 原ノ味フォント 原ノ味フォント 原ノ味フォントのグリフ 商業出版に耐えうる品質の 大量のグリフ(字形)を 個人で作れるわけがないですよね 細田 真道 PDF コピペ文字化け 2021-02-26 41 / 49
  44. 44. 原ノ味フォント 原ノ味フォント 原ノ味フォントのグリフ 商業出版に耐えうる品質の 大量のグリフ(字形)を 個人で作れるわけがないですよね 巨人の肩に立つ Adobe のオープンソースフォント 源ノ明朝/源ノ角ゴシック13 のグリフを利用させていただいてます 13 Google の Noto Serif CJK/Noto Sans CJK とほぼ同じフォントです。 細田 真道 PDF コピペ文字化け 2021-02-26 41 / 49
  45. 45. 原ノ味フォント 源ノフォント 源ノ明朝/源ノ角ゴシック 豊富なウェイト、グリフ 明朝・ゴシック 7 ウェイト全 14 フォント AJ1-6 全漢字グリフ搭載 Adobe-Identity0 (AI0)フォント 非 AJ1 フォント 日本語用ではなく汎 CJK 用 CID がバラバラ、明朝とゴシックでも違う 現代的で OpenType が前提 オープンソースフォント SIL Open Font License 1.1 (OFL-1.1) 一定の条件下で改変や再配布可能 これをAJ1に組み替える! 細田 真道 PDF コピペ文字化け 2021-02-26 42 / 49
  46. 46. 原ノ味フォント 生成プログラム 生成プログラム 全自動で生成 GUI での手動調整は一切なし プログラム化できないことはしない OSSとして公開 https://github.com/trueroad/HaranoAjiFonts-generator 派生フォントとしては珍しいのでは? フリーフォントの派生フォントは ライセンス上フリーフォントになるが、 生成プログラムを公開しているものは ほとんど無さそう 自分で原ノ味フォントを生成できる OSS だからカスタマイズもできる 細田 真道 PDF コピペ文字化け 2021-02-26 43 / 49
  47. 47. 原ノ味フォント OSS にしてよかったこと OSSにしてよかったこと(1/3) 位置調整が必要なグリフがあった ギリシャ文字・キリル文字等 源ノと AJ1 規格では字幅が異なる 源ノはプロポーショナル幅(グリフ依存) AJ1 は全角幅 字幅を広げただけでは グリフが左に寄って不格好に 平行移動させるのは大変 グリフ内部形式 (CFF Charstring) が複雑 平行移動・拡大縮小できるコードを Pull requestしていただけた 不格好なグリフがなくなった! 細田 真道 PDF コピペ文字化け 2021-02-26 44 / 49
  48. 48. 原ノ味フォント OSS にしてよかったこと OSSにしてよかったこと(2/3) 縦書きグリフに不足があった JIS X 0208 で 4 グリフだけ不足 横書き用「‖」 「°」 「′」 「″」は存在 90度回転+平行移動できれば作れそう いただいた平行移動コードをベースに 90度回転コードを実装! 縦書きグリフ不足解消 JIS X 0208 全グリフ搭載を実現! 縦書き用「‖」 「°」 「′」 「″」を追加 細田 真道 PDF コピペ文字化け 2021-02-26 45 / 49
  49. 49. 原ノ味フォント OSS にしてよかったこと OSSにしてよかったこと(3/3) プロポーショナルかなグリフ 搭載要望と実装アイディアをいただいた いただいたアイディアを実装! 全角かな(字幅が同じ) いろはにほへとちりぬるを プロポーショナルかな(字幅が異なる) その他のかなグリフにも応用 縦書きプロポーショナルかな、 組方向最適化かなの搭載につながる かなグリフが充実! 細田 真道 PDF コピペ文字化け 2021-02-26 46 / 49
  50. 50. おわりに おわりに 細田 真道 PDF コピペ文字化け 2021-02-26 47 / 49
  51. 51. おわりに おわりに どんな文字化け? なぜ文字化けする? 文字化けを修正するには? 文字化けしないPDFを作るには? 原ノ味フォント 細田 真道 PDF コピペ文字化け 2021-02-26 48 / 49
  52. 52. おわりに 関連資料 本資料 ソースファイルや関連資料を公開します https://github.com/trueroad/tr-NTTtech05 不十分なところや間違いなどあれば ご連絡ください より詳しく知りたいなら TeXConf 2019 一般講演 「原ノ味フォントと ToUnicode CMap」 https://github.com/trueroad/tr-TeXConf2019 細田 真道 PDF コピペ文字化け 2021-02-26 49 / 49
  • GoichiHirakawa

    May. 27, 2021
  • YoshinoriTOYAMA

    Apr. 28, 2021
  • got4416

    Mar. 10, 2021
  • s1240078

    Mar. 5, 2021
  • dexdev

    Mar. 1, 2021
  • YukiUehara2

    Mar. 1, 2021
  • teamasa

    Mar. 1, 2021
  • ssuser7a6fed

    Feb. 28, 2021
  • NeoXrea

    Feb. 28, 2021
  • naota70

    Feb. 28, 2021
  • kotobato

    Feb. 28, 2021
  • syuichitsuji

    Feb. 28, 2021
  • NagiKataoka

    Feb. 28, 2021
  • ssuser27bcc3

    Feb. 27, 2021
  • tsuyoshicho

    Feb. 27, 2021
  • MomoWatanabe

    Feb. 27, 2021
  • ssuser8dcfc6

    Feb. 27, 2021
  • tiefertal

    Feb. 27, 2021
  • doraTeX

    Feb. 26, 2021
  • tyamadajp

    Feb. 26, 2021

NTT Tech Conference #5 Presentation

Views

Total views

13,103

On Slideshare

0

From embeds

0

Number of embeds

427

Actions

Downloads

35

Shares

0

Comments

0

Likes

20

×