PDF 内部構造 テキストのソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[PDF 内部構造#説明|PDF 内部構造]]に戻る。 == '''概要''' == PDFの最も重要な機能であるテキスト機能を使ったPDFファイルの作り方について触れていきます。いままでの知識も必要になります。自分で作れるようになると楽しさがアップです。WordみたいなことがPDFだけで出来るようになっていきます。しかも、かなり柔軟に設定もできるので、作りたいと思った文書ファイルが思うがままです。こういうのを理解すると自分でPDFファイルを超柔軟な設定が扱えるようなプログラムを作りたくなってきます。 === '''テキスト状態''' === テキスト状態についての設定をするオペレータを紹介していきます。まずは、以下のようなソースで基本的な文書が作れることを示します。 <syntaxhighlight2 lang="text"> %PDF-1.7 %粤マモ 1 0 obj << /Kids [2 0 R] /Type /Pages /Count 1 >> endobj 2 0 obj << /Rotate 0 /Parent 1 0 R /MediaBox [0 0 1033 1462] /Resources 3 0 R /Type /Page /Contents [4 0 R] >> endobj 3 0 obj << /Font << /F0 << /BaseFont /Times-Italic /Subtype /Type1 /Type /Font >> >> >> endobj 4 0 obj << >> stream %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %ここからが方眼紙作成のグラフィックストリーム。 % .....(省略)..... % %ここまでが方眼紙作成のグラフィックストリーム。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %テキスト文字列部分ストリーム開始 BT %BT(=Begin Text) /F0 36 Tf % F0=Times-Italicで 36 Tfのフォントサイズ 1 0 0 1 100 800 Tm %Tmは現在のテキストマトリクスを移動(平行移動/回転/拡大縮小) 50 TL % TLはテキストレディング垂直(上下)余白 50 ポイントになる。テキストの左下が50ポイント間隔 (Create a PDF file. How the text works.) Tj T* %Tjはオペランドの配列()の中を現在のグリフ設定で描画。 %T*は次の行へ移動 3 Tc % Tcは文字の間隔 (Create a PDF file. How the text works.) Tj T* 10 Tw % Twは単語の間隔 (Create a PDF file. How the text works.) Tj ET % ET(=End Text) %テキスト文字列部分ストリーム終了 endstream endobj 5 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 6 trailer << /Root 5 0 R /Size 6 >> startxref 0 %%EOF </syntaxhighlight2> このような設定でPDF生成すると以下のようなPDF表示を得ることができます。 [[ファイル:PDF Text Condition.png|400px|thumb|none|テキストの例]] 方眼紙になっているので、文字列が50ポイント置きに配置されていることがわかります。ポイント単位で細かく文字を配置できる気配がします。そしてテキスト状態を変えるオペレータを記述すると最初は文字列の間隔が変わり、次に単語単位の間隔も帰れました。英語の斜体文字のグリフの扱いは複雑なので、どこがどれくらい広がったのか、論理的な説明は難しいので、ここでは、だいたい変化させれるということにとどめておきます。おいおい、検証することにしましょう。 Createの最後のeの文字に注目すると文字間隔を3ポイントにした後の真ん中の行と一番最初の行で比較すると、Createの文字の間は5つで、3 ポイント× 5 つ で15 ポイントです。eの左端が15ポイントくらいずれた場所に配置されている感じなので文字間隔が数値どおり広がっていると考えて問題ないでしょう。それにくわえて単語間となる部分の文字間隔は2つ分と単語間隔1つ分16ポイントくらい移動しているようにも見えます。 <table style="width: 100%; text-align: left; border-collapse: collapse; border-spacing: 0;"> <tr style=" background: #778ca3; border-right: solid 1px #778ca3; color: #ffffff;"> <th style="width: 175px;">オペランド</th> <th style="width: 175px;">オペレータ</th> <th>簡単な説明</th> </tr> <tr> <td>文字列</td> <td>Tj</td> <td>オペランド配列で指定されてた文字列の描画をする</td> </tr> <tr style=" background: #eeeeee;"> <td>数値</td> <td>TL</td> <td>垂直文字間隔の設定。規定値は100</td> </tr> <tr> <td>数値</td> <td>T*</td> <td>次の行に移動</td> </tr> <tr style=" background: #eeeeee;"> <td>数値</td> <td>Tc</td> <td>文字間隔のポイント値をオペランドに指定</td> </tr> <tr> <td>数値</td> <td>Tw</td> <td>単語間隔のポイント値をオペランドに指定</td> </tr> <tr style=" background: #eeeeee;"> <td>数値</td> <td>Tf</td> <td>フォントサイズ</td> </tr> <tr> <td>数値</td> <td>Tz</td> <td>水平間隔。指定した値/100の値。規定値が100で1を意味する</td> </tr> <tr style=" background: #eeeeee;"> <td>数値,数値,文字列</td> <td>"</td> <td>オペランドに文字間隔,単語間隔,文字列を一括で指定するオペレータ</td> </tr> <tr> <td>文字列</td> <td>'</td> <td>T* 文字列 Tj という構造の動作を文字列 ' だけで指定できる</td> </tr> <tr style=" background: #eeeeee;"> <td>文字列に数値を含む</td> <td>TJ</td> <td>オペランドに文字間隔と文字列を一括で指定するオペレータ</td> </tr> <tr> <td>数値6個</td> <td>Tm</td> <td>最初の数値はcmで指定する値と同じ意味だが、テキストがグラフィックス座標系を基準とした上に配置される点では同じオペレータではない。</td> </tr> <tr style=" background: #eeeeee;"> <td>数値</td> <td>Tr</td> <td>整数値1指定でモード切替。</td> </tr> <tr> <td>数値</td> <td>Ts</td> <td>ベースラインモードを整数値で切り替え。</td> </tr> </table> === '''日本語を扱う''' === ==== '''日本語PDFファイルサンプル''' ==== 残念ながら上記のような設定ではテキストで文字列配列の部分に日本語を入力しただけでは日本語は扱えません。簡単ではないってことですね。フォント設定にコツがいります。文字列配列の指定もエスケープシーケンスを意識した設定が必要です。で、実際に手作業で組んでいくのはかなり難しいので、ここでは既に日本語への変換方法を知っているアプリケーションにPDFを作成してもらって、そこから解析していくという、手法をとります。わかってる人たちはスゴイよ。自分は信頼できるアプリケーションとして、Windows10でMicrosoftWordを使います。やっぱね。この組み合わせは安定しているよ。完璧なアプリケーションとは言えないかもしれなけれど、PDFを出力する基本部分くらいなら、100%大丈夫だよね。さすがは世に出てきているだけのことはある。そんな感じです。個別のフォントでどういう設定にするべきかを調べようと思うと、また別のフォント解析アプリを使ったり、作ったりして立ち向かう必要がありますが、そういう基本的なことをWordとWindows10の組み合わせではやってくれます。 ありがたい。で、さっそく出力しました。それだけだと埋め込みフォントっていう、もう一歩先進的なことをやってしまいますので、これを埋め込まないフォントとして扱うように、ちょろっとイカサマ的な操作をします。そうして出来上がるのが以下のような文書です。文書の内容は「美しいMS ゴシックフォントの世界」としました。あんまり長文にすると、わけわからなくなってくるので、16文字ね。 サンプルソース:[[メディア:JpTextPoweredByWord-text.pdf|JpTextPoweredByWord-text.pdf]]<br /> サンプルPDF :[[メディア:JpTextPoweredByWord.pdf|JpTextPoweredByWord.pdf]] ※WindowsとかのMSゴシックフォントが存在する環境でのみ表示される日本語テキスト表示PDFです。通常PDFではフォント情報を埋め込む方式を使うので、環境によって表示されない、このような環境依存方式を採用することはありません。これは簡単に表示させるための作戦でしかないです。 [[ファイル:PDF Text_JpString.png|400px|thumb|none|日本語テキスト表示の例]] 少し長いサンプルソースなので、全部載せて、説明はしません。日本語を表示するために、使われているフォントやコード関連のオペレータの意味については解読して、日本語文書ファイルを作れるようにしていきます。 ==== '''日本語PDF仕組み''' ==== Windowsでのコマンドラインは、自分はSJISで動かしています。PDFtkはファイルをSJISで書かれている認識して処理しています。そうするとファイル中で日本語を使うときは、2種類の方法になります。ひとつはSJISの文字コードの数値あるいはテキストそのままを入れて文字を表現する。テキストをそのまま入れる場合は文字コードのレベルで数値化したレベルのPDFファイルとして認識してSJISとして処理されるという概念を常に意識します。もう一つは、SJIS以外の文字コードを使うとして、オペレータで文字コードはこういうものを使っていますと指定して、文字コードの数値で入力するという方法です。そのまま日本語の文字列をPDFファイル内に配置する訳にはいかないことが面倒なところです。ということは、テキストエディタだけでPDFを構成するのは簡単ではないと想像できると思います。この他、イメージなんかも全部テキストで表現するとしたら同じような理由でテキストエディタだけで操作するのは、困難を極めます。自分でPDF編集アプリをつくらないと楽にはならないでしょう。でも、理解するということは、そういうことをやっていくきっかけにはなるはずです。 簡単じゃないのはいやだな。 ==== '''日本語PDFフォント情報''' ==== では、日本語を入力することを考えていきましょう。 要(かなめ)は、フォント情報をページ構成の一部として取り込む部分です。英字でもやった。リソースオブジェクトとして設定した辞書のなかに設定する /Font オペレータですね。一般にはフォント設定は3個のオブジェクトに分けて書くことが多いようです。以下のような構成です。 <syntaxhighlight2 lang="text"> 2 0 obj << /Resources << /Font << /F0 3 0 R >> >> >> 3 0 obj %Resourceで定義されたフォントに関する辞書 << /Type Font /Name /F0 /Subtype /Type0 /BaseFont /#82l#82r#83S#83V#83b#83N %KozMin /KozMinPr6N-Regular /DescendantFonts[4 0 R] >> 4 0 obj %Fontで定義されたDescendantFontに関する情報 << /Type /Font /SubType /CIDFontType2 %KozMin /CIDFontType0 /BaseFont #82l#82r#83S#83V#83b#83N %KozMin /KozMinPr6N-Regular /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) %KozMin (Japan1) /Supplement 0 % KozMin 6 >> /FontDescriptor 5 0 R >> 5 0 obj %DescendantFontで定義されたFontDescriptor情報 << /Type /FontDescriptor /FontName #82l#82r#83S#83V#83b#83N %KozMin /KozMinPr6N-Regular /Flags 6 /StemV 6 0 R /Ascent 859 /Descent -140 /ItalicAngle 0 /FontBBox 7 0 R /CapHeight 679 >> … </syntaxhighlight2> という具合にリソースの定義部で、/Fontフォントが定義され、その中で/DescendantFont。そしてさらにその中で/FontDescriptorについての定義される。%KozMinは、Macのフォントの小塚明朝の場合はこんな感じの記述という例で、完全に動作するとは保証できないのであしからず。この3段論法みたいなフォント情報はひとつにまとめて書くことが出来る。まとめて記述するには、以下のような感じ。 <syntaxhighlight2 lang="text"> 2 0 obj << /Resources << /Font << /F0 3 0 R >> >> >> 3 0 obj %Resourceで定義されたフォントに関する辞書 << /Type /Font /Subtype /Type0 /BaseFont /#82l#82r#83S#83V#83b#83N /ToUnicode 4 0 R /Encoding /Identity-H /DescendantFonts [ << /Type /Font /BaseFont /#82l#82r#83S#83V#83b#83N /W 11 0 R /CIDToGIDMap /Identity /CIDSystemInfo << /Supplement 0 /Ordering (Identity) /Registry (Adobe) >> /Subtype /CIDFontType2 /FontDescriptor << /FontName /#82l#82r#83S#83V#83b#83N /StemV 1000 /Ascent 859 /Flags 6 /Descent -140 /ItalicAngle 0 /FontBBox [-1000 -140 1000 859] /Type /FontDescriptor /CapHeight 679 >> >> ] >> endobj 4 0 obj << >> stream endstream endobj … </syntaxhighlight2> ==== '''日本語PDFフォント情報のオペレータ個別の意味''' ==== [[PDF 内部構造#説明|PDF 内部構造]]に戻る。
PDF 内部構造 テキスト
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