0

一連の 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 個のファイルが処理されると発生するようです。

4

0 に答える 0