関数:PDFからメタデータ(XMP)を抽出する

TOP > サンプル/関数 > 関数:PDFからメタデータ(XMP)を抽出する      []


概要

 

PDFファイルには文書に関する詳細な情報を明記したメタデータ(XMP)がML形式で入っています。

それをXML形式でテキスト抽出します。

抽出したXMLから、要素名での値の抽出も行います。

 

お知らせ
以下のコマンドラインツールからでもメタデータ(XMP)は取得できます。
ライセンス上の問題が無ければ、そちらの方をオススメします。

理由:機能的に上記の方がはるかに優れています。また将来的な事を考えると色々な面で有利になると考えています。

ライセンスが難しい時は当ページの関数をお使いください。

 

機能

 

以下の2つの関数で連携して、機能を提供します。

A. 関数名 : Get_XML_nnn2

  1. PDFファイルをテキスト形式で読み込みます。
    PDFファイルはUTF-8 なのでコード変換して読み込みます。
  2. メタデータはPDFが更新されるたびに新しいのが後ろに追加されます。
    PDFファイルの更新日時情報と一致するメタデータのみを検索します。
    ※最適化時に古いのは削除される?
  3. メタデータはXML形式で登録されているので、要素名[x:xmpmeta]で検索します。
  4. 該当するメタデータが見つかった時に、その内容をXMLのテキストで抽出します。

B. 関数名 : Get_XML_Node_nnn2

  1. 抽出したテキストのXMLからメタデータの形式にしたがって、要素名に該当する値を抽出します。

 

制限、注意事項

 

  1. パスワード保護によりメタ情報が暗号化されているPDFファイルからは
    メタデータの抽出は出来ません。 
  2. PDFファイル全体をメモリ内に一括で読み込みます。 よって、20Mバイトのファイルにもなると実行中にも関わらず、停止しているかのように感じます。 ご注意ください。
  3. メタデータのXML内容については十分に調査していないので、問題等があった場合にはコメントで頂けると助かります。 ただし、対応出来るかの保証は全く無いです。

 

Get_XML_nnn2

 

形式

[Long] = Get_XML_nnn2 (
    string sFilePath , 
    string sGetXml ,
    string sMsg )

 

引数

  1. 第一引数 ( string sFilePath ) : In
    PDF ファイルのフルパス
  2. 第二引数 ( string sGetXml ) : Out
    取得したXML形式のメタデータ
  3. 第三引数 ( string sMsg ) : Out
    処理結果のメッセージ
    エラーメッセージも含む

 

戻り値

  • 0  : 正常処理
  • 1 以上  : エラーが発生した
    エラーの詳細は第3引数 sMsg にセットされる   

 

Get_XML_Node_nnn2

 

形式

[string] = Get_XML_Node_nnn2 (
    string sXml , 
    string sNodeName )

 

引数

  1. 第一引数 ( string sXml ) : 
    XML形式のメタデータ
  2. 第二引数 ( string sNodeName ) :
    検索する要素名

 

戻り値

  • ""以外 : 正常処理。 要素名に該当する値がセットされる。
  • ”” : 検索したノードデータが存在しない、値が無い、又はエラーが発生。

 






サンプル

 

事前に以下の参照設定を行う

Downloadsample-GetPdfMetaData.xls

 

 

 

 


実行結果のサンプル

タイトル等をセットする。 

関数:PDFからメタデータ(XMP)を抽出する

ドキュメントタイトル、作成者 等をセットする。

関数:PDFからメタデータ(XMP)を抽出する

それがXMPに反映された結果が以下の画面。

関数:PDFからメタデータ(XMP)を抽出する

以下はサンプルの実行結果です。

 

タイトル(dc:title) = ①AFormAut : Fields.Add メソッド
作成者(dc:creator) = ②nori
作成者の役職(photoshop:AuthorsPosition) = ③hira
説明(dc:description) = ④OLEでAcrobat を操作する
説明記入者(photoshop:CaptionWriter) = ⑤nori-san
キーワード(pdf:Keywords) = ⑥Acrobat; OLE; IAC; VBA
著作権のステータス(xmpRights:Marked) = False
著作権情報(dc:rights) = ⑧著作権の情報
著作権情報URL(xmpRights:WebStatement) = ⑨ pdf-file.nnn2.com
xmp:MetadataDate = 2014-12-07T17:43:13+09:00
dc:format = application/pdf
xmp:CreateDate = 2014-02-19T09:50:18+09:00
xmp:ModifyDate = 2014-12-07T17:43:13+09:00
xmp:CreatorTool = MicrosoftR Office Word 2007
pdf:Producer = MicrosoftR Office Word 2007
xmpMM:DocumentID = uuid:****6734-****-43cb-***-f73a331d****
xmpMM:InstanceID = uuid:****f7c1-****-4f62-****-5d1175d3****
dc:subject = ⑥Acrobat OLE IAC VBA

