前提・実現したいこと
Acrobatのバックグラウンドプロセスが終了できない。
中間ファイルが削除できない。
発生している問題・エラーメッセージ
Kill PDF_TMP_WTM
で
実行時エラー'70'
書き込みできません。
となり中間ファイルが削除できません。
もちろん該当ファイルが開かれていないことは確認済みです
タスクマネージャーでみると、バックグラウンドプロセスとして'Acrobat.exe'が起動しており、手動でプロセスを終了すると動きます。
該当のソースコード
VBA
1Sub 自動透かし入れ_パスワード設定() 2 3 4 '元のコード入手先 5 'http://pdf-file.nnn2.com/?p=784] 6 7 'Acrobat Pro の返り値変数 8 Dim lRet As Long 9 10 'Acrobatプロセスの強制終了:事前 11 Call TerminateAcrobat 12 13 'Pdftkのバイナリの所在 14 Const PDFTK_PATH = "C:\Program Files (x86)\PDFtk\bin\pdftk.exe" 15 'Pdftkを使用するコマンドライン用の宣言 16 Dim WSH As Object, cmd As String, ret 17 18 19 '作業フォルダの指定 20 Dim directoryname As String 21 directoryname = Sheets("initial_setting").Cells(1, 2).Value 22 23 24 'ループ処理に必要な宣言 25 Dim rng As Range 26 Dim endrow As Long 27 Dim i As Long 28 Dim str_watermark, inputfilename, outputfilename As String 29 Dim str_owner_pw, str_user_pw As String 30 Dim PDF_IN, PDF_OUT, PDF_TMP_WTM As String 31 Dim allow_printing As Boolean 32 33 'listの最終行を取得 34 endrow = Sheets("list").Cells(1, 1).End(xlDown).Row 35 36 For i = 2 To endrow 37 With Sheets("list") 38 inputfilename = .Cells(i, 6).Value 39 outputfilename = .Cells(i, 7).Value 40 str_owner_pw = .Cells(i, 8).Value 41 str_user_pw = .Cells(i, 9).Value 42 allow_printing = .Cells(i, 10).Value 43 str_watermark = .Cells(i, 11).Value 44 End With 45 46 '元となるPDFファイル名 47 PDF_IN = directoryname & "input\" & inputfilename & ".pdf" 48 '出力PDFファイル名 49 PDF_OUT = directoryname & "output\" & outputfilename & ".pdf" 50 '中間ファイル名(後でファイルは削除する) 51 PDF_TMP_WTM = directoryname & "tmp1.pdf" 52 53 54 '透かしの文字列が空白の場合acrobat proで透かしを入れる工程をスキップする 55 If (str_watermark = "") Then 56 FileCopy PDF_IN, PDF_TMP_WTM 'PDF_TMP_WTMが次の工程にないと困るので作っておく 57 GoTo Acrobat_watermark_skip: 58 End If 59 60 'Acrobat Pro 操作に必要な宣言 61 Dim objAcroApp As New Acrobat.AcroApp 62 Dim objAcroPDDoc As New Acrobat.AcroPDDoc 63 Dim jso As Object 64 65 66 'JSObjectオブジェクト作成時のNothingの回避策 67 'Acrobatアプリを強制的にメモリにロードする 68 lRet = objAcroApp.CloseAllDocs 69 70 'PDFファイルを開く 71 lRet = objAcroPDDoc.Open(PDF_IN) 72 If lRet = False Then 73 MsgBox "AcroExch PDDoc Open エラー" 74 GoTo JSO_addWatermarkFromText_Skip: 75 End If 76 77 Set jso = objAcroPDDoc.GetJSObject 78 79 'PDF文書の指定のページに透かしを追加する 80 hogehoge~~ 81 82JSO_addWatermarkFromText_Skip: 83 84 'PDFを最適化して別名で保存する。 85 lRet = objAcroPDDoc.Save( _ 86 PDSaveFull + PDSaveLinearized + _ 87 PDSaveCollectGarbage, PDF_TMP_WTM) 88 89 90 'アプリケーションの終了 91 '開いているPDFドキュメントを全て閉じる 92 lRet = objAcroApp.CloseAllDocs 93 'アプリケーションの終了 94 lRet = objAcroApp.Hide 95 lRet = objAcroApp.Exit 96 'オブジェクトの強制開放 97 Set jso = Nothing 98 Set objAcroPDDoc = Nothing 99 Set objAcroApp = Nothing 100 101Acrobat_watermark_skip: 102 103 'PDFtkによる閲覧制限 104 hogehoge 105 106 '中間ファイル削除 107 Kill PDF_TMP_WTM 108 109 110nextfile_skip: 111 112 Next i 113 'ループここまで 114 115 Debug.Print "End: " & Date & " " & Time 116 117End Sub 118 119 120Private Sub TerminateAcrobat() 121 Dim items As Object 122 Dim item As Object 123 Set items = CreateObject("WbemScripting.SWbemLocator") _ 124 .ConnectServer.ExecQuery( _ 125 "Select * From Win32_Process " & _ 126 "Where Name = 'Acrobat.exe'") 127 If items.Count > 0 Then 128 For Each item In items 129 item.Terminate 130 Next 131 End If 132End Sub 133
試したこと
https://pdf-file.nnn2.com/?p=6
などを参照しました。
補足情報(FW/ツールのバージョンなど)
Adobe Acrobat 2017 使用
そもそも終了させなければならないもんなんでしょうか
for文で回しているので、新しく中間ファイルを作成する必要がある。
→tmp1.pdfが消せない。(実行時エラー'70'書き込みできません。)tmp1.pdfを開いていない。
→Acrobatのバックグラウンドプロセスを手動で終了させるとKillステートメントで消すことができる
という感じなので、一番やりたいことはKillステートメントでファイルを消したい
ということです。わかりづらくて申し訳ございません
ソースを見る限りはPDF_TMP_WTMを開いている箇所がないので、hogehogeの部分で加工しているんですよね?
どうやって「開いていない」ことを検証したのか不明ですが、試しにhogehoge部分をすべてコメントアウトしてもKillできないんでしょうか。

あなたの回答
tips
プレビュー