Home

手書きPDF入門

テキストエディタで作ったサンプルファイルでPDFのファイル形式を解説

今ごらんになっているファイル一式ダウンロードできます → pdfxhand.zip

本文目次

はじめに
PDFとは
PDFの現状
ファイル形式
ファイル構造
基本要素
文書構造
リソース
フォント
ストリーム
文字の描画
図形の描画
画像の描画
エンコード

付録目次

PDFとPostScript
フォントについて
色について
圧縮方式とASCII変換
相互参照
行末コード
Acrobat SDK
参考文献

What's New


データベースホスティング


多言語Markdownオーサリング


Markdownダイナミック変換


Markdown解説



: 99/11/16 /
: 99/11/18 
: 99/11/23 
: 08/10/31 



AcrobatPDFWebCD-ROM使 Acrobat Reader

PDF PDF

PDF調PDF使

PDFPortable Document Format Reference Manual PDF調AdobeSeyboldPDF: A Look InsideWeb Acrobat

PDF PDFAcrobatPDF PDF PDF Reference Manual

PDF


PDFPortable Document FormatAdobe Systems OS

AdobePDFAcrobat Reader WebCD-ROM Web PDFCD-ROM

AdobePDFAcrobat AcrobatPostScriptPDFDistillerPDFPDFWriterAcrobatExchange Acrobat使

PDFAcrobat PDFPDF

PDF


PDF1.3 PDF 1.3Acrobat4 Acrobat 3PDF 1.2

v1.2v1.3


PDFASCII

PDF PDFASCII ASCII

PDFASCII

手書きサンプル → テキスト

また、実際にAcrobat Readerで表示してみてください。

手書きサンプル → PDF

たった1ページの文書です。 3行の文字列(英語と日本語)、図形が2つ(将棋の駒とたまご)、画像が1個(階段)あるはずです。

sample.gif

さて、それでは説明に入りますが、アプローチとして、PDFファイルを外側から内側へと順に見ていきます。

ファイル構造

全体的に見ると、PDFファイルは、先頭部分、本体部分、末尾部分に分かれます。

%PDF-1.2

1 0 obj
<<
 /Type /Page
 /Parent 7 0 R
 /Resources 3 0 R
 /Contents 2 0 R
>>
endobj
.
.
.
9 0 obj
<<
 /CreationDate (D:19991115)
 /Title (Hand-written sample PDF)
 /Author (ARAI Bunkichi, Yokohama Koubunsha)
>>
endobj

xref
0 10
0000000000 65535 f
0000000012 00000 n
0000000184 00000 n
0000001672 00000 n
0000001888 00000 n
0000002185 00000 n
0000002569 00000 n
0000002992 00000 n
0000003218 00000 n
0000003324 00000 n
trailer
<<
 /Root 8 0 R
 /Info 9 0 R
 /Size 10
>>
startxref
3475
%%EOF

ファイルの先頭


 %  1%PDF-1.2 PDFPDF1.2


1 0 objendobj 9 0 objendobj



objIDgeneration



%%EOF

startxrefxrefx

xrefcross reference

3 IDid gen objid

  

xrefstartreftrailer

/Root/Info /Size


PDF PDF


PDFAdobePostScript PostScript使PDF

  PostScriptPDF

PDF


truefalse


 (...) ASCII <...> 16 Shift-JISASCII16使
 (Hello world)
 <8A4682B382F182B182F182C982BF82CD> ← 皆さんこんにちは(Shift-JIS)




 12
 4.55



使  / ASCII # 216
 /Dog
 /#82l#82r#83S#83V#83b#83N ← MSゴシック(MSは全角文字)

Acrobat21162ASCII


 [...] 
 [ /Dog (Poti) 5 true ]
 [ [ /Tokyo (03) ] [/Osaka (06) ] ]


 << ... >> 
 << /Type /Dog /Name (Poti) /Age 5 /Male true >>
 << /Tokyo (03) /Osaka (06) >>




PDFPostScript movetom12

PostScriptPDF
 100 100 m
 200 200 l

mmovetollineto (100,100)(200,200)


obj ... endobj  IDgeneration
 id gen obj
 .
 .
 .
 endobj