※上記結果の****部分は一部をマスクしました。

 

 

備考

 

  1. PDDoc:GetInfo メソッド では取得できない情報が取れます。
  2. 今後、メンテナンスや再調査等が発生する感じがするので、デバッグルーチンは残して置きます。
    不要ならば削除して流用ください。
  3. メタデータが抽出できないPDFでも、PDDoc:GetInfo メソッド でいくつかのプロパティは取得できます。
  4. Adobe XMP の SDK(英語)  及び XMP Utilities サービス(日本語)が公開されていますが、時間の関係上で参考にはしていません。

 

参考にしたサイト

 

メタデータ

 

XML , XMP

 

ADODB.Stream

 

メタデータとは

 

文書の特性やプロパティを明記したデータです。

文書の本文やファイルが持つコンテンツと異なる情報です。

例えばPDF文書の場合、各ページに見える文書はコンテンツでメタデータでは無いです。

PDF文書が持つ、タイトル、作成者、作成日、変更日時、等のプロパティがメタデータになります。

 

XMPとは

 

Adobe 社が制定したメタデータの標準フォーマットです。

さまざまなアプリケーションでメタデータを作成、処理および交換する為の基準となります。

XMP(Extensible Metadata Platform)の略称。

参考 : Adove XMP 仕様書  (2004年1月 日本語版)

 

動作確認環境

 

  • Windows 7 64bit Professional  (SP1 + MicrosoftUpdate) + Excel 2007 (SP3)

 

< サンプル一覧 >


 

サイト管理人のメモ

 

これ以下はサイト管理人のメモです。

見なくて結構です。

 

sInput = objStm.ReadText ( adReadAll )

ReadText の第一引数

  • adReadAll (-1) :
    既定値です。
    現在の位置から EOS マーカー方向に、すべてのバイトをストリームから読み取ります。
    これは、バイナリ ストリームに唯一有効な StreamReadEnum 値です (Type は adTypeBinary)。
  • adReadLine(-2) :
    ストリームから次の行を読み取ります (LineSeparator プロパティで指定)。

どちらの引数を指定しても結果は同じみたい。

 

xmp:MetadataDate

メタデータの要素「MetadataDate」は以下の2種類で検索してる。

  • xap:MetadataDate
  • xmp:MetadataDate

Adobe XMP 仕様書  (2004年1月 日本語版) を見ると下の「xmp:MetadataDate」の解説が有る。

しかし、PDFファイルをGREP検索すると上の「xap:MetadataDate」だけしか存在しないPDFファイルも有る。

xmp:MetadataDate の説明  Adobe XMP 仕様書  (2004年1月 日本語版) 36頁 より

このリソースのメタデータが最後に変更された日時。
このプロパティには xmp:ModifyDate と同じか、より最近の値が設定されている必要があります。

 

Do While Not objStm.EOS

ReadText ( adReadAll ) で一気にEOSまで、つまりファイルの最後まで読み込むので、

Do でループさせる必要も無いが、Stream オブジェクト自体の操作は今回が初めてなので安全策をコードに持たせる。

 

If lInStr_Cnt2 = 0 Then Exit Do

上記の条件が成り立って、Exit Do される事はありえない。

仮になっても「XMLデータが無い」等のエラーになる可能性が有るので、この時点でのエラーログ・メッセージは出さない。

 

If sValue = Mid$(mstrGetInfo_ModDate, 3, 14) Then

ModDate と同じ更新日時の XMPデータ(メタデータ)は1つしか存在しないという前提で処理を行う。

よって条件が一致したら、残りのXMPデータの抽出&検索は行わない。

 

< サンプル一覧 >

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

コメントをする時は最低でも以下をお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン