一連の PDF をループして、それぞれについて、Acrobat API を使用してフラット化し、PDF の JS オブジェクトにアクセスしようとしています。VBA にはコードからアクセス可能なスタック トレースがないため、AcroExchWrapper
各 Acrobat API 関数をラップして関数が失敗した場合にその関数を識別するラッパー クラスを用意しています。
Public Sub ClosePDF()
On Error GoTo errHandler
'AcroDoc is created with CreateObject("AcroExch.PDDoc")
AcroDoc.Close
Exit Sub
errHandler:
Err.Raise Err.Number, "AcroExchWrapper.ClosePDF (" & Err.source & ")", Err.Description, Err.HelpFile, Err.HelpContext
End Sub
各 PDF は、次のコードを使用してフラット化されます。
Private Function flattenPDF(pdfPath As String, savePath As String, deleteOld As Boolean) As String
Dim pageCount As Integer
Dim jso As Object
Dim saveResult As Long
Dim openResult As Long
Dim creatingApp As String
On Error GoTo errHandler
creatingApp = ""
If deleteOld Then
If fso.FileExists(savePath) Then
fso.DeleteFile savePath
End If
End If
acroExch.ClosePDF
openResult = acroExch.OpenPDF(pdfPath)
If openResult = 0 Then
Err.Raise "-1", "Flattener.flattenPDF", "unable to open PDF"
End If
DoEvents
Set jso = acroExch.GetJSObject
DoEvents
If jso Is Nothing Then
Err.Raise "-1", "Flattener.flattenPDF", "unable to get JS object"
Else
pageCount = acroExch.GetNumPages
creatingApp = acroExch.GetInfo("Creator")
If pageCount <> -1 Then
flattenPages jso, 0, pageCount - 1
Else
flattenPages jso
End If
DoEvents
saveResult = acroExch.SavePDF(savePath)
If saveResult = 0 Then
Err.Raise "-1", "Flattener.flattenPDF", "unable to save PDF"
End If
acroExch.ClosePDF
If pdfPath <> savePath Then
loggerObj.addEntry pdfPath, savePath, "flattened", creatingApp
End If
End If
flattenPDF = savePath
Exit Function
errHandler:
loggerObj.addErrorEntryFromErrorObj pdfPath, "", "flattenPDF", Err, creatingApp
flattenPDF = ""
End Function
'wrapper for jso.flattenPages to allow for stack trace
Private Sub flattenPages(jso As Object, Optional startPage As Long = -1, Optional endPage As Long = -1)
On Error GoTo errHandler
If startPage = -1 Then
jso.flattenPages
Else
jso.flattenPages startPage, endPage
End If
Exit Sub
errHandler:
Err.Raise Err.Number, "flattenPages (" & Err.source & ")", Err.Description, Err.HelpFile, Err.HelpContext
End Sub
数千のファイルを処理した後 (スクリプトを実行するたびに数が異なります) flattenPages()
、次のエラーが発生します。
Automation error
The remote procedure call failed.
その後、残りのすべてのファイルをflattenPDF()
実行すると、最初の呼び出しで次のacroExch.ClosePDF()
エラーが発生します。
The remote server machine does not exist or is unavailable
jso.flattenPages()
Javascript API ( ) または IAC API ( )を使用して Acrobat API を使用すると、これらのエラーが発生する理由に関するドキュメントを見つけることができませんでしたPDDoc.Close()
。さらに不思議なのは、アプリケーションがさまざまな数のファイルに到達するまで正常に動作し、その後でこれらの例外をスローし始めることです。
AcroExchWrapper
編集: 100 ファイルごとに実行されるように、Acrobat をリセットする次の関数を追加しました。
Public Sub Reset()
ClosePDF
AcroApp.Exit
Set AcroApp = CreateObject("AcroExch.App")
Set AcroDoc = CreateObject("AcroExch.PDDoc")
Exit Sub
ただし、同じ例外がまだスローされています。これは、1500 ~ 2500 個のファイルが処理されると発生するようです。