Poppler:PDFの添付ファイルを保存するVBA関数

TOP > Poppler ツール > *


Village Girl

概要

PDFの添付ファイルを指定フォルダに保存するVBA関数です。同時に添付ファイルの数とファイル名も取得できます。

Acrobat OLE を使わずに Poppler の pdfdetach.exe を使用します。

  1. 事前に各種エラーチェック
  2. 「-list」オプションでPDFの添付ファイル数を確認する。
    ゼロ件の時は以降の処理をスキップする。
  3. 添付ファイルのファイル名も抽出する。
  4. 添付ファイルのファイル名が全て半角ならば「-saveall」で一括保存する。
  5. 添付ファイルのファイル名に全角が含まれているならば、1つずつ「-save」で保存する。これはファイル名の文字化けを防ぐためです。

 

Poppler とは

フリーソフト Poppler を知らない人は先にコチラを御覧ください。

 

形式

 

引数

  1. 第1引数 : popPara_InPdfPath As String  (In)
    入力のPDFファイルのフルパス
  2. 第2引数 : popPara_InPdfPassword As String  (In)
    入力のPDFファイルのユーザーパスワード。無ければ""。
  3. 第3引数 : popPara_OutFolder As String  (In)
    添付ファイルの出力先フォルダ名(フルパス)
  4. 第4引数 : popPara_OutFileName() As String (Out)
    添付ファイルのファイル名
  5. 第5引数 : popPara_FileCount As Long  (Out)
    添付ファイルのファイル数
    第4引数の配列の添字にもなる
  6. 第6引数 : strCmdMsg() As String  (Out)
    コマンドラインで表示された内容

    • strCmdMsg(0) : 標準出力
    • strCmdMsg(1) : 標準エラー出力
  7. 第7引数 : strErr As String  (Out)
    プログラム内のエラーメッセージ。エラー無しは ""。

 

戻り値

無し。

 

関数 / サンプル





事前設定

  1. コチラを参考にPoppler のダウンロードとインストールを行う。
  2. pdfdetach.exe のフルパスをCON_POPPLER_PATHにセット。
  3. gDebugMode = True のデバッグモードをFalseにセット。

サンプル

  • A-de-007.pdf から添付ファイルを保存します。
  • A-de-007.pdf のユーザーパスワードは「def」です。
  • 保存先フォルダは「D:¥Tools¥PDF¥File¥」です。

 

 

結果

 

▽正常終了の時

Poppler:PDFの添付ファイルを保存するVBA関数

上記は関数内で編集したメッセージです。

 

▽ユーザーパスワードが間違っている時

Poppler:PDFの添付ファイルを保存するVBA関数

上記の1段目はプログラム内からのエラーメッセージ。2段目はコマンドラインからのエラーメッセージです。

 

▽添付ファイルがゼロ件の時

Poppler:PDFの添付ファイルを保存するVBA関数

上記は1段目と2段目はプラグラム内で編集したメッセージです。3段目がコマンドラインからのメッセージです。

 

結果の判断方法

popSaveEembeddedFiles 関数の戻り値で判断します。以下は優先順位を含めて解説します。

  1. 添付ファイル数でゼロ件が返された時:
    InStr(strCmdMsg(0), "0 embedded files") > 0 の時です。
    strCmdMsg(0)には改行コードも入っているので
    strCmdMsg(0) = "0 embedded files" の判定は出来ない。
  2. 関数内のプラグラムでエラーが発生した時: 
    strErr <> "" の時です。
  3. コマンドラインの実行時にエラーを返された時:
    strCmdMsg(1) <> "" の時です。

詳細はサンプル内の「Sub Main_Demo 」のpopSaveEembeddedFiles 関数使用後の処理コードを参照してください。

 

 

PDFの添付ファイル

  1. Poppler:PDFの添付ファイル一覧を取得するVBA関数
  2. PDF の3つのパスワード  ※添付ファイルのパスワードの話

 

備考

  1. 関数の以下の引数は配列数を宣言してないことに注意。
    関数内でReDim で再宣言するからです。

    • Dim popPara_OutFileName()   As String
  2. コマンドラインの標準出力のテキストがUTF-8の為に日本語文字が化けてしまいます。その為のやや複雑な処理が入っています。
  3. この pdfdetach.exe は日本語の扱いが現在は出来ません。VBA関数で操作すると日本語の問題をカバーできるので、かえってこちらのVBA関数の方が便利だと思います。

 

< Poppler へ戻る

 


 

技術メモ

これ以降は当関数に関する作成者の技術メモです。見なくても結構です。後のメンテナンスの時に見ます。

基本

  1. Poppler も Xpdf も pdfdetach.exe の技術仕様は基本的に同じのはずです。
  2. 日本語名の添付ファイルを pdfdetach.exe で保存するとファイル名は文字化けを起こします。Xpdf では日本語の言語ファイルが有るので「-enc Shif-JIS」オプションで日本語は扱えますがファイル名は全て「全角文字」になってしまいます。Poppler であろうと Xpdf であろうと日本語を意識するとファイル名の扱いにどうしようもなく対応に困る問題が出ます。しかし、当関数はその問題を全て解決する様に処理を行っています。半角文字は半角で、全角文字は全角でファイル名を処理しています。
  3. 当VBA関数では添付ファイルを保存する前に添付ファイルのファイル名の一覧を「-list」オプションで取得している。添付ファイルの数とファイル名に日本語が存在するかどうかをチェックする為です。数がゼロならば保存処理は行わない。ファイル名に2バイト文字がある時は「-saveall」オプションでは無く、「-save 」でファイル名を指定して保存するようにしています。
  4. 日本語のファイル名が有る時に「-save」オプションを使う理由は文字化けを防ぐためです。「-saveall 」だとファイル名が文字化けしてしまうからです。それを防ぐために別名で保存する形で正しいファイル名を指定しての保存処理を行います。

標準出力と標準エラー出力について

  1. コマンドラインでの結果を標準出力と標準エラー出力の2つのテキストに出力できます。標準出力は正常の結果内容。標準エラー出力はエラー時のメッセージ内容。たまに逆に出力しているプログラムの有りますが、一応はこの形です。
  2. pdfdetach.exe は標準出力と標準エラー出力を出力しますが。「-save」又は「-saveall」オプションでは両方の出力が無い時が正常終了を意味しています。
  3. 先に「-list」オプションを実行してます。この時は標準出力が合って、標準出力エラーが無い時が正常終了を意味してます。
  4. 標準出力と標準エラー出力共にUTF-8のコードでテキストに出力します。よってVBAで読み込む時は変換して読み込む必要が有ります。つまりVBAの通常のテキスト入力ではダメです。

エラーメッセージの扱い

  1. 当VBA関数でのエラーの判定は優先順位:上が高、下が低。
    1. strErr : VBA関数内でのエラーの内容
    2. strCmdMsg( 1 ) : コマンドラインの標準エラー出力の内容
    3. strCmdMsg( 0 ) : コマンドラインの標準出力の内容
  2. 上記ではstrCmdMsg( 0 )の内容も見る必要があります。理由は添付ファイルを保存する前「-list」オプションを実行し、strCmdMsg( 0 )=「0 embedded files」でないかをチェックする必要があるからです。
  3. strErr も strCmdMsg( 1 ) もブランクの時は正常処理。
  4. 詳細はVBA関数のサンプル「Sub Main_demo」を参照。

 

< Poppler へ戻る

コメントを残す

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

CAPTCHA


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


SAMURAI Plugin