RID
 id gen R


 [ (Poti) ]


 1 0 obj
  (Poti)
 endobj

 [ 1 0 R ]





1
 1 0 obj
  /Dog
 endobj

 2 0 obj
 <<
  /Name (Poti)
  /Age 5
  /Male true
 >>
 endobj

 [ 1 0 R 2 0 R ] 

2 2 3 2
 [ /Dog << /Name (Poti) /Age 5 /Male true >> ]


PDF

/Type

PDFID ID1IDID
trailer
<<
 /Root 8 0 R
 /Info 9 0 R
 /Size 10
>>

先に見たように、PDFファイルの最後にはtrailerという箇所がありました。 ここには辞書( << ... >> )があり、/Root属性でオブジェクトが参照されています。 これが文書構造の頂上を示すオブジェクトです。 この場合はIDが8のオブジェクトがそれにあたります。

カタログオブジェクト

8 0 obj
<<
 /Type /Catalog
 /Pages 7 0 R
>>
endobj

IDが8のオブジェクトのタイプは/Catalogで、これをカタログオブジェクトと呼びます。 ここにはPages属性があり、そこからページ一覧を持つオブジェクトが参照されています。

ページ一覧オブジェクト

7 0 obj
<<
 /Type /Pages
 /Kids [ 1 0 R ]
 /Count 1
 /MediaBox [ 0 0 595 842 ]
>>
endobj

ID7/Pages /Kids 11ID1 /Count

/Kids
 /Kids [1 0 R 5 0 R ... 18 0 R]

1ID12518

/MediaBox 4XYXY 1/721A4

ページオブジェクト

1 0 obj
<<
 /Type /Page
 /Parent 7 0 R
 /Resources 3 0 R
 /Contents 2 0 R
>>
endobj

タイプが/Page(単数)のページオブジェクトです。 /Parent属性は上位のページ一覧オブジェクトに戻れるようにするものです。 /Resources属性は、フォントなど、このページの描画で使用するリソースを指すもので、次の項で説明します。 /Contents属性で指定されるものが、ページの本体で、これをコンテンツストリームと呼びます。 リソース(フォント)の説明の後、ストリームについて説明します。

ここまでのところを整理すると、文書構造は次のように図示できます。

  trailer
    /Root → /Catalog
               /Pages → /Pages
                           /Kids → /Page
                                      /Resources → リソース
                                      /Contents → コンテンツストリーム

書類情報

ここまで述べた属性やオブジェクトは文書の骨組みを形成するものです。 PDFではこのほか、作成者や作成日など文書そのものに関する情報、しおりや注釈といった付加機能に関連した属性やオブジェクトも定義されています。

9 0 obj
<<
 /CreationDate (D:19991115)
 /Title (Hand-written sample PDF)
 /Author (ARAI Bunkichi, Yokohama Koubunsha)
>>
endobj

このサンプルファイルには書類情報が含まれています。 先述のとおり、書類情報は、trailerの辞書の/Info属性で参照されるオブジェクトの辞書に指定します。 これは、Acrobatの[ファイル|書類情報|一般]で表示できます。

しおりと注釈

Acrobat Readerの画面の左側に表示され、目次の働きをするしおり(outline, bookmark)は、カタログオブジェクトの/Outlines属性に指定します。 各ページに添付する注釈(annotation)は、ページオブジェクトの/Annots属性に指定します。 また、各ページのサムネール(小型表示見本)は、ページオブジェクトの/Thumb属性に指定します。

詳細はPDFの仕様書を参照してください。

リソース

リソースとは、後述するコンテンツストリーム内の描画で用いられる素材のことで、該当するページで使用するオペレータ、フォント、色空間(色の表現方法)の定義情報や、複数ページで共通に利用する画像やパターンなどです。

このサンプルのリソースオブジェクト(ページオブジェクトの/Resource属性から参照)は、使用するオペレータの種類とフォントを指定します。 色空間は、デバイス色というデフォルトのものを使うので指定を省略します。

3 0 obj
<<
 /ProcSet [ /PDF /Text ]
 /Font << /F1 4 0 R >>
>>
endobj

使用オペレータの種類は/ProcSet属性で指定します。 あらかじめ定められたオペレータのグループを表す名前を配列内に列挙します。 ここでは、基本描画オペレータ群を表す/PDFと、テキスト描画オペレータの/Textを指定しています。

