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規格に基づいたPDF1.7の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明し、PDF-Toolsでの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 Optimizer メタデータ削除 メタデータ削除サンプルコード
PDF Imger-LP メタデータ抽出 メタデータ抽出サンプルコード

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

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

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

オブジェクトのタイプは「2.5オブジェクト」を参照してください。

ドキュメントレベルのメタデータを表すメタデータストリームは、カタログディクショナリMetadata要素を介してPDF文書に添付できます。
このメタデータストリームはXML(Extensible Markup Language)で表されるメタデータであり、メタデータを表すXMLの文法はXMP(Extensible Metadata Platform)仕様(ISO 16684-1)に従って定義されるものとする、とPDF2.0でより明確に指定されました。

以下は、メタデータの例です。

<?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>2022-08-18T09:00:00+09:00</xmp:ModifyDate>
         <xmp:CreateDate>2022-08-18T09:00:00+09:00</xmp:CreateDate>
         <xmp:MetadataDate>2022-08-18T09: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 = "2022-08-18T11:38:22+09:00"
    xmp:CreateDate = "2022-08-18T11:38:15+09:00"
    xmp:MetadataDate = "2022-08-18T11: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 文書情報(Document Information) ディクショナリ

文書情報(Document Information) ディクショナリは、PDFのトレイラーInfo項目に記載された情報です。

ドキュメント インフォメーション ディクショナリには、以下の項目が含まれます。

キータイプ
Titletext string(オプション)文書のタイトル
Authortext string(オプション)文書を作成した人の名前
Subjecttext string(オプション)文書のサブジェクト
Keywordtext string(オプション)文書に関するキーワード
Creator text string(オプション)PDF以外の形式から変換した場合に、そのオリジナルの作成ツール
Producertext string(オプション)PDF以外の形式から変換した場合に、その変換ツール
CreateDate日付(オプション)文書が生成された日時(人が読める形式)
ModDate日付(オプション)文書が更新された最終の日時
Trappedname(オプション)文書がトラッピング情報を含むように変更されたかどうかを示す名前オブジェクト

オブジェクトのタイプは「2.5オブジェクト」を参照してください。


以下は、文書情報の例です。

2 0 obj
<<
  /ModDate (D:20220818901234)
  /Producer (PDF Creator Trust Software System)
>>
endobj

PDF Imager-LP無償版)で「文書情報」を表示するソースコード

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

ご質問 ・ お問い合わせ

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


PDF Toolsライト

PDF 構文解説

(ISO32000-2より)

PDF Tools製品概要