Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2013)
ExcelVBAでAcrobatを操作「pdf互換バージョンを指定できるようにしたい」
投稿日時: 20/03/06 17:15:20
投稿者: システムエンジニア1年目

よろしくお願いいたします。
 
課題は以下の通りです。
・VBAからacrobat Pro 9(またはDC)を操作してpdfを分割し保存したとき、互換が最新に引き上がる現象を防ぎたい
・可能であれば保存時に互換バージョンを指定したい。
・またはacrobat側の環境設定等で常に特定のレベルに固定できないか。
 
 
現在、RPAの一環としてpdfを分割する作業をVBAから捜査しています。
分割し保存するところまでの作業は順調に完成しました。すでに運用に入っており、問題は出ていません。
 
しかし、入力pdfの互換が1.4(acrobat5.x)なのに、出力結果のpdfが1.6(acrobat7.x)に引き上がってしまう現象が回避できません。
 
使用している環境は
Win10 Pro
Excel 2013 or 2019
Acrobat Pro 9 or DC
 
二度手間承知で再度acrobatを立ち上げ、バッジ処理またはアクションで選択したファイルを互換変更することはできますが、二度手間なのでVBAの中で操作できれば(またはVBA以外でもいいので)常時固定できれば理想です。
 
最終出力は1.4(acrobat5.x)を想定しています。
 
詳しい方いらっしゃったらお願いいたします。
なお、Adobeフォーラムでも同様の記事を書かせてもらいました。

回答
投稿日時: 20/03/06 22:26:01
投稿者: simple

手元にAcrobatがないので、私は確認ができない。
以下、ネット検索情報です。
 
「PDFバージョンの変化」
http://pdf-file.nnn2.com/?p=1042
ここには、色々な操作でバージョンがどのように変化するか説明がある。
VBAで自由にバージョンをコントロールすることはできないようです。
 
そのうえで、
> 備考
> PDFバージョンのみを強制的に変更したい場合は、
> コマンドラインツール CPDFの -set-version オプションを使います。
としています。 それが下記。
 
[CPDF:メッチャ多機能なPDFのコマンドライン・ツール]
http://pdf-file.nnn2.com/?p=892
 
VBAの shell関数を使って、
cpdf.exe の -set-version を実行すればよいのではないか。
トライしてみて下さい。
 
# なお、AdobeフォーラムというのはIDを持っていないとアクセスできないのですかね。
# あちらで真っ当な回答がついたら、直ちにこちらに連携して、こちらは閉じて下さい。

投稿日時: 20/03/06 23:52:37
投稿者: システムエンジニア1年目

simple様
 
ご回答ありがとうございます。試してみます。
 
AdobeフォーラムはAdobe社さんのページのフォーラムですが、ログインなしでも見れたような…
ただ今現在未回答です。ご提案いただけた情報を試してみます。

投稿日時: 20/03/07 13:21:11
投稿者: システムエンジニア1年目

simple様
  
ご回答いただいたcpdfを詳細に調査するのに時間がかかってしまい申し訳ありません。
 
現在demo版を環境に適用することができそうだと踏んでおります。
が、demo版は出力結果に「DEMO」の文字が入ってしまうため正式解決は少し先になりそうです。
 
ほかにも同様の質問者の方が見に来られる可能性を考慮して私が解決するまでの作業予定・結果を以下に併記させてもらいます。よろしくお願いいたします。
 
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 
コマンドプロンプトの画面にて
 
>[cpdf.exeへのフルパス] -set-version [pdf互換レベル今回は試験的に4を入力] [入力ファイルのフルパス+ファイル名] -o [出力ファイルのフルパス+ファイル名]
 
こちらのコマンドの実行でpdfの互換性を変更することができました。
このコマンドに必要な要素の文字列をVBAから取得して編集、
VBAのRunメソッド(参照設定のWindows Script Host Object Model必須)を使用して
プロンプトに入力することで最終的に解決できそうだと予想しております。
 
しかし、今回新たに問題もありました。
外部システムを借りて作業するにあたり、
サーバにテンプレートとしてcpdf導入済みのファイルを保管しておき、必要に応じて自分のローカルPCで実行するときにファイル階層が必ずしも同一ではないことです。
コマンドプロンプトでフルパスを入力せずともcpdf.exeとだけ呼び出せば解決する方法もありますが、その手順を引き続きの後輩に教えるのはトラブルのもとになりやすいということです。
 
ということでこの問題を解決するためにテンプレートを複製しても(フルパスが変更になっても)問題ないようにするのが課題になりそうです。
 
VBAで自ファイルのフルパスを取得、フルパスと変換したいファイルパスを結合して、テキスト化したものをstring型変数に代入してRunメソッドで入力してみて成功すれば私は解決する!

回答
投稿日時: 20/03/07 23:21:27
投稿者: MMYS

 
PDF加工ならこんなのも。
http://papy.world.coocan.jp/
 
DLLも用意されてますので、DLL直接呼び出しも可能。
http://papy.world.coocan.jp/pdftool/index.html
 
 
当方ではWindiows10で使用実績ありますが、
商用目的ならAdbe純正を勧めます。
 

投稿日時: 20/03/09 11:51:29
投稿者: システムエンジニア1年目

解決できました。VBA側から1クリックで目標の挙動をすべて行うことに成功しました。
 
simple様
MMYS様
情報のご提供に感謝します。
 
ざっくりいかに説明
必要な外部ファイル:cpdf.exe(DEMO版で実証試験後、購入して実際に実装しました)
VBAの参照設定追加:Windows Script Host Object Model にチェックを入れる。
 
 
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 
String型の変数(SetCmd)に以下のテキストを格納する

は各exe/pdfの所在がExcelbookと相対パス関係にあるため、
動的に宣言しています。(ThisWorkbook.Path)
SetCmd= "[cpdf.exeのファイルパス] -set-version 5 [入力ファイルのパス+ファイル名] -o [出力ファイルのパス+ファイル名]"
 
'コマンドプロンプトを使うためのオブジェクト
Dim wsh As New IWshRuntimeLibrary.WshShell
'コマンド結果を格納する変数
Dim result As WshExec
'コマンドを実行
Set ShellObj = CreateObject("WScript.Shell")
ShellObj.Run SetCmd, 0, True
'解放
Set result = Nothing
Set wsh = Nothing
 
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 
あとはこれら上記のコードを変換したい回数だけ通せば正常に処理されました。
もともと分割システムは構築済みだったため、別途関数で保有し、関数を呼び出す形で引数でファイル名を取得しています。
 
もし元の私同様の疑問を持たれた方がいらっしゃったら気が付けば返信いたします。
この度はありがとうございました。[/quote]