Toggle FullScreen
More Info

FUJI XEROX DocuWorks APIをVBAから利用する。

FUJI XEROXが提供している、DocuWorks APIをVBAから利用するスクリプトのサンプルです。DocuWorks Development Tool Kit 6.2.5 日本語版に含まれているxdwapi.dllを使いました。動作環境は、WindowsXP、Excel2003、DocuWorks6 (どう考えても、古い環境だなぁ・・・)。

DocuWorks Development Tool Kitには、DocuWorks API(XDWAPI)仕様書がXDWAPI.XDW として含まれていて、これを参照すれば、DocuWorks APIでできること、どうやって使うのかがわかります。

ただ、ExcelやAccessのVBAでこうったAPIを使うと、できることがグッと増えるのですが、関数の宣言やら引数の扱いが、なれないと大変。
業務上、DocuWorksをVBAで扱う機会があったのですが、直接サンプルになるコードがなかったので、今回、実際使った中から一部のスクリプトを載せることにしました。やはり、PDFほど一般的ではないですからね。誰かの参考になれば、うれしいです。

今回載せたスクリプトは、
FUJI XEROXの複合機でスキャンして得たDocuWorksファイル(strFileName1)を、他のDocuWorksファイル(strFileName2)の最終ページに追加して、DocuWorksファイルのイメージページを自動正立して、保存する
というもの。
これ、使いだすと、めちゃくちゃ楽で、感動します。自分でスクリプト書いておいて何ですが。
仕事上でよくあるのが、何らかのテーマ別に書類をまとめて綴っておく作業。これがDocuWorksでできます。複合機のAuto Document Feederに原稿をセットしてスキャンして、DocuWorksファイルにおとせば、どんな向きでスキャンしても自動正立してくれます。賢いですねー。
ただし、注意点ですが、この「XDW_RotatePageAuto」、仕様書に「指定したページはイメージから生成したページ(スキャンやイメージファイル取り込みで生成したもの)でなければならない。」とありますので、アプリケーションから作ったページは、エラーになります。残念ですが。

関数の宣言も全て載せましたので、私と同じ環境なら、コピー&ペーストで使えるはずです。
それぞれのユーザーで、DocuWorksを使ってやりたいことがあれば、まず、DocuWorks API(XDWAPI)仕様書をよんで、要求を満たす関数を調べて、その関数の使い方が分からなければ、今回のスクリプトを参考にすれば、大体のことはできると思います。
ちなみに、いろいろなところで使われる定数は、xdw_api.hのファイルに記載されていますので、必見です。

常套句ですが、私は素人なので、あくまでも自己責任で参考にしてくださいね。

では、まず宣言部。
いつものことですが、今回は”D:\dwsdk625\XDWAPI\DLL\xdwapi.dll”で「xdwapi.dll」のフルパスを指定していますが、「xdwapi.dll」をパスが通ったフォルダにおけば、”xdwapi.dll”だけでいいはずです。

—–宣言部ここから—–

’2.20 XDW_Finalize   特定APIの終了処理を行う。
Public Declare Function XDW_Finalize Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal reserved As String) As Long

’2.34 XDW_GetDocumentInformation   DocuWorksファイル全体に関わる情報を得る。
Public Declare Function XDW_GetDocumentInformation Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByRef pDocumentInfo As XDW_DOCUMENT_INFO) As Long
Public Type XDW_DOCUMENT_INFO
    nSize As Long                   ‘構造体XDW_DOCUMENT_INFOのバイト数を設定する。
    nPages As Long                  ’総ページ数。
    nVersion As Long                ‘DocuWorksファイルのファイルフォーマットのバージョン。
    nOriginalData As Long           ‘オリジナルデータの数。
    nDocType As Long                ‘ファイルの種類。
    nPermission As Long             ‘認可情報。
    nShowAnnotations As Long        ‘アノテーションの表示状態。
    nDocuments As Long              ‘nDocTypeがバインダーである場合はバインダーの内部DocuWorks文書数を示す。
    nBinderColor As Long            ’nDocTypeがバインダーである場合はバインダーの色を示す。
    nBinderSize As Long             ‘nDocTypeがバインダーである場合はバインダーのサイズを示す。
End Type

’2.6 XDW_CloseDocumentHandle  DocuWorksファイルにアクセスするためのハンドルを解放する。
Public Declare Function XDW_CloseDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal reserved As String) As Long