/Font属性には使用するフォントを指定します。 /ProcSetのように配列ではなく、辞書の中にフォント名とフォントオブジェクトの対を指定します。 ここでは、IDが4のオブジェクトで定義されているフォントを/F1(名前は何と付けてもよい)という名前で参照することを指定します。 この/F1は後述の文字列の描画の際に出てきます。

フォント

リソースオブジェクトから参照されているフォントの定義をみてみましょう。 これは、WindowsのTrueTypeフォントの「MSゴシック」をPDFから利用できるよう定義したものです。 実際にAcrobat 4のPDFWriterが出力したものをそのままコピーして使いました。

4 0 obj
<<
 /Type /Font
 /Subtype /Type0
 /BaseFont /#82l#82r#83S#83V#83b#83N
 /DescendantFonts [ 5 0 R ]
 /Encoding /90ms-RKSJ-H
>>
endobj

5 0 obj
<<
 /Type /Font
 /Subtype /CIDFontType2
 /BaseFont /#82l#82r#83S#83V#83b#83N
 /WinCharSet 128
 /FontDescriptor 6 0 R
 /CIDSystemInfo
 <<
  /Registry(Adobe)
  /Ordering(Japan1)
  /Supplement 2
 >>
 /DW 1000
 /W [
  231 389 500
  631 631 500
 ]
>>
endobj

6 0 obj
<<
 /Type /FontDescriptor
 /FontName /#82l#82r#83S#83V#83b#83N
 /Flags 39
 /FontBBox [ -150 -147 1100 853 ]
 /MissingWidth 507
 /StemV 92
 /StemH 92
 /ItalicAngle 0
 /CapHeight 853
 /XHeight 597
 /Ascent 853
 /Descent -147
 /Leading 0
 /MaxWidth 1000
 /AvgWidth 507
 /Style << /Panose <0805020B0609000000000000> >>
>>
endobj

だいぶ長いですが、オブジェクトが3つ出てきます。 IDが4と5のオブジェクトは、いずれも/Typeが/Fontで、両方ともフォントそのものの定義です。 IDが6のオブジェクトは、/Typeが/FontDescriptorで、これはフォントの文字の寸法に関する情報(font metrics)を納めたものです。

最初のフォント定義(ID=4)は/Subtypeが/Type0、2番めのフォント定義(ID=5)は/Subtypeが/CIDFontType2になっています。 いずれも名前は/#82l#82r#83S#83V#83b#83Nで、これはShift-JISで読むと「MSゴシック」です(MとSは全角)。 Type 0フォントとは韓中日など文字数の多い言語のためのフォントで、コンポジットフォントと呼ばれます。 それ自体は字体の情報を含まず、別のフォントを間接的に参照します。 2番めの/CIDFontType2はTrueTypeのことで、これが字体を持つ実体フォントです。

IDが6のフォント情報オブジェクトには、幅や高さなどフォントの幾何学情報が収められています。 文書作成時に使用したフォント(この例の場合はWindows/TrueTypeのMSゴシック)の寸法に関する情報です。 PDFファイルを表示また印刷する際に、作成時のフォントがなくても、字幅などの情報をたよりに、たとえ文字の書体は違っても、同じ体裁(同じ位置に同じ字形)になることが保証されます。

詳細 → フォントについて

ストリーム

さて、いよいよページの本体であるコンテンツストリームについてです。 これはページオブジェクトの/Contents属性から参照されるオブジェクトです。 ストリームは、必ずオブジェクトとして定義して、Rオペレータで参照します。 IDが2のオブジェクトが、この文書唯一のページのコンテンツです。

ストリームオブジェクトは、特定ページの中身、つまり、文字、図形、画像を描画するための命令やデータを集めたものです。 このサンプルでは、3行の文字列と2つの図形、画像を1つ描きますが、これらをすべてこのストリームのデータ部分に記述します。

2 0 obj
<<
 /Length 1335
>>
stream
.
.
.
endstream
endobj

