関数:PDFの文書プロパティを更新 [作業中-20]

TOP > サンプル/関数 > 関数:PDFの文書プロパティを更新      [...]


Pixfav-Images You Love to View

概要

SetInfo メソッドでは完全にPDFのプロパティを更新できない時に使用する関数です。PDFファイル内のメタデータ(XMP)と文書情報ディクショナリー(Info)に有る以下の項目を更新します。

  • タイトル
  • サブタイトル
  • 作成者
  • キーワード ※上書きします。
  • 著作権情報

関数:PDFの文書プロパティを更新

関数:PDFの文書プロパティを更新

  

機能

  1. 入力PDFから不要なオブジェクト類を消す為に最初に最適化します。
  2. 文書情報ディクショナリー(Info)情報を更新します。
  3. メタデータ(XMP)を取り出して更新します。
  4. 結果を出力PDFへ最適化して保存します。
  5. CON_DEBUG = True の時は各処理内容の詳細なログをテキストファイルへ出力します。

 

注意事項

  1. キーワードに関して、当関数は上書きします。
  2. SetInfo メソッドGetInfoメソッド、Acrobatのプロパティ画面、Acrobatのプロパティの詳細(XMP)画面との内容はそれぞれ異なる場合が有ります。当関数では全ての結果が同じになるように処理をします。
    ※但し、次の「3.」の場合の注意点は回避出来ませんでした。
  3. 当関数では、作成者を2つ以上登録しようとしてもInfoデータ(GetInfo の結果)には1番目しか登録されません。
  4. 作成者、キーワードの文字列に小文字のカンマ「,」とセミコロン「;」は使用できません。区切り文字として判断されてしまう為です。
    どうしても使用したい時は文字列の前後をダブルクオーテーションで囲ってください。※CSVデータの扱いと同じみたいです。
    但しダブルクオーテーションを使うと予期せぬ結果になる場合があります。その場合はカンマとセミコロンを全角に変更してなどして判断してください。
  5. メタデータ(XMP)と文書情報ディクショナリー(Info)の扱い方に疑問が有ります。AcrobatのOLEの動作に一部理解できない部分が有ります。よって必ず事前に動作確認をしてから、ご使用ください。
  6. 関数を動作させる前に CON_WORK_FOLDER 定数に作業フォルダを事前に指定する必要が有ります。指定方法はサンプル参照。

  





  

形式

[boolean] = PDF_Update_MXP_INFO (  _
  String  sInputPdf , _
  String  sOutputPDF , _
  String  sTitle , _
  String  sSubject  , _
  String  sAuthor( ) , _
  String  sKeywords( ) , _
  String  sRights , _
  String  sMessage  )

  

引数

  1. 第一引数 ( string  sInputPdf ) :
    入力PDF ファイルのフルパス
  2. 第二引数 ( string  sOutputPDF ) :
    出力PDF ファイルのフルパス
  3. 第三引数 ( string  sTitle ) :
    文書プロパティのタイトル
  4. 第四引数 ( string  sSubject ) :
    文書プロパティのサブタイトル
  5. 第五引数 ( string  sAuthor( )  ) :
    文書プロパティの作成者
    配列で複数指定可能。但し注意有り。
  6. 第六引数 ( string  sKeywords( ) ) :
    文書プロパティのキーワード
    配列で複数指定可能
  7. 第七引数 ( string  sRights ) :
    文書プロパティの著作権情報
  8. 第八引数 ( string  sMessage ) :
    関数内でエラー時のみにセットされるエラーメッセージ
  • 「タイトル」、「サブタイトル」、「作成者」、「キーワード」、「著作権情報」を処理したくない時は vbNullChar をセットします。0バイト文字 ”” の時は該当の文書プロパティを空にします。詳細はサンプルを参照してください。

 

戻り値

  1. True : 正常終了。
  2. False : エラー有り。第八引数に詳細なエラーメッセージがセットされます。

  

サンプル

  1. Test1.PDF の「タイトル」、「サブタイトル」、「作成者」、「キーワード」、「著作権情報」を更新し、Test1-OUT1.PDFで出力します。
    • タイトル: "■①タイトル"
    • サブタイトル: "■②サブタイトル"
    • 作成者の1番目: "■③作成者1"
    • 作成者の2番目: "■③作成者2"
    • キーワードの1番目: "■④キーワード1"
    • キーワードの2番目: "■④キーワード2"
    • 著作権情報: "■⑤著作権情報"
  2. 作業フォルダは "D:¥Temp¥Log¥" です。CON_WORK_FOLDER
  3. 途中の処理内容をログとして作業フォルダへテキストファイル出力します。 CON_DEBUG = True
  4. 事前に参照設定が必要です。

<以下サンプルの最終更新日時:2017/03/28 13:59>
注意:サンプルは "<" 、">" 文字を全角から半角に変換してご利用下さい。