’2.60 XDW_InsertDocument  指定位置にDocuWorks文書のページを挿入する。
Public Declare Function XDW_InsertDocument Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal nPage As Long, ByVal lpszOutputPath As String, ByVal reserved As String) As Long

’2.64 XDW_OpenDocumentHandle  DocuWorksファイルにアクセスするためのハンドルを得る。この場合だけ、pHandleはByRefで定義
Public Declare Function XDW_OpenDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal lpszFilePath As String, ByRef pHandle As Long, ByRef pMode As XDW_OPEN_MODE) As Long
Public Type XDW_OPEN_MODE
     nSize As Long
     nOption As Long
End Type

’2.72 XDW_RotatePageAuto   DocuWorksファイルの指定イメージページを自動正立する。
Public Declare Function XDW_RotatePageAuto Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal nPage As Long, ByVal reserved As String) As Long

’2.73 XDW_SaveDocument   変更を DocuWorks ファイルに反映させる。
Public Declare Function XDW_SaveDocument Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal reserved As String) As Long

—–宣言部ここまで—–

—–プロシージャここから—–

Sub AutoRoteto()

    ‘strFileName2の最終ページにstrFileName1を追加する。

    Dim strFileName1, strFileName2 As String

    Dim lngPageNo As Long
    Dim lngRoAutoErr As Long

    ‘Docworksを使うための前処理(ここから)
    Dim lngHandle As Long
    Dim myMode As XDW_OPEN_MODE
    Dim myInfo As XDW_DOCUMENT_INFO

    With myMode         ’XDW_OpenDocumentHandleを実行する際のmyModeに値を設定
        .nOption = 1
‘                        #define XDW_OPEN_READONLY       0
‘                        #define XDW_OPEN_UPDATE         1

        .nSize = LenB(myMode)
    End With

    With myInfo         ’XDW_GetDocumentInformationを実行する際のmyInfoに値を設定
        .nSize = LenB(myInfo)
    End With
    ‘Docworksを使うための前処理(ここまで)

        strFileName1 = "D:\test001.xdw"
        strFileName2 = "D:\test002.xdw"

        ‘DocuWorksファイルにアクセスするためのハンドルを得る。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。
        XDW_OpenDocumentHandle strFileName2, lngHandle, myMode

        ‘DocuWorksファイル全体に関わる情報を得る。
        XDW_GetDocumentInformation lngHandle, myInfo

        ‘最終ページににDocuWorks文書のページを挿入する。
        XDW_InsertDocument lngHandle, myInfo.nPages + 1, strFileName1, vbNullString

        ‘DocuWorksファイル全体に関わる情報を得る。(情報を最新のものにする。)
        XDW_GetDocumentInformation lngHandle, myInfo

‘         DocuWorksファイルの指定イメージページを自動正立する。
        lngPageNo = 1
        lngRoAutoErr = 0
        Do
            Select Case XDW_RotatePageAuto(lngHandle, lngPageNo, vbNullString)  ‘自動正立させる時の返値によって、処理を分岐
            Case 0
                lngRoAutoErr = lngRoAutoErr
            Case Else
                lngRoAutoErr = lngRoAutoErr – 1
            End Select

            lngPageNo = lngPageNo + 1
        Loop Until lngPageNo > myInfo.nPages

        Select Case lngRoAutoErr
            Case 0
                MsgBox "XDW_RotatePageAutoは成功しました。", vbOKOnly, strFileName2
            Case Else
                MsgBox "XDW_RotatePageAutoは失敗しました。", vbCritical, strFileName2
                ‘アプリケーションから作ったドキュワークスファイルは、失敗する。
        End Select

        ‘変更を DocuWorks ファイルに反映させる。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。
        XDW_SaveDocument lngHandle, vbNullString

        ‘DocuWorksファイルにアクセスするためのハンドルを解放する。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。
        XDW_CloseDocumentHandle lngHandle, vbNullString

End Sub

DocuWorks API(XDWAPI)仕様書に書いてありますが、XDW_RotatePageAutoを使ったら、最後にXDW_Finalizeを適用して、APIで確保していたメモリーやリソースを解放しなければなりません。これは、たとえばAccessでこのスクリプトを使っていたら、当該Accessのプロジェクトを閉じるときに、XDW_Finalizeを走らせるということです。一旦XDW_Finalizeを走らせると、その後XDW_RotatePageAutoを使用としたとき、エラー(8000FFFF:XDW_E_UNEXPECTED)になります。なので、ファイルを閉じる直前に下のようなプロシージャを動かすことになります。

