PDF 構文 メタデータ

PDF構文  [PDF Syntax ISO 32000-2]

PDF1.7は、ISO技術委員会によって2008年1月に“ISO 32000-1規格”として承認されました。2017年7月にはPDF2.0の規格ISO3200-2が承認され、2020年12月にはそれが第二稿に更新されました。
ここでは32000-2規格に基づいたPDF2.0の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明しPDF StructurePdftools SDKでのPDFデータ解析や編集をより詳細にできるようにします。
Pdftools SDKはPDFのメタデータ管理(読み書き)だけではなく、様々な情報の管理などができる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文書のカタログ化や検索などに利用されます。
メタデータの変更は容易ですし、削除することもできます。

8.1 メタデータ(Metadata)ストリーム

メタデータはストリーム(Stream)に記載できます。このストリームを「メタデータ ストリーム」といいます。
ストリームを持ったオブジェクトですのでこのオブジェクトのタイプは「ディクショナリ」です。メタデータ ストリームは通常のストリーム ディクショナリに加えて以下のエントリが追加されます。

キータイプ
Typename(必須)"Metadata"を指定
Subtypename(必須)"XML"

オブジェクトのタイプは「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="Adobe XMP Core 6.0.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
         <pdf:Producer>PDF Imager-LP w/Write 1.9.1</pdf:Producer>
      </rdf:Description>
      <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <xmp:CreatorTool>PDF Imager-LP w/Write 1.9.1</xmp:CreatorTool>
         <xmp:ModifyDate>2025-10-20T09:00:00+09:00</xmp:ModifyDate>
         <xmp:CreateDate>2025-10-20T09:00:00+09:00</xmp:CreateDate>
         <xmp:MetadataDate>2025-10-20T09:00:00+09:00</xmp:MetadataDate>
      </rdf:Description>
      <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>application/pdf</dc:format>
         <dc:creator>
            <rdf:Seq>
               <rdf:li/>
            </rdf:Seq>
         </dc:creator>
         <dc:title>
            <rdf:Alt>
               <rdf:li xml:lang="x-default"/>
            </rdf:Alt>
         </dc:title>
      </rdf:Description>
      <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
         <xmpMM:DocumentID>uuid:352e51c6-c5a1-4710-bfd6-92ecdfa8db59</xmpMM:DocumentID>
         <xmpMM:InstanceID>uuid:0f64c2dd-f790-4217-9469-25b37bc83bf6</xmpMM:InstanceID>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>

PDF Imager-LP無償版)でHelloWorld.pdfの「メタデータ」を表示するソースコード
このPDFの内容はHelloWorld.txtです。

C# C/C++ Python
全体のソースコード

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 = "2025-10-20T11:38:22+09:00"
    xmp:CreateDate = "2025-10-20T11:38:15+09:00"
    xmp:MetadataDate = "2025-10-20T11: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++ Python
全体のソースコード

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要素に記述する

最上位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++ Python
全体のソースコード

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>

上のXMPを解析するPDF Imager-LP無償版)のソースコード

C# C/C++ Python
全体のソースコード

Array(配列)値 XMPプロパティ
Array(配列)値は1から始まる序数で位置付けされた0個以上のアイテムのコンテナです。
Arrayアイテムの形式は任意のXMP値形式にすることができ、配列内のすべてのアイテムは同じデータ型にします。
Arrayには、Ordered(順序付き)、Unordered(順序なし)、Alternative(代替)の三種類があります。

Array値を持つXMPプロパティの要素コンテンツはネストされた要素1つで構成します。
ネストされた要素は次のいずれかです。
  ・ rdf:Bag 順序付けされていない配列
  ・ 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++ Python
全体のソースコード

8.3 XMP 名前空間 プロパティ

XMP規格(ISO 16684-1)で規定された名前空間プロパティなどです。

8.3.1 Adobe PDF名前空間

Adobe PDF名前空間は、Adobe PDF文書で使用されるプロパティです(XMPには規定されていません)。

 - 名前空間 URI: "http://ns.adobe.com/pdf/1.3/"
 - プリフィックス: pdf

以下にAdobe PDF名前空間のプロパティの一覧を記します。