注意:サンプルは "<" 、">" 文字を全角から半角に変換してご利用下さい。

  

結果

上記サンプルの実行結果です。

関数:PDFの文書プロパティを更新

関数:PDFの文書プロパティを更新

関数:PDFの文書プロパティを更新

但し、残念な事にOLEのInfo内容で作成者は1番目しかセットされませんでした。以下はログファイルからの結果です。

title(x):■①タイトル
Subject(x):■②サブタイトル
Author(x):■③作成者1
Keywords(x):■④キーワード1,■④キーワード2
Rights(x):■⑤著作権情報

Author(x)は下記が正解です。本当は以下の様にならないと駄目なハズ。
Author(x):■③作成者1,■③作成者2

 

既知の問題

  1. 文書プロパティの作成者を配列で複数指定してもGetInfo の結果は1つ目しか返されません。これに対する逃げ手は現時点(2017/3/25)では見つかっていません。
  2. 文書プロパティの作成者とキーワードの区切りは画面上ではカンマ「 , 」やセミコロン「 ; 」で表示されます。更に前後をダブルクオーテーションで表示される場合が有ります。

「XMPの結果」を今は最優先とし、上記の「既知の問題」に関しては余力が出来た時に再検討&再調査とします。

 

備考

  1. 当関数を改造すれば他のPDFのプロパティ項目も変更可能になると予測しています。しかし、その為にはXMPの知識が必要になります。よってXMPの扱いがよく判らない人は、コメントを頂ければ出来る範囲でご助言いたします。
  2. XMPはXMLファイルと同じなのでXMLパーサーを使ってVBAで処理をするのが本来の形です。しかしこのXMLの変形型のXMPをXMLパーサーで扱うのは実際は容易ではなかったです。よってVBAの文字列関数を駆使して処理をしました。
  3. XML内の以下の行は編集しなくても関数内のXML更新で自動的にOLE更新されます。一応、将来的な改造用に関数には更新ロジックをコメントで残してあります。
    • df:Keywords="■④キーワード1,■④キーワード2"
    • pdfx:Rights="■⑤著作権情報"

 

参考

  1. 文書プロパティを構成するメタデータと文書情報ディクショナリーについて。
  2. OLEからMetaDataとInfoの操作について。
    JavaScript for Acrobat API Reference Adobe Acrobat SDK バージョン 8.0
  3. XMPに関してダウンロードできるPDF文書とサンプル。

 

動作確認環境

  • Windows 10 Pro 64bit + Acrobat Pro XI  + Excel 2007

 

  

< 関数へ戻る >


<管理者の技術メモ>

これ以降はサイト管理人の技術関連メモです。見なくて結構です。

  1. メタデータ(XMP)と文書情報ディクショナリー(Info)がどのように関係して連携?しているのかが不明。PDFの内部を追ってみたが分からなかった。ココは非公開的な内容なのかもしれない。
  2. テスト結果から予測すると、複数指定可能なプロパティにはバグっぽい臭いが、ヤヤする。と言えども、それをカバーする関数処理が出来なかった事が悔しい。
  3. PDFのXMPに関する日本語の説明書(PDF等)は存在しなかった。
  4. 英語版のXMPの説明書はPDF専門の内容では無いが、かなり参考になった。説明内にはXMPのサンプルも豊富に入っている。タブン、これが唯一のXMPに関する最良の説明書と思われる。
  5. 他にもPDFのXMPデータを出力するコマンドラインツールは存在するが、これを更に読み込んでXMPを更新するツールは存在しない。
    PDFtkに似たような機能が合ったが、正常に機能しなかった。
    XMPのインポートとエクスポートの両方が出来るのは、調べた限りではAcrobatアプリ本体のみ。
    但し、当関数を参考にすればXMPのインポートとエクスポートを簡単に行うことが出来ることが分かる。
  6. 他のXMP要素名はココに書いてある内容かな? このXMPSpecificationPart1.pdf ファイル は上記のダウンロードZIPファイルに含まれている。
  7. XMPの<rdf:Bag> <rdf:Seq> <rdf:Alt >の説明に関してはココ<の7.7 Array valued XMP properties>に有る。
    テストでは別の要素名に書き換えても影響しないみたいで結果は同じだった。
  8. VBAソース内の<と>文字はHTMLコードと一部が見なされて、誤変換されたり、強制削除されてしまう。後々のメンテが面倒なので貼り付ける時は<、>文字は全角文字に一括変換してからWEB公開する。サンプルを利用する側に少し手間が掛かるが、メンテナンスする側の方が何倍も大変なので、ハイ。
    半角に戻す注意事項も忘れずにシツコイぐらい書いて置きました。

    • IF 命令内の比較演算子 <、>文字は問題無い。
    • ”<” 、”>” 、”</” が誤認識、又は強制排除(削除)される。

 

< 関数へ戻る >

コメントを残す

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

CAPTCHA


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


SAMURAI Plugin