Sub DoXDWFinalize()
‘XDW_RotatePageAutoのAPIで確保していたメモリーやリソースを解放する。

‘特定APIの終了処理を行う。
XDW_Finalize vbNullString

End Sub

VBAでAPIを使い始めると、Accessを使っていてもテーブルやクエリをまったく使わなくなったりして、変な感じがしますが、やりたいことは大体できるようになりますよね。

DocuWorks APIはWEB上の情報こそ少ないものの、DocuWorks API(XDWAPI)仕様書は日本語でかなり詳しく書かれています。これを使えば、こんなことしたいなと思っていたことは、ほとんど可能です。

たとえば、
・XDW_ApplyOcrで、DocuWorksファイルの指定ページをOCR処理する。
・XDW_SetUserAttributeやXDW_SetPageUserAttributeでユーザー定義属性を設定する。
・XDW_BeginCreationFromAppFileとXDW_EndCreationFromAppFileでアプリケーションファイルをDocuWorks文書に変換する。
・XDW_GetPageTextやXDW_GetPageTextToMemoryでページのテキスト情報を取り出す。
他にもいろいろ使ってみたのですが、なかなか使えます。

その中で戸惑ったのが、ユーザー定義属性を設定すると、その設定した属性は、WindowsのExplorerから呼び出すプロパティでは確認できず、DocuDesk上で右クリックから呼び出すプロパティでないと見れないこと。最初分からなくって、大分試行錯誤してしまいました。

こんな親切なSDKが無料で手に入るのだから、DocuWorks環境の人は、使う価値ありですよ。


This Post Has 2 Comments:
  • kishi says:9月 30, 2010 at 5:46 PM

    はじめまして。私はkishiと申します。
    いきなりコメントを入力して申し訳ありません。
    今回、DocuWorks APIをVBAで使用したく、ネットで検索したところこちらのブログにたどり着きました。
    今までactiveXでの操作を行っていたのですが限界を感じ、色々と模索していたところにでなのですが、今回こちらのsample modleによって、大変助かりました。
    そこで質問です。今、DocuからイメージJPEGに変換しようとこちらの記述を参考に作成しているのですが、なかなかうまくいきません。助言をいただきたくコメント入力させていただきました。
    いきなりコメントを入力して、厚かましい話ですが、
    お忙しいところ申し訳ありませんが、お教えください。
    —–宣言部ここから—–
    Public Declare Function XDW_ConvertPageToImageFile Lib "D:\DATA\vba\dwsdk62\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, nPage As Long, ByVal lpszOutputPath As String, ByRef pImageOption As XDW_IMAGE_OPTION) As Long
    Public Type XDW_IMAGE_OPTION
    nSize As Long
    nDpi As Long
    nColor As Long
    nImageType As Long
    'detailOp As XDW_JPEG_OPTION←設定不明?
    End Type
    —–宣言部ここまで—–
    —–プロシージャここから—–
    同じ文書です。
    With myImgOp
    .nSize = myInfo.nSize
    .nDpi = 400
    .nColor = 1
    ' #define XDW_IMAGE_MONO 0
    ' #define XDW_IMAGE_COLOR 1
    ' #define XDW_IMAGE_MONO_HIGHQUALITY 2
    .nImageType = 2
    ' #define XDW_IMAGE_DIB 0
    ' #define XDW_IMAGE_TIFF 1
    ' #define XDW_IMAGE_JPEG 2
    ' #define XDW_IMAGE_PDF 3
    End With
    strFileName1 = "d:\DSC_0103.xdw"
    strFileName2 = "d:\DSC_0103.bmp"
    x = XDW_ConvertPageToImageFile(lngHandle, 1, strFileName2, myImgOp)
    —–プロシージャここまで—–

  • Euclid-Number says:10月 01, 2010 at 6:52 PM

    kishiさん、はじめまして。
    DocuWorksファイルから、BMPファイルに変換するスクリプトは確認できましたので、近々記事にしますね。
    構造体XDW_IMAGE_OPTION_EXを使ってJPEGやPDFに変換したりもしたのですが、こちらはまだテスト不足ですので、テストが済んだら記事にしようかなと思ってます。



Twitter from tokidokidokin
アーカイブ
Portfolio Categories
  • カテゴリーなし
Portfolio Tags