印刷をキャンセルするには?

解決


ぺそみ  2007-08-27 22:38:55  No: 137271

いつもお世話になっております。

開発環境は
 ・Windows XP
 ・VB6.0(SP6)

 ・Adobe Acrobat 6.0 Standard
です。

Excelファイルを [Adobe PS プリンタ] を使用しPSファイルへ変換する処理を作っております。
変換に失敗した場合に、変換をキャンセル(ジョブ削除)する方法がわかりません。

手順としては
①[Adobe PS プリンタドライバ] を使用してExcelファイルをPSファイルに変換。
    '(1)excelオープン
    Set objBook = objExcel.Workbooks.Open(sPath)
    
    '(2)psファイル出力
    Call objBook.Sheets.PrintOut(PrintToFile:=True, PrToFileName:=sPsPath)
    
    '(3)excelをcloseする
    objBook.Close

②PrintOutの結果を取得。

③PrintOutの結果がエラーの場合、印刷をキャンセル(ジョブ削除)

と処理を行いたいのですが、②と③の印刷結果を取得しキャンセルする方法が分かりません。
ご存じの方がおいででしたら、ご教授お願い致します。


ぺそみ  2007-09-11 23:21:19  No: 137272

いつもお世話になっております。
監視アプリを別途作成し、試行錯誤のうえ解決しました。
以下は、サンプル的に作ったソースの一部です。

【ファイル変換実行】
Public Sub PS()
    ①[Adobe PS プリンタドライバ] を使用してExcelファイルをPSファイルに変換。
        '(1)excelオープン
        Set objBook = objExcel.Workbooks.Open(sPath)
    
        '(2)監視アプリを起動
        Call Shell("PsJobWatch.exe") … 監視アプリの①

        '(3)psファイル出力
        On Error Resume Next
        Call objBook.Sheets.PrintOut(PrintToFile:=True, PrToFileName:=sPsPath)
    
        '(4)excelをcloseする
        objBook.Close
        If (Err.Number = 1044) Then
            MsgBox "Error"
        End If
End Sub

------------------------------------------------------------
【監視アプリ】
Public Sub Main()
    ①監視タイマー開始
        sFileName = Replace(Command$(), Chr$(34), "")

        Form.Hide
        JobWatch.Interval = 10    '※0.01秒間隔でJobを監視する
End Sub

Private Sub JobWatch_Timer()

        Dim lPrinterRet         As Long         ' プリンタ処理結果
        Dim lPrinterHandle      As Long         ' プリンタオブジェクトのハンドル
        Dim lNeeded             As Long         ' 印刷ジョブ数
        Dim lReturned           As Long         ' 印刷ジョブ数
        Dim bytJob()            As Byte         ' 印刷ジョブ格納領域
        Dim rJobInfo1()         As JOB_INFO_1   ' 印刷ジョブ格納領域
        Dim i                   As Long         ' カウンタ

    ①PSプリンタをオープン
        lPrinterRet = OpenPrinter(Printer.DeviceName, lPrinterHandle, 0&)
        lPrinterRet = EnumJobs(lPrinterHandle, 0&, &HFFFFFFFF, 1&, ByVal 0&, 0&, lNeeded, lReturned)
        If (lNeeded = 0&) Then
            Call ClosePrinter(lPrinterHandle)
            GoTo LABexit
        End If

    ②ジョブ取得
        ReDim bytJob(lNeeded - 1)
        lPrinterRet = EnumJobs(lPrinterHandle, 0, &HFFFFFFFF, 1, bytJob(0), lNeeded, lNeeded, lReturned)
        If (lReturned = 0) Then
            Call ClosePrinter(lPrinterHandle)
            GoTo LABexit
        End If

        ReDim rJobInfo1(lReturned - 1)
        For i = 0 To (lReturned - 1)
            '// 指定されたドキュメントのジョブ状態を判定する
            Call MoveMemory(rJobInfo1(i), bytJob(Len(rJobInfo1(0)) * i), Len(rJobInfo1(0)))

    ③ジョブが指定されたファイルの場合、ステータスを確認する
      エラーの場合、ジョブをキャンセルする。
      ジョブをキャンセルする事で、【ファイル変換実行 - (4)】に処理が遷移される。

            If (Trim$(fFConvert_Ptr_Str(rJobInfo1(i).pDocument, 64)) = sFileName) Then
                Select Case rJobInfo1(i).Status
                    ' [ステータス:スプール中・印刷中(PS変換中)]
                    Case JOB_STATUS_SPOOLING, JOB_STATUS_PRINTING
                        '※監視処理続行
                        Call ClosePrinter(lPrinterHandle)
                        Exit For
            
                
                    ' [ステータス:完了(PS変換が正常に終了)]
                    Case JOB_STATUS_PRINTED + JOB_STATUS_DELETING
                        '// 監視処理を終了する
                        Call ClosePrinter(lPrinterHandle)
                        Exit For
                
            
                    ' [ステータス:上記以外]
                    Case Else
                        '// ジョブをキャンセルする
                        lPrinterRet = SetJob(lPrinterHandle, rJobInfo1(i).JobId, 0&, ByVal 0&, JOB_CONTROL_CANCEL)
                    
                        '// 監視処理を終了する
                        JobWatch.Interval = 0
                        Call ClosePrinter(lPrinterHandle)
                        Exit For
                End Select
            End If
        Next i

End Sub

第一歩進んだといった状況です。
もう少し工夫をして完成していきたいと思います。
ありがとうございました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加