Toggle FullScreen
More Info

DocuWorks API(XDWAPI)のXDW_GetPage関数を使って、ドキュワークスファイルをばらす。

前回の記事で、「xdwファイルに入っている複数ページをばらすコーディングをしたい」とのコメントがありました。

DocuWorks API(XDWAPI)の仕様書を見ても、直接「ばらす」を実現する関数は見当たらないので、XDW_GetPage関数を使って「ばらす」を実現してみます。

仕様書によると、XDW_GetPageでは「DocuWorksファイルの指定のページをコピーして、別の1つのDocuWorks文書にする。」ことができます。
パラメータは4つで、以下のとおり。

handle:ドキュワークスファイルのハンドル。
nPage:コピーしたいページを指定する。1から始まる。
lpszOutputPath:出力するファイルの絶対パス名。パスの文字列の長さは255バイトまでとする。
reserved:予約引数。NULLでなければならない。

仕様書の説明には、こんなことが書いてあります。
nPageで指定したページをlpszOutputPathで指定したDocuWorksファイル文書に取り出す。
handleがバインダーのハンドルのときは、nPageはバインダーの先頭からの通しページの意味となる。オリジナルデータは添付しない。
lpszOutputPathで指定したファイルが存在するときは、エラーになる。
handleが保護されたファイルのハンドルの場合は、転記が許可されていなければならない。
指定したページに署名が付いている場合は、エラーになる。

詳しくは、DocuWorks API(XDWAPI)の仕様書を読んでください。

処理の流れは以下のとおり。

1.XDW_OpenDocumentHandle関数で、ばらしたいドキュワークスファイルのハンドルを取得。
2.XDW_GetDocumentInformation関数で、ばらしたいドキュワークスファイルのページ数を取得。
3.XDW_GetPage関数で、出力ファイル名を変えつつ、ばらしたいドキュワークスファイルの全てのページについて、ページをコピーし、別のドキュワークスファイルを作る。
4.XDW_CloseDocumentHandle関数で、ハンドルを開放する。
5.必要があれば、元のドキュワークスファイルを削除する。

きっと、DocuWorks Deskの「ばらす」も、内部的にはこんなことをやっているのではなかろうかと推測しています。

では、サンプルスクリプトです。

例によって、決まり文句。

動作確認環境はWindowsXP、Excel2002、DocuWorks6.2です。
このスクリプトを動作させるには、FUJI XEROX社のDocuWorksがインストールされている必要があります。
また、DocuWorks APIを使うためは、DocuWorksのバージョンにあったDLLファイルが必要です。今回使ったxdwapi.dllはDocuWorks Development Tool Kit 6.2.5 日本語版(dwsdk625.exe)に含まれているものを使い、(http://www.fujixerox.co.jp/download/soft/docuworks/download301.html)からダウンロードしました。
また宣言部のxdwapi.dllの配置場所は、各自で修正してください。

今回は、色気を出してしまって、ばらすファイル名を取得するのにGetOpenFilenameを使っています。Excelでない方は適当に変更してください。

‘=======================スクリプトここから=======================
‘———————–宣言部  ここから———————–

’2.34 XDW_GetDocumentInformation   DocuWorksファイル全体に関わる情報を得る。
Public Declare Function XDW_GetDocumentInformation Lib "D:\Access\XDW\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.46 XDW_GetPage   DocuWorksファイルの指定のページをコピーして、別の1つのDocuWorks文書にする。
Public Declare Function XDW_GetPage Lib "D:\XDW\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal nPage As Long, ByVal lpszOutputPath As String, ByVal reserved As String) As Long

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

’2.64 XDW_OpenDocumentHandle  DocuWorksファイルにアクセスするためのハンドルを得る。この場合だけ、pHandleはByRefで定義
Public Declare Function XDW_OpenDocumentHandle Lib "D:\XDW\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

‘———————–宣言部  ここまで———————–

‘————-プロシージャ「Barasu_XDW」  ここから————-

Sub Barasu_XDW()

    Dim strFileName1 As String      ’ばらす前のドキュワークスファイル名
    Dim strFileName2 As String      ’ばらした後のドキュワークスファイル名

    Dim lngPageNo As Long           ‘処理中のページ番号
    Dim lngPageKeta 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 = 0
‘                        #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 = Application.GetOpenFilename("ドキュワークスファイル,*.xdw", , "ばらすドキュワークスファイルを指定", , False)

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

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

            lngPageKeta = Int(Log(myInfo.nPages) / Log(10#)) + 1     ‘総ページ数の桁数を取得

        lngPageNo = 0

        ‘ページ数分だけ繰り返して、ファイルを出力する。
        Do Until lngPageNo = myInfo.nPages

            lngPageNo = lngPageNo + 1

            strFileName2 = String(lngPageKeta – (Int(Log(lngPageNo) / Log(10#)) + 1), "0") & lngPageNo & ".xdw"

            strFileName2 = Left(strFileName1, InStr(strFileName1, ".xdw") – 1) & "_" & strFileName2     ‘出力ファイル名を指定

            ’DocuWorksファイルの指定のページをコピーして、別の1つのDocuWorks文書にする。
            XDW_GetPage lngHandle, lngPageNo, strFileName2, vbNullString

        Loop

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

        ‘バラス前のファイルを削除する。(コメントアウトしておきます。)
        ‘FileSystem.Kill strFileName1

End Sub

‘————-プロシージャ「Barasu_XDW」  ここまで————-

このスクリプトでは、指定したドキュワークスファイルと同じフォルダに、ページごとに枝番をつけたファイルを連続して作成します。
9ページまでのファイルなら「1.2.3・・・」、99ページまでのファイルなら「01.02.03・・・」、999ページまでのファイルなら「001.002.003・・・」といった具合に枝番をつけます。
ページ数の桁数を取得するのに常用対数を使ってみました。いやー、懐かしい。

このスクリプトの利点は、任意の場所のファイルを任意の場所にばらせるところ。
通常だとDocuWorks Desk上で「ばらす」を実行するので、サムネイルを取得する必要性からか時間がかかります。一方、スクリプトで実行すると、サムネイルを取得しない分高速に処理できます。

実際に使ってみたところ、思いのほか早く処理できて驚きました。1500ページのファイルをばらす処理時間が10秒ほどでした。私のPCではDocuWorks Desk上で表示するだけで相当な時間がかかるところです。

はじめはあまり期待していなかったのですが、思いのほか使い勝手がありそうです。



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