プロパティ名プロパティ内容
pdf:KeywordsText キーワード
pdf:PDFVersionText PDF ファイルのバージョン (例: 1.0、1.3 など)
pdf:ProducerAgentName PDF ドキュメントを作成したツールの名前
pdf:TrappedBoolean ドキュメントがトラップされている場合にTrue

8.3.2 Dublin Core名前空間

ダブリン・コア名前空間は、一般的に使用される一連のプロパティを提供します。 名前と使用法は、ダブリン・コア・メタデータ・イニシアティブ(DCMI)によって作成されたダブリン・コア・メタデータ要素セットで定義されているとおりです。

 - 名前空間 URI: "http://purl.org/dc/elements/1.1/"
 - プリフィックス: dc

以下にダブリンコア名前空間のプロパティの一覧を記します。 これらのプロパティを使用する場合は指定された型でなければなりませんし、プロパティの内容は記述されているとおりでなければなりません。

プロパティ名プロパティ内容
dc:contributorUnordered array of Text DCMI定義:リソースへの貢献を行う責任を負う主体
DCMIコメント:貢献者の例としては個人、組織、サービスなどが挙げられます。通常、貢献者の名前は主体を示すために使用します。
XMP追加:XMPでは貢献者のリストです。これらの貢献者には、dc:creatorにリストされている貢献者を含めないでください。
dc:coverageText DCMIの定義:リソースの空間的または時間的なトピック、リソースの空間的適用性、またはリソースが関連する管轄区域
XMPの追加:XMPでの使用法はリソースの範囲または適用範囲です。
dc:creatorOrdered array of ProperName DCMI定義:リソースの作成に主たる責任を負う主体
DCMIコメント:作成者の例としては、個人、組織、サービスなどが挙げられます。通常は作成者の名前は主体を示すために使用します。 XMP補足事項:XMPでは作成者のリストとして使用されます。エンティティは優先順位の降順でリストしなければなりません(ただし、優先順位の降順が重要な場合)。
dc:dateOrdered array of Date DCMIの定義:リソースのライフサイクルにおけるイベントに関連付けられた時刻または期間
dc:descriptionLanguage Alternative DCMIの定義:リソースの説明
XMPの追加:XMPでの使用法はリソースのコンテンツに関するテキスト記述のリストであり、様々な言語を記述します。
dc:formatMIMEType DCMI定義:リソースのファイル形式、物理媒体、または寸法
DCMIコメント:寸法の例としては、サイズや継続時間などがあります。 推奨されるベストプラクティスは、インターネットメディアタイプ(MIME)のリストなどの制御語彙を使用することです。
XMP追加:XMPではMIMEタイプです。寸法はメディア固有のプロパティを使用して保存されます。
dc:identifierText DCMI定義:特定のコンテキストにおけるリソースへの明確な参照
DCMIコメント:推奨されるベストプラクティスは正式な識別システムに準拠した文字列によってリソースを識別することです。
dc:languageUnordered array of Locale DCMI定義:リソースの言語
XMP追加:XMPでの使用はリソースのコンテンツで使用される言語のリストです。
dc:publisherUnordered array of Text DCMI定義:リソースを利用可能にする責任を負う主体
DCMIコメント:発行者の例としては個人、組織、サービスなどが挙げられます。通常は主体を示すには発行者の名前を使用します。
XMP追加:XMPでは発行者リストです。
dc:relationUnordered array of Text DCMI定義:関連リソース
DCMIコメント:推奨されるベストプラクティスは関連リソースを正式な識別システムに準拠した文字列で識別することです。
XMP追加:XMPでの使用法は関連リソースのリストです。
dc:rightsLanguage Alternative DCMI定義:リソースに関する権利に関する情報
DCMIコメント:通常では、権利情報には知的財産権を含むリソースに関連する様々な財産権に関する記述が含まれます。
XMP追加:XMPでは様々な言語で記述された非公式な権利記述のリストです。
dc:sourceText DCMI定義:記述されているリソースの派生元となる関連リソース
DCMIコメント:記述されているリソースは関連リソースの全体または一部から派生している可能性があります。
推奨されるベストプラクティスは正式な識別システムに準拠した文字列を使用して関連リソースを識別することです。
dc:subjectUnordered array of Text DCMI定義:リソースのトピック
DCMIコメント:通常では、主題はキーワード、キーフレーズ、または分類コードを用いて表現されます。 推奨されるベストプラクティスは統制語彙を使用することです。リソースの空間的または時間的なトピックを記述するにはdc:coverage要素を使用します。
XMP追加:XMPでの用法はリソースの内容を特定する説明フレーズまたはキーワードのリストです。
dc:titleLanguage Alternative DCMI定義:リソースに与えられた名前
DCMIコメント:通常、タイトルはリソースの正式な名称です。
XMP追加:XMPでの使用法は様々な言語で与えられたタイトルまたは名前です。
dc:typeUnordered array of Text DCMI定義:リソースの性質またはジャンル
DCMIコメント:推奨されるベストプラクティスはDCMIタイプ語彙[DCMITYPE]などの統制語彙を使用することです。 リソースのファイル形式、物理媒体、または寸法を記述するには、dc:format要素を使用します。
XMP追加:この要素のXMPでの使用法についてはdc:formatの項目を参照してください。

