フォント埋め込みされたpdfでは文字コードが取得できない、ものもある。 フォント埋め込みを指定すると、PDFの文字列の並び は 「グリフID 」 番号で表現され、PDF内で使用される文字のフォントがサブセットとして埋め込まれることがあるそうです。 http://blog.antenna.co.jp/PDFTool/mt-tbng2.cgi/124, « PDFと文字 (24) – Adobe-GB1, Adobe-CNS1, Adobe-Korea1, Unicode 3.2 (UTF-32) からCID Mac OS X Version 10.2互換. 文字の識別には、GID/CIDが使われます。 CMapとcmapはいずれも同じ役割を持っていますが「CMap」はPostScript処理系で用いられ、通常フォントの形で存在し、CIDフォントが文字コードをCIDに対応付けるために使います。, 「cmap」はTrueTypeまたはOpenTypeフォントが使用し、文字コードをGIDに対応付けます。, たとえば、「永」(Unicode:6C38)という文字を入力するとしましょう。Unicodeの値から、フォントの文字が引き出せればいいのですが、フォントの文字はGID/CIDによって管理されているので、文字コードを使って直接文字を呼び出すことはできません。, ここでCMap(cmap)が必要になります。CMapには、「Unicode:6C38」=「GID: 1260」という対応情報が記述されています。OSはこの対応表を参照することによって、「GID:1260」=「永」の文字をフォントから引き出します。, CMap・cmapは対応する文字コードの数だけエンコーディングテーブルを持ち、それぞれ「UniJIS-UTF8-H」「UniJIS-UTF16-V」というような名称が付けられています。, 「UniJIS」はUnicodeとGID/CIDとの対応表であること、「UTF8」はエンコーディングがUTF8であることを、「H」は横組み用、「V」は縦組み用であることを表していま す。, OpenTypeフォントの機能のひとつである縦組み用字形と横組み用字形の切り替えや、「“」「”」と「〝」「〟」などの一部の記号類が、組み方向によって文字が変わるのは、縦組み用と横組み用、それぞれのエンコーディングテーブルが適宜切り替わることで実現されています。, フォントによっては、Windows用、Mac用というよう に、OSごとにエンコーディングテーブルを用意しているものもあり、フォントはこのCMap(cmap)の働きによって、同一のフォント情報を複数のプラットフォーム、文字コードに展開しています。, なお、JIS2004字形に対応したNフォントなどに見られる字形の変更は、このcmapの変更によって行われています。つまり、今まで「Unicode:9BD6」=「GID:2168(鯖)」だったcmapの対応表を、「Unicode:9BD6」=「GID:7689(鯖)」にすることで、「さば」という文字を変換した際に呼び出す文字を変更しています。.  startCount[n] <= 0x5511 <= endCount[n] C#でフォントファイルからcmapの情報を取得してファイルに保存したいと考えています。 cmapの情報を取得する方法をご存知の方がいましたら知恵をお貸しください。 よろしくお願いします。 フォントが横向きになってしまいます。, マップテーブルの情報を書き換えて縦書き文字のグリフをヨコに寝てしまうグリフの 1つのテーブルは2バイトのplatformIDとencodingID、4バイトのoffsetの合計8バイト分あり、, (ファイル先頭ではなく"cmap"の先頭からの)offset位置に、platformIDとencodingIDの示す変換表が格納されています。 ・第12回 pdf内で複数のフォントを扱う ・第11回 フォントファイルからcmap変換表を取り出す ・第10回 pdf内の文字をコピペできるようにする ・第09回 pdfファイルにフォントを埋め込む ・第08回 pdf埋め込みフォントの概要 ・第07回 pdfに日本語を書き出す フォント埋め込みを指定すると、PDFの文字列の並びは「グリフID」番号で表現され、PDF内で使用される文字のフォントがサブセットとして埋め込まれることがあるそうです。画面表示や印刷は、これで問題なくできるのですが、グリフIDと文字コードとの対応表(ToUnicode CMapなど)がPDF内に含まれていないと、文字の検索やテキストのコピーができない、ということです。, PSファイルを書き出す際の印刷設定のオプションで、グリフIDと文字コードの対応表を含む/含まないを選択ができることが、あるのでしょうか。ちなみに、組版の現場で現役のAVANAS BookStudio 3.0(2005年頃の最終バージョン)では、印刷時の文字設定「フォントの送信方法」で、3つのオプション“アウトライン”、“Type 1(カスタム)”、“Type 1(CID)”のうち、“Type 1(CID)”のみが、文字列検索が可能なPDFを作成できるとのことです。, 組版・DTPの現場で、「①フォントが埋め込まれている、②コピー&ペーストで文字化けする、③文字の検索もできない」というPDFしかない場合は、2018年現在で、とるべき道は1つです。早々に、必ずしも完璧には文字列化できないOCR(光学文字認識)のたぐいは使わないという決断をして、PDFをプリントしたものを原稿として、人間の手で文字入力を行うという道です。, 参考 変換表の先頭には2バイトのformatがあり、このformatの値により変換表の格納形式が異なります。, 今回利用する変換表はplatformIDが3、encodingIDが1なので、format=4(Format 4: Segment mapping to delta values)の形式で格納されています。, format 4の変換表の中には様々な情報が格納されていますが、その中で以下の3つの配列が必要になります。 取り出す変換表はplatformID == 3 && encodingID == 1のもののみに対応します。, open type fontの仕様を見ると、 (2)グリフセットには、これらの文字に相当するグリフには横書用と縦書用の2種類が用意されています。(次の例), ※Adobe-Japan1-6 Character Collection for CID-Keyed Fonts p. 12, p. 76, 末尾に-Hの付くCMapを使うと、文字コードから横書用グリフのCID番号に変換することになり、同-Vの付くCMapを使うと、縦書用グリフのCID番号に変換することになります。, OSやアプリケーションの文字コードを内部コードと言うと、CID番号の付いたグリフは表示層と言えます。この内部コードと表示層を分離して、CMapで仲立ちをさせていることになります。この仕組みでフォントをプラットフォームの文字コードから独立にした、ということがCIDフォントの意義ということになります。, 但し、CMap方式で入力値として指定できるのは単一コードになります。縦書と横書に対してCMapを切り替えることで、単一の入力コードからそれぞれ異なるグリフを得るCIDフォント方式は、漢字やかなのような単純な記法の文字を使う日本語や中国語などしか適用できないでしょう。例えばアラビア文字や南インド文字、あるいはラテン文字の結合やリガチャには対処し難いように思います。, このエントリーのトラックバックURL: メイン CID-KeydフォントのためのCMapファイルが配置されてい ... PDFでは、さらにクラスID・サブクラスIDというコードが先頭に付けられるため、12桁となります。 クラスID・サブクラスIDと、PANOSE-1コードはTrueTypeまたはOpenTypeフォントから、ツールを使って取得することができます。 Microsoft社が配 … ・idDelta[], 例えばユニコードで0x5511を変換する場合には、 表示されません。 変換後の値=0x5511 + dDelta[n], 今回はユニコードで0x0000~0xFFFFまですべての文字についての変換表が欲しいので、 2012年2月29日 (水) 23時33分, メールアドレス: | PDFと文字(26) – ハングルの扱い », Adobe-Japan1、Adobe-GB1などのグリフセットでは、ひとつひとつのグリフにCIDという番号が付いていることは説明しました。CIDフォント・ファイルには、文字を画面表示したり印刷するためのグリフ・データを収容しています。フォント・ファイルに収容されているグリフ・データにアクセスするときはCID番号を使わなければなりません。, Windows、LinuxやマッキントッシュなどのOSや、OSの上で動くアプリケーションは、Unicode、または機種専用の文字コードを使ってテキストを処理します。一方、CIDフォントにあるグリフを使ってその文字を表示・印刷するには、文字コードからCIDに変換しなければなりません。, アドビシステムズはAdobe-Japan1、Adobe-GB1などのグリフセット毎に多数のCMapファイルを提供しています。古いCMapにはNECのPC、富士通のPC、Windows3.1、マッキントッシュなど機種依存文字コードからCIDへの変換用が沢山あります。しかし、最近のCMapはUnicodeからCIDへの変換用が中心になっています。, 例えばAdobe-Japan1用の比較的新しいCMapには次のようなものがあります。, 各CMapファイルには、横書用(-H)と縦書用(-V)の2種類があることに注意してください。これは次のような仕組みです。, (1)文字によっては横書と縦書で表示・印刷用の字形が異なるものがあります。 続いてnumTablesの分だけ「テーブル」が並びます。 取得はLookupで行うのが無難だと思います。 不得意分野では使わない. 位置に置きたいと思うのですが、cmapを変更してそういったこともできるでしょうか。, 具体的にはFinalCutでBoris Title3Dという字幕を入れるソフトです。, cmapを変更するというより、OpenTypeフォントのvertフィーチャーを トップページ ョンを作成する, 以前のバージョンのドキュメント. ※Adobe-Japan1-6 Character Collection for CID-Keyed Fonts p. 12, p. 76. CMap::ゲットネクストアソック CMap::GetNextAssoc で rNextPosition マップ要素を取得し、マップ内 rNextPosition の次の要素を参照するように更新します。 Retrieves the map element at rNextPosition , then updates rNextPosition to refer to the next element in the map. | OpenTypeフォントの続き(7)・・・locaテーブル », cmapテーブルは文字コードからグリフインデックスへのマッピングを定義するテーブルで、必須である。また、様々なプラットフォーム・エンコーディング向けに複数のサブテーブルを定義することができる。, NumTablesフィールドはcmapテーブルに含まれるエンコーディングサブテーブルの数を表し、EncodingRecordsフィールドはエンコーディングレコードの配列を表す。各エンコーディングレコードの構造は次のようになる。, PlatformID、EncodingIDフィールドの表す値は、nameテーブルの回で説明した通りである。Offsetフィールドはcmapテーブルの先頭からのエンコーディングサブテーブルへのオフセットを表し、この値を使って、各エンコーディングサブテーブルにアクセスする。次にエンコーディングサブテーブルの構造であるが、エンコーディングの特性に応じて、複数のフォーマットが定義されている。各フォーマットの概要は次のようになる。, フォーマット0は、1バイトエンコーディングフォーマットである。フォーマット2は、混合8/16ビットエンコーディングフォーマットで、1バイトと2バイトの文字コードが混在する日本語のShift-JISなどで使われる。フォーマット4は2バイトエンコーディングフォーマットである。フォーマット8、10、12は4バイトエンコーディングフォーマットである。MicrosoftはWindows向けのサロゲートペアに対応したUnicodeフォントを作成する時、フォーマット4とフォーマット12を組み合わせて使うように推奨している。ちなみに、どのフォーマットが使われているかを判定するには、各エンコーディングサブテーブルの先頭2バイトがフォーマットの種類を表すFormatフィールドで始まるので、このフィールドを参照して判定できる。, 上の画像はTahomaフォント(TAHOMA.TTF)を解析した時の実行結果である。MacintoshプラットフォームとMicrosoftプラットフォーム向けの2つのエンコーディングサブテーブルが含まれていることが分かる。Microsoftプラットフォーム向けのエンコーディングサブテーブルは、Unicodeエンコーディングでフォーマット4が使われていることも分かる。Macintoshプラットフォーム向けのエンコーディングサブテーブルは、下の画像が示す通り、フォーマット0が使われている。, 実際に、TAHOMA.TTFファイルをMacintosh上でそのまま使えるかは分からないが、フォーマット0は1バイト文字コード向けのフォーマットなので、Macintosh上では、最大256個のグリフまでしかアクセスできないことになる。, 最後にいつもならMS ゴシックフォントを解析するところだが、結果がTahomaフォントとあまり変わらないので、インターネット上で見つけた無料のフォントを解析してみた。, Macintoshプラットフォーム向けにShift-JISのエンコーディングサブテーブルが定義されていて、フォーマット2が使われていることが分かる。, Mac OSXの欧米ソフトで縦書きフォントを使いたいのですが、フォントの選択肢には横書きのものしか 末尾に-Hの付くCMapを使うと、文字コードから横書用グリフのCID番号に変換することになり、同-Vの付くCMapを使うと、縦書用グリフのCID番号に変換することになります。 OSやアプリケーションの文字コードを内部コードと言うと … « OpenTypeフォントの続き(5)・・・OS/2テーブル | ・PDFで文字が検索できないけど? 何が問題? どうしたら良い?(アンテナハウスPDF資料室), ※このコラムおよび、コラム中の文章、画像、動画の無断転載および複製等の行為はご遠慮ください。. CMapとcmapはいずれも同じ役割を持っていますが「CMap」はPostScript処理系で用いられ、通常フォントの形で存在し、CIDフォントが文字コードをCIDに対応付けるために使います。 「cmap」はTrueTypeまたはOpenTypeフォントが使用し、文字コードをGIDに対応付けます。 | このページへのリンク, 第17回 androidアプリでPDFを表示する, 第16回 フォント名をフォントファイルから取得する, 第14回 ドラッグアンドドロップで処理する, 第13回 小説家になろう縦書きPDFを変換する, 第12回 PDF内で複数のフォントを扱う, 第11回 フォントファイルからCMAP変換表を取り出す, 第10回 PDF内の文字をコピペできるようにする, 第09回 PDFファイルにフォントを埋め込む, 第08回 PDF埋め込みフォントの概要, 第06回 簡単なPDFファイルを作成する, 第05回 PDFファイルの内容を表示する, 第04回 PDFファイルからテキスト情報を抜き出す, 第02回 ファイルから行単位で読み込む, 第01回 PDFファイルフォーマットの概要. https://www.microsoft.com/typography/otspec/cmap.htm, 先頭から、2バイトのversion、2バイトのnumTables(テーブル数)があり、 フォント全体の設定: /StdVW [12] def /StdHW [11] def グリフデータの付加情報: 0 12 vstem 35 12 vstem 79 12 vstem 7 11 hstem → 縦線の太さは1ドットで統一 . 6~7年前に初版の語学書のPDFで、適切にテキストを取り出せない(文字コードを取得できない、文字化けする)というものに遭遇しました。後で試してみたら、文字列の検索もできませんでした。そのPDFは、フォントが埋め込まれ、原本印刷物のフォントで表示され、プリントできるもので、画面上では文字列の選択ができるにもかかわらず、コピー&ペーストやテキスト形式での保存で文字化けするというものです。ネイティブのDTPデータは残っていないとのことでした。, 一般的なDTPで組版している案件では、InDesignから直接書き出すPDFか、少し昔ならInDesignやQuarkXPressから書き出したPSファイルをAcrobat DistillerでPDF化するものでは、そのような事例に遭遇したことはありませんでした。, 伝聞によると、もともとは他所にてEDICOLORで組版されたとのこと。ただ、PDFの文書のプロパティ・概要は、このPDFを書き出す際に貼り込まれた(と推測される)QuarkXPress 4.1となっているので、元のバージョンは分かりません。また、PDFの文書のプロパティ-フォントで見えるフォント名は、通常のものではなく、「ATMFont-0-XXXXXXXX(埋め込みサブセット)」・「SystemG-XX-XXXXXXXX(埋め込みサブセット)」、種類:Type1、エンコーディング:カスタム、のような見慣れないものとなっています。, 当初はEDICOLOR特有の仮想フォントが影響している?などと考えました。Webで色々検索してみて、直接の原因ははっきりしませんが、こんなことが起きているのかもしれないなーと、とりあえず腑に落ちる説明がありました(文末に参考リンク)。, ◆フォント埋め込みされたPDFでは文字コードが取得できない、ものもある。 場合によってはCMapより高速な選択肢があるかもしれません。 いままでの例のような使い方はCMapには向かないパターンです。 C#でフォントファイルからcmapの情報を取得してファイルに保存したいと考えています。 cmapの情報を取得する方法をご存知の方がいましたら知恵をお貸しください。 よろしくお願いします。 この記事へのトラックバック一覧です: OpenTypeフォントの続き(6)・・・cmapテーブル: http://vanillasky-room.cocolog-nifty.com/blog/2008/07/opentype-4b7d.html, http://vanillasky-room.cocolog-nifty.com/blog/2008/08/opentype5gsub-2.html, UCDViewer(English page) -- Unicode Character Database Viewer, T2FAnalyzer(English page) -- TrueType/OpenType Font Analyzer, 本当はあまり何もしてくれないDelphi-ObjectiveCブリッジ(クラスインポート編), cmapテーブルの先頭からのエンコーディングサブテーブルへのオフセット(バイト単位). 今回はopen type fontのフォントファイルから変換表を取り出し、利用する処理を実装します。, これまではttfdump.exeでcmap_msgothic.txtを手動作成していました。 1つのテーブルはtag、checkSum、offset、lengthがそれぞれ4バイト、合計16バイト分あり、, tagが"cmap"のテーブルの(ファイル先頭からの)offset位置に変換表が用意されています。, 変換表の仕様を見ると、 すべての値において上記の計算を行って変換表を作成しています。, プロジェクトファイルをダウンロード, 日時: 2016年04月03日 21:10 まずグリフ(字形)名を見てみよう。この「IPAゴシック」の場合 「饅」(U+9945)のグリフ名は aj7220 だな。FontForgeだと[エレメント-グリフ情報-Glyph Name]で確認できるぞ。 同様に「頭」(U+982D)のグリフ名は aj3204。 「○」(U+25CB)のグリフ名は aj723。 グリフ(字形)ごとに名前がついているのか。 このグリフ名はフォントごとに異なる。たとえばNasuフォントだと「饅」(U+9945)のグリフ名は cid44662だったりする。 vanilla | https://www.microsoft.com/typography/otspec/otff.htm, ファイル先頭に4バイトのsfnt version、続いて2バイトのnumTables(テーブル数)、2バイトのsearchRange、2バイトのentrySelector、2バイトのrangeShiftが格納されており、, 続いてnumTablesの分だけ「テーブル」が並びます。