ストリームオブジェクトは、辞書(<< ... >>)とそれに続くデータからなります。 例のとおり/Type属性は指定しません。 実際のデータはstreamとendstreamの間に記述します。 この部分のバイト数を/Length属性で指定します。 正確にいうと、streamの後ろの改行の次の文字から、endstreamの直前の改行の前の文字までが入ります。 筆者は、テキストエディタの中でこの部分を選択し、別ファイルに書き出してサイズを調べました。



PDF

PDFPostScript PostScript




/MediaBox (0,0)A4(595,842) 1/721XY

PDF CTMCurrent Transformation Matrix

6 transformation matrix PostScriptPDF
cood.gif

(tx,ty)xsxysy
 [sx 0 0 sy tx ty]

 [2 0 0 2 8 8] (8,8)XY


PDF調

調 調01 RGB301 CMYK401

fill color使stroke color

調RGB使

  


PDF

3 MS24使
 Hello World
 MSゴシック24ポイント
 それを灰色にしたもの

streamendstream
BT
/F1 24 Tf
1 0 0 1 72 648 Tm
(Hello World) Tj
1 0 0 1 72 612 Tm
<4D53835383568362834E3234837C834383938367> Tj
1 0 0 1 72 576 Tm
0.5 g
<82BB82EA82F08A44904682C982B582BD82E082CC> Tj
ET

BTBegin TextETEnd Text BTETPDF

TfText fontPostScriptsetfont使 /F124

TmText matrix 1tx = 723/2ty = 626 sx = sy = 1

Tjshow  (ASCII)  <16>  Hello World 1/2Tmty36MS24

3調gsetgray0.5


使

PDFPostScript fillstroke

Illustrator使


q
12 0 0 12 72 360 cm
0 0 0.5 rg
0 0 m
12 0 l
10 11 l
6 12 l
2 11 l
f
Q
koma.gif

cmconcat (72,360) 12 1511/6

cmqgsave使 Qgrestoregraphics state

rgsetrgbcolorRGB  [0 0 0.5] 

mmoveto llineto ffill

次は赤い線の縦置きのたまごです。

q
.5 w
12 0 0 12 360 360 cm
0.5 0 0 RG
0 0 m
8 0 4 12 0 12 c
-4 12 -8 0 0 0 c
S
Q
egg.gif

cmqQ 12X

wsetlinewidth 0.56

RGRGBrgRGfillstroke使fillrg使 fillstroke PostScript

mmoveto ccurveto2c sstroke

c6
 x1 y1 x2 y2 x3 y3 c

3XY (x0,y0) (x0,y0)(x3,y3) (x1,y1)(x2,y2) (x0,y0)(x1,y1)(x2,y2)(x3,y3)

画像の描画

PDFではカラーまたは灰色階調とモノクロのビットマップ画像を描画できます。

ここではマスクと呼ばれる特別なモノクロ画像を表示してみます。 これはあるピクセルを描くか透明にするかを示すビットマップです。 別の画像と重ねて縁取りをしたり、中をくりぬいたりするのに使いますが、単独で任意の色を持つ1色刷りの画像としても使えます。

カラーまたは灰色階調の画像の表示方法も画像マスクとほぼ同様ですが、ピクセルあたりの色数やビット数を指定します(マスクの場合は常にピクセルあたり1ビット)。

0 0.5 0 rg
144 0 0 144 72 144 cm
BI
/W 16
/H 16
/BPC 1
/F /AHx
/IM true
ID
0FFF
0FFF
0FFF
0FFF
00FF
00FF
00FF
00FF
000F
000F
000F
000F
0000
0000
0000
0000>
EI

BIBegin ImageIDImage DataEIEnd Image

BIID /IMImageMask /BPC = BitsPerComponents1 /W = /Width16/H = /Height16 16 × 16 × 1 ÷ 8  32 

/F/Filter16/AHx = /ASCIIHexDecode使1162> ASCII使 ASCII

IDEI1216 16

BIrg [0 0.5 0] 01

Cmconcat12 PDF1Cm1442 16  1  14419144/16


PDF

ASCIIASCII16 PDF


PDF/Filter

LZWZIPJPEGFAX 7ASCII

  ASCII

PDF ASCII

PDFASCII



PDF



PostScriptAcrobat SDK

PDFPostScript


ASCII


Acrobat SDK

PDFPostScript


PostScript PDFPostScript PDFPostScriptEncapsulated PostScript