8.3.3 XMP名前空間

XMP基本名前空間には基本的な説明情報を提供するプロパティが含まれています。

 - 名前空間 URI: "http://ns.adobe.com/xap/1.0/"
 - プリフィックス: xmp

以下にXMP名前空間のプロパティの一覧を記します。 これらのプロパティを使用する場合は指定された型でなければなりませんし、プロパティの内容は記述されているとおりでなければなりません。

プロパティ名プロパティ内容
xmp:CreateDateDate リソースが作成された日時
デジタルファイルではファイルシステムの作成時刻と一致する必要はありません。 新しく作成されたリソースの場合はファイルの書き込みにかかった時間を除いた作成時刻に近い値になります。 その後のファイル転送やコピーなどによりファイルシステムの時刻は任意に変化する可能性があります。
xmp:CreatorToolAgentName リソースを作成するため最初に使用された既知のツール名
xmp:IdentifierUnordered array of Text 特定のコンテキスト内でリソースを一意に識別する順序付けされていないテキスト文字列の配列
配列の項目はその識別子が準拠する正式な識別システムを示すためにxmpidq:Schemeで修飾することができます。
注:xmp:Identifierプロパティが追加されたのはdc:identifierが元のXMP仕様では配列ではなく単一の識別子として定義されていたためです。 これは、dc:identifierを配列に変更すると既存のXMPプロセッサとの互換性が損なわれることが理由です。
xmp:LabelText リソースをユーザー定義のコレクションのメンバーとして識別する単語または短いフレーズ
注:想定される使用法のひとつはファイル ブラウザーでリソースを整理することです。
xmp:MetadataDateDate このリソースのメタデータが最後に変更された日時
xmp:ModifyDateと同じかそれ以降である必要があります。
xmp:ModifyDateDate リソースが最後に変更された日時
注:このプロパティの値は、通常、ファイルが保存される前に設定されるためファイルのシステム変更日付と必ずしも同じではありません。
xmp:RatingClosed Choice of Real このファイルに対するユーザーによる評価
値は-1または[0..5]の範囲で、-1 は「拒否」、0は「評価なし」を示します。 xmp:Ratingが指定されていない場合の値は0とみなされます。 注:想定される使用法は拒否の概念を追加した典型的な「星評価」です

8.3.4 xmpidq名前空間

xmpidq名前空間にはxmp:識別子配列で使用されるスキームを定義する単一の修飾子が含まれています。

 - 名前空間 URI: "http://ns.adobe.com/xmp/Identifier/qual/1.0/"
 - プリフィックス: xmpidq

以下に単一のxmpidq修飾子を記します。 修飾子は指定された型でなければなりません。修飾子の内容は説明されているとおりです。

プロパティ名プロパティ内容
xmpidq: SchemeText xmp:識別子配列内の項目に使用される正式な識別スキームの名前を提供する修飾子

8.5 メタデータ 読出・変更 サンプル

PdfTools SDKによるサンプルコードです。

ご質問 ・ お問い合わせ

 メールで support@TrustSS.co.jp 宛てに、または 質問のページからお送りいただくようお願いします。
ご要望も受け付けております。


PDF Toolsライト・ライブラリ

PDF 構文解説

 

Pdftools SDK製品