PDF 構文 メタデータ
PDF構文 [PDF Syntax ISO 32000-2]
ここでは32000-2規格に基づいたPDF2.0の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明しPDF StructureやPdftools SDKでのPDFデータ解析や編集をより詳細にできるようにします。
8. メタデータ (Metadata)
PDF文書の一般的な情報としてメタデータを格納できます。メタデータには例えば、タイトル、作成者、作成および変更の日時などが記載されます。
PDF文書に関するこのような情報はドキュメントメタデータと呼ばれ、オブジェクトレベルのメタデータでメタデータ(Metadata)ストリームとして格納されます。これはPDF2.0で推奨された方法です。
他に、このような情報を文書情報(Document Information) ディクショナリに格納する方法もありますが、CreationDateおよびModDateエントリを除いてPDF2.0では非推奨になりました。
PDF文書に関連した情報はカタログディクショナリのMetadeta要素にあります。
メタデータストリームがPDF1.4で使用開始されたとき、メタデータエントリを表すための豊富なメカニズムを提供するXMPが導入されました。
XMPはISO16684-1規格に準拠したXMLデータです。
PDF2.0ではメタデータを表す文法をISO16684-1規格に従うものと規定されました。
XMPを使用するとドキュメントのタイトルを複数の言語にすることも、ドキュメントの作成者をリストとして表すこともできます。
メタデータはPDF文書を補足する情報ですので、文書の表示には影響を与えません。
一般的にメタデータはPDF文書のカタログ化や検索などに利用されます。
メタデータの変更は容易ですし、削除することもできます。
| 「PDF Imger-LP」 | メタデータ抽出 | メタデータ抽出サンプルコード | ||||
|
||||||
8.1 メタデータ(Metadata)ストリーム
メタデータはストリーム(Stream)に記載できます。このストリームを「メタデータ ストリーム」といいます。
ストリームを持ったオブジェクトですのでこのオブジェクトのタイプは「ディクショナリ」です。メタデータ ストリームは通常のストリーム ディクショナリに加えて以下のエントリが追加されます。
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
ドキュメントレベルのメタデータを表すメタデータストリームは、カタログディクショナリのMetadata要素を介してPDF文書に添付できます。
このメタデータストリームはXML(Extensible Markup Language)で表されるメタデータであり、文書情報辞書(Document Informationディクショナリ)にも記載できますが、「メタデータを表すXMLの文法はXMP(Extensible Metadata Platform)仕様(ISO 16684-1)に従って定義されるものとする」とPDF2.0でより明確に指定されました。XMPの要素は「8.3名前空間プロパティ」を参照してください。
以下は、メタデータの例です。
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
<dc:format>application/pdf</dc:format>
<dc:creator>
<rdf:Seq>
<rdf:li>作成者</rdf:li>
</rdf:Seq>
</dc:creator>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">文書タイトル</rdf:li>
</rdf:Alt>
</dc:title>
<dc:rights>
<rdf:Alt>
<rdf:li xml:lang="x-default">Copyright 2014-2026 株式会社トラスト・ソフトウェア・システム</rdf:li>
</rdf:Alt>
</dc:rights>
<xmpRights:WebStatement>https//www.trustss.co.jp/</xmpRights:WebStatement>
<xmpRights:Marked>False</xmpRights:Marked>
<xmp:CreateDate>2026-02-07T00:00:00+09:00</xmp:CreateDate>
<xmp:MetadataDate>2026-02-07T00:00:00+09:00</xmp:MetadataDate>
<xmp:ModifyDate>2026-02-07T00:00:00+09:00</xmp:ModifyDate>
<xmp:CreatorTool>PDF Structure Library (https://www.trustss.co.jp/)</xmp:CreatorTool>
<pdf:Producer>PDF Structure Library Ver 1.10.2 (https://www.trustss.co.jp/)</pdf:Producer>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
PDF Imager-LP(無償版)でHelloWorld.pdfの「メタデータ」を表示するソースコード
このPDFの内容はHelloWorld.txtです。
| C# | C/C++ |
HelloWorld.pdfのメタデータをXMPとしてImager-LPで解析すると、以下のようになります。
dc: http://purl.org/dc/elements/1.1/
dc:format = "application/pdf"
dc:creator [rdf:Seq]
[1] = ""
dc:title [rdf:Alt]
[1] = ""
pdf: http://ns.adobe.com/pdf/1.3/
pdf:Producer = "Acrobat Distiller 10.1.3 (Windows)"
xmp: http://ns.adobe.com/xap/1.0/
xmp:CreatorTool = "Word 用 Acrobat PDFMaker 10.1"
xmp:ModifyDate = "2026-02-07T11:38:22+09:00"
xmp:CreateDate = "2026-02-07T11:38:15+09:00"
xmp:MetadataDate = "2026-02-07T11:38:22+09:00"
xmpMM: http://ns.adobe.com/xap/1.0/mm/
xmpMM:DocumentID = "uuid:352e51c6-c5a1-4710-bfd6-92ecdfa8db59"
xmpMM:InstanceID = "uuid:0f64c2dd-f790-4217-9469-25b37bc83bf6"
HelloWorld.pdfを解析するPDF Imager-LP(無償版)のソースコード
| C# | C/C++ |
8.2 XMP(Extensible Metadata Platform)
XMPパケットラッパ
PDF文書に関するドキュメントメタデータを記載する場合は、多くの場合で、以下のようにrdf:RDF要素をXMPパケットラッパで囲みます。
このラッパはXML processing instructions(PIs)で以下のように記述されます。
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
...
</rdf:RDF>
... パディング用の空白文字 ...
<?xpacket end="w"?>
begin要素のにはバイトオーダーマーク(BOM)が入ります。
XMPデータはUnicodeテキスト(UTF-8、UTF-16、UTF-32エンコード)で記載されることが求められています。
PDF文書はバイトデータで記載されていますのでUTF-8エンコードとなり、バイトオーダーマークは0xEFBBBFです。
XMPパケットに空白文字を追加することは有意義であるとXMP規格にあります。
空白文字(U+0020)は見た目に優しくするため100バイトごとに改行文字(U+000A)を追加します。
パディングには空白文字を2000バイト程度記述しておきます。
これによって、少々の変更であれば、PDF文書(の全体サイズ)を変更することなくメタデータだけを変更できます。
x:xmpmeta要素
以下のように、rdf:RDF要素の外側にx:xmpmeta要素が配置される場合があります。
この場合、x:xmpmeta要素には名前空間属性"adobe:ns:meta/"を指定し、この属性だけが有効な属性となり、他の属性は読み取り時に無視されます。
x:xmpmetaの目的は、一般的なXMLテキスト(非XMP)が含まれたXMPメタデータを識別することです。
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
...
</rdf:RDF>
</x:xmpmeta>
rdf:RDF、rdf:Description要素
単一のXMPパケットは、単一のrdf:RDF要素によってシリアル化されます。 rdf:RDF要素の内容は0個以上のrdf:Description要素によって構成されます。
最上位のrdf:Description要素の内容は0個以上のXMPプロパティのためのXML要素によって構成されます。
XMPプロパティは任意のrdf:Description要素に配置できます。
XMP規格では以下のいずれかを推奨しています。
・各プロパティを個別のrdf:Description要素に記述する
最上位rdf:Description要素にはXMPデータモデルにあるAboutURLを値としたrdf:about属性を指定できます。
rdf:about属性値は全ての最上位rdf:Description要素で同一でなければなりませんが、空の値を持つrdf:about属性がある場合にそれ同値のrdf:about属性とすることができます。
このAboutURLが無い場合はrdf:about属性値を空にしなければなりません。
最上位より深くネストされたrdf:Description要素にはrdf:about属性を使えません。
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xmp="http://ns.adobe.com/xap/1.0/">
<rdf:Description rdf:about="">
<xmp:Rating>3</xmp:Rating>
</rdf:Description>
</rdf:RDF>
XMPプロパティ要素はシリアル化されるXMP値の形式(Simple、Structure、またはArray)、およびXMP値にqualifier(修飾子)があるかどうかによって決定されます。
Simple(単純)値 XMPプロパティ
Simple(単純)値は Unicode標準で定義されているUnicodeテキストの文字列です。
Simple値を持つXMPプロパティの要素コンテンツは値を提供するテキストでなければなりません。
テキストには文字データ、エンティティ参照、文字参照、およびCDATAセクションのみを含めることができます。
要素にはネストされたXML要素を含めることはできません。
上記のXMPを解析するPDF Imager-LP(無償版)のソースコード
| C# | C/C++ |
Structure(構造)値 XMPプロパティ
Structure(構造)値は0個以上の名前付きフィールドのコンテナーです。
構造内の各フィールドの順序は重要ではありません。
Structure値を持つXMPプロパティの要素コンテンツはネストされたrdf:Description要素でなければなりません。
ネストされたrdf:Description要素の内容は名前がXMP構造のフィールドの名前である0個以上のXML要素で構成されます。
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#">
<rdf:Description rdf:about="">
<xmpTPg:MaxPageSize>
<rdf:Description>
<stDim:h>297</stDim:h>
<stDim:w>210</stDim:w>
<stDim:unit>mm</stDim:unit>
</rdf:Description>
</xmpTPg:MaxPageSize>
</rdf:Description>
</rdf:RDF>
なお、Structureプロパティのrdf:Description要素は、以下のようにStructure要素のrdf:parseType="Resource"属性に置き換えることができます。
これは、一般的な修飾子の記述形式にも適用されます。
<xmpTPg:MaxPageSize rdf:parseType="Resource">
<stDim:h>297</stDim:h>
<stDim:w>210</stDim:w>
<stDim:unit>mm</stDim:unit>
</xmpTPg:MaxPageSize>
さらに、Structureプロパティのすべてのフィールドが単純な非修飾値を持つ場合には、各フィールド値をStructure要素の属性値として以下のように記述することができます
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#">
<rdf:Description rdf:about="">
<xmpTPg:MaxPageSize stDim:h="297" stDim:w="210" stDim:unit="mm"/>
</rdf:Description>
</rdf:RDF>
上のXMPを解析するPDF Imager-LP(無償版)のソースコード
| C# | C/C++ |
Array(配列)値 XMPプロパティ
Array(配列)値は1から始まる序数で位置付けされた0個以上のアイテムのコンテナです。
Arrayアイテムの形式は任意のXMP値形式にすることができ、配列内のすべてのアイテムは同じデータ型にします。
Arrayには以下の三種類があります。
順序付き配列内の項目は、任意に順序を変更してはなりません。順序の意味は、データ型またはアプリケーションによって定義されます。
順序付けされていない配列内の項目はいつでも並べ替えることができます。
順序の意味はデータ型またはアプリケーションによって定義できます。
ある項目が優先されるべき既定値である場合はその項目が配列の最初の項目でなければなりません。
配列の最初の項目は他の基準が適用されない場合に選択される必要があります。
Array値を持つXMPプロパティの要素コンテンツはネストされた以下の要素いずれか1つで構成されます。
・ rdf:Seq 順序付けされた配列
・ rdf:Alt 代替配列
ネストされた要素の要素コンテンツは配列内の各項目に1つずつ、0個以上のrdf:li要素で構成されます。
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<rdf:Description rdf:about="">
<dc:subject>
<rdf:Bag>
<rdf:li>XMP</rdf:li>
<rdf:li>metadata</rdf:li>
<rdf:li>ISO Standard</rdf:li>
</rdf:Bag>
</dc:subject>
</rdf:Description>
</rdf:RDF>
上のXMPを解析するPDF Imager-LP(無償版)のソースコード
| C# | C/C++ |
8.3 XMP Qualifier(修飾子)
XMP修飾子は、任意のXMP値に、その値の形式を変更することなく注釈を付加するために使用します。
例えば、単純な値は、XMPプロセッサによって任意の修飾子が付加されたとしても、単純な値のままです。
修飾子は、付加される値に関するメタデータで、各修飾子には名前と値があり、名前はXML拡張名でなければなりません。
特定の値に付加されるすべての修飾子の名前はその値内で一意です。
修飾子の値は任意のXMP値形式にすることができ、修飾子の値には複数の修飾子を含めることができます。
修飾子が追加されると、以下のxml:lang修飾子を除く、一般的な修飾子が追加されたメタデータ(XMP値)の記述形式は大きく変更されます。
xml:lang 修飾子
xml:lang修飾子は単純な非URI値を持ち、その値に修飾子を持つことはできません。
構造体または配列のxml:lang修飾子は、構造体フィールドまたは配列項目の既定言語とみなされます。
IETF RFC3066に従い、xml:lang修飾子の値は言語コードでxml:lang値の比較はすべて大文字と小文字を区別しません。
xml:lang修飾子はXML要素であるSimpleプロパティ、Structureフィールド、Array項目、および修飾子の指定された要素に属性として付記できます。
なお、xml:lang修飾子はrdf:Description、rdf:Bag、rdf:Seq、rdf:Alt、または rdf:value要素に付記できません。
xml:lang以外の一般的な修飾子はこの形式を使用できません。
例:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/">
<rdf:Description rdf:about="">
<dc:source xml:lang="en-us">Adobe XMP Specification, April 2010</dc:source>
<xmp:BaseURL rdf:resource="http://www.adobe.com/" xml:lang="en"/>
<dc:subject xml:lang="en">
<rdf:Bag>
<rdf:li>XMP</rdf:li>
<rdf:li>metadata</rdf:li>
<rdf:li>ISO standard</rdf:li>
<rdf:li xml:lang="fr">Norme internationale de l’ISO</rdf:li>
</rdf:Bag>
</dc:subject>
</rdf:Description>
</rdf:RDF>
一般的な修飾子
修飾子がxml:lang以外の場合、修飾子の値はネストされたrdf:Description要素となります。
修飾子が付記された要素の内容は1っのrdf:value要素と、修飾子名を持つ1っ以上のXML要素で構成されます。
rdf:value要素の内容は、修飾子が付記された要素の値です。
rdf:value要素と修飾子の内容はプロパティの記述規則に従います。rdf:value要素の記述形式はXMP値の形式(Simple、Structure、Array)と、修飾子の値自体がさらに修飾されているかどうかに応じて異なります。
rdf:value要素にはxml:lang属性を含めることも、ネストされた一般的な修飾子を含めることもできません。
xml:lang修飾子はこの形式を使用できません。
例:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xe="http://ns.adobe.com/xmp-example/">
<rdf:Description rdf:about="">
<dc:source>
<rdf:Description>
<rdf:value>Adobe XMP Specification, April 2010</rdf:value>
<xe:qualifier>artificial example</xe:qualifier>
</rdf:Description>
</dc:source>
<xmp:BaseURL>
<rdf:Description>
<rdf:value rdf:resource="http://www.adobe.com/"/>
<xe:qualifier>artificial example</xe:qualifier>
</rdf:Description>
</xmp:BaseURL>
<dc:subject>
<rdf:Bag>
<rdf:li>XMP</rdf:li>
<rdf:li>
<rdf:Description>
<rdf:value>metadata</rdf:value>
<xe:qualifier>artificial example</xe:qualifier>
</rdf:Description>
</rdf:li>
<rdf:li>
<rdf:Description> <!-- 修飾子が無い場合 -->
<rdf:value>ISO standard</rdf:value>
</rdf:Description>
</rdf:li>
</rdf:Bag>
</dc:subject>
</rdf:Description>
</rdf:RDF>
8.4 XMP 名前空間 プロパティ
XMP規格(ISO 16684-1)で規定された名前空間プロパティなどです。
8.4.1 Adobe PDF名前空間
Adobe PDF名前空間は、Adobe PDF文書で使用されるプロパティです(XMPには規定されていません)。
- 名前空間 URI: "http://ns.adobe.com/pdf/1.3/"
- プリフィックス: pdf
以下にAdobe PDF名前空間のプロパティの一覧を記します。
8.4.2 Dublin Core 名前空間
ダブリン・コア(Dublin Core)名前空間は、一般的に使用される一連のプロパティを提供します。 名前と使用法は、ダブリン・コア・メタデータ・イニシアティブ(DCMI)によって作成されたダブリン・コア・メタデータ要素セットで定義されているとおりです。
- 名前空間 URI: "http://purl.org/dc/elements/1.1/"
- プリフィックス: dc
以下にダブリンコア名前空間のプロパティの一覧を記します。 これらのプロパティを使用する場合は指定された型でなければなりませんし、プロパティの内容は記述されているとおりでなければなりません。
DCMIコメント:貢献者の例としては個人、組織、サービスなどが挙げられます。通常、貢献者の名前は主体を示すために使用します。
XMP追加:XMPでは貢献者のリストです。これらの貢献者には、dc:creatorにリストされている貢献者を含めないでください。
XMPの追加:XMPでの使用法はリソースの範囲または適用範囲です。
DCMIコメント:作成者の例としては、個人、組織、サービスなどが挙げられます。通常は作成者の名前は主体を示すために使用します。
XMP補足事項:XMPでは作成者のリストとして使用されます。エンティティは優先順位の降順でリストしなければなりません(ただし、優先順位の降順が重要な場合)。
XMPの追加:XMPでの使用法はリソースのコンテンツに関するテキスト記述のリストであり、様々な言語を記述します。
DCMIコメント:寸法の例としては、サイズや継続時間などがあります。 推奨されるベストプラクティスは、インターネットメディアタイプ(MIME)のリストなどの制御語彙を使用することです。
XMP追加:XMPではMIMEタイプです。寸法はメディア固有のプロパティを使用して保存されます。
DCMIコメント:推奨されるベストプラクティスは正式な識別システムに準拠した文字列によってリソースを識別することです。
XMP追加:XMPでの使用はリソースのコンテンツで使用される言語のリストです。
DCMIコメント:発行者の例としては個人、組織、サービスなどが挙げられます。通常は主体を示すには発行者の名前を使用します。
DCMIコメント:推奨されるベストプラクティスは関連リソースを正式な識別システムに準拠した文字列で識別することです。
XMP追加:XMPでの使用法は関連リソースのリストです。
DCMIコメント:通常では、権利情報には知的財産権を含むリソースに関連する様々な財産権に関する記述が含まれます。
XMP追加:XMPでは様々な言語で記述された非公式な権利記述のリストです。
DCMIコメント:記述されているリソースは関連リソースの全体または一部から派生している可能性があります。
推奨されるベストプラクティスは正式な識別システムに準拠した文字列を使用して関連リソースを識別することです。
DCMIコメント:通常では、主題はキーワード、キーフレーズ、または分類コードを用いて表現されます。 推奨されるベストプラクティスは統制語彙を使用することです。リソースの空間的または時間的なトピックを記述するにはdc:coverage要素を使用します。
XMP追加:XMPでの用法はリソースの内容を特定する説明フレーズまたはキーワードのリストです。
DCMIコメント:通常、タイトルはリソースの正式な名称です。
XMP追加:XMPでの使用法は様々な言語で与えられたタイトルまたは名前です。
DCMIコメント:推奨されるベストプラクティスはDCMIタイプ語彙[DCMITYPE]などの統制語彙を使用することです。 リソースのファイル形式、物理媒体、または寸法を記述するには、dc:format要素を使用します。
XMP追加:この要素のXMPでの使用法についてはdc:formatの項目を参照してください。
備考:
dc:titleはViewer PreferencesディクショナリのDisplayDocTitle要素をTrueにすると、指定された文字列がアプリケーションウインドウのタイトルバーに表示されます。
8.4.3 XMP 名前空間
XMP基本名前空間には基本的な説明情報を提供するプロパティが含まれています。
- 名前空間 URI: "http://ns.adobe.com/xap/1.0/"
- プリフィックス: xmp
以下にXMP名前空間のプロパティの一覧を記します。 これらのプロパティを使用する場合は指定された型でなければなりませんし、プロパティの内容は記述されているとおりでなければなりません。
デジタルファイルではファイルシステムの作成時刻と一致する必要はありません。 新しく作成されたリソースの場合はファイルの書き込みにかかった時間を除いた作成時刻に近い値になります。 その後のファイル転送やコピーなどによりファイルシステムの時刻は任意に変化する可能性があります。
配列の項目はその識別子が準拠する正式な識別システムを示すためにxmpidq:Schemeで修飾することができます。
注:xmp:Identifierプロパティが追加されたのはdc:identifierが元のXMP仕様では配列ではなく単一の識別子として定義されていたためです。 これは、dc:identifierを配列に変更すると既存のXMPプロセッサとの互換性が損なわれることが理由です。
注:想定される使用法のひとつはファイル ブラウザーでリソースを整理することです。
xmp:ModifyDateと同じかそれ以降である必要があります。
注:このプロパティの値は、通常、ファイルが保存される前に設定されるためファイルのシステム変更日付と必ずしも同じではありません。
値は-1または[0..5]の範囲で、-1 は「拒否」、0は「評価なし」を示します。 xmp:Ratingが指定されていない場合の値は0とみなされます。 注:想定される使用法は拒否の概念を追加した典型的な「星評価」です。
8.4.4 XMP Rights Management 名前空間
XMP Rights Management 名前空間には、リソースに関連付けられた法的制限に関する情報を提供するプロパティが含まれています。
- 名前空間 URI: "http: //ns .adobe .com/xap/1 .0/rights/"
- プリフィックス: xmpRights
以下はXMP Rights Managementのプロパティの一覧です。これらのプロパティを使用する場合は、指定された型を使用しなければなりません。
Falseの場合、これはパブリックドメインのリソースであることを示します。
状態が不明な場合は省略されます。
Falseの場合、これはパブリックドメインのリソースであることを示します。
状態が不明な場合は省略されます。
さまざまな言語で提供されます。
注意:歴史的な使用法のため、これは通常の(URIではない)単純な値です。
8.4.5 xmpidq 名前空間
xmpidq名前空間にはxmp:識別子配列で使用されるスキームを定義する単一の修飾子が含まれています。
- 名前空間 URI: "http://ns.adobe.com/xmp/Identifier/qual/1.0/"
- プリフィックス: xmpidq
以下に単一のxmpidq修飾子を記します。 修飾子は指定された型でなければなりません。修飾子の内容は説明されているとおりです。