PDF: A Look InsidePostScript PostScript

PostScript使WebPostScript Error PostScript

PostScript

PDF

PostScriptPDF PostScriptshowpage

Illustrator使Encapsulated PostScriptEPS1PostScript EPSPostScript

PDF


PostScript256 256

AdobeTrueTypeCIDCharacter IdentifierPDF TrueType

PDF使 PostScript/ PDF使


PDF/ color space 0.01.0


色空間説明
DeviceGray灰色階調
DeviceRGB画面の光点の強さを赤緑青3原色で表す
DeviceCMYK印刷で藍紅黄墨4色インクの量を表す

デバイス独立色には次のものがあります。

色空間説明
CalGray灰色階調を補正
CalRGBRGB色を補正
LabL*/a*/b*という3つの値で色を指定
ICCBasedICC(International Color Consortium)という機関が定めたプロファイルを使用

特殊表現には次のものがあります。

色空間説明
Separation印刷でインクの色ごとの版を作るために使用
DeviceN印刷で蛍光色など特殊インクの版を作るために使用
Indexed画像の描画で、色値を直接指定せず、パレットに納めた色のインデックス値で指定
Patternタイルや網掛けを指定

PDF調 DeviceGrayDeviceRGB

ASCII


PDFASCIIASCII

PDFASCII Acrobat

PDF
圧縮方式説明用途
LZWDecodeLempel-Ziv-Welch方式テキスト/合成画像
RunLengthDecode繰り返しを除去合成画像
CCITTFaxDecodeファクシミリ方式(CCITT Group 3/Group 4)モノクロ画像
DCTDecodeJPEG方式写真画像
FlateDecodeZLIB/DEFLATE方式(ZIP)テキスト/合成画像

LZWDecodeFlateDecode PostScriptUnisysLZW ZIP

LZWCompuServe使GIF使 Unisys使 ZIP ZIPRFC1950/1951使

ASCII 7 7ASCII

PDF2ASCII
変換方式説明性能
ASCIIHexDecode1バイトを16進数2桁で表現サイズは2倍
ASCII85Decode印字可能部分の85文字を使うもの4バイトが5バイト、つまり25%増し

ASCIIBASE643433%

WebCD-ROMASCII BASE64


PDFWeb518PDF PostScriptPDF912

cross reference

使
xref
0 9
0000000000 65535 f
0000000012 00000 n
0000000184 00000 n
0000001672 00000 n
0000001888 00000 n
0000002185 00000 n
0000002569 00000 n
0000002992 00000 n
0000003218 00000 n
trailer
<<
 /Root 8 0 R
 /Size 9
>>
startxref
3324
%%EOF

ID

startxref trailer/Size

xref2 ID0 0使2ID089 id gen objid f使n使


Acrobat

16


MacintoshCR1UNIX(LF)1WindowsCRLF2

PDF

AcrobatMacintoshCR使 CR1

WindowsCR-LF WindowsMacintoshAcrobat Reader

PDFPDFEncapsulated PostScriptEPSMacintoshWindows

Acrobat SDK


PDF

PDFPDFAdobe PDF

PDF LZWUnisysRSA使

AdobeAcrobatAPI AcrobatPDF AdobeAcrobatPDFPDF

Acrobat APIAcrobat SDKWeb AcrobatAPI AcrobatAPI使Acrobat ReaderDLLAdobe

Acrobat SDKPDF AcrobatPDF

Acrobat SDKPDF Acrobat SDK


PDFAcrobatPostScriptAdobe SystemsWeb


http://www.adobe.com/products/acrobat/adobepdf.html
http://www.adobe.co.jp/products/acrobat/adobepdf.html




http://partners.adobe.com/asn/developer/technotes.html
ftp://ftp.adobe.com/pub/adobe/devrelations/devtechnotes/pdffiles/

PDF


Adobe Systems Incorporated, PostScript Language Reference Manual, Third Edition, Addison-Wesley, 1990, ISBN 0-201-37922-8.
Adobe Systems Incorporated, Portable Document Format Reference Manual, Version 1.3, March 11, 1999

AdobeSeybold 稿PDF使



Kobu.Com Logo
: 
:  (Kobu.Com) 






Copyright (c) 1999 Kobu.Com. All rights reserved.