Toggle FullScreen
More Info

VBAでDocuWorksの付箋アノテーションを作る

DocuWorksの付箋アノテーションとは

DocuWorksのアノテーションの中でも、使用頻度の高い付箋。

DocuWorksの付箋アノテーションは、色を白・赤・青・黄・緑から選べて、さらに付箋の上に文字が書けます。

ドキュワークスの文書上で、付箋がつけられて、なかなか面白い機能です。

今回は、付箋アノテーションをVBAから作成、操作します。



基礎資料

動作確認環境

WindowsXP

Excel 2002 SP3

Fuji Xerox DocuWorks Desk 6.2.4

Fuji Xerox DocuWorks API DLL xdwapi.dll 6.2.0.35

参考資料

DocuWorksTM Development Tool Kit 6.2.5 リリースノート
(http://www.fujixerox.co.jp/download/soft/DocuWorks/pop/dwsdk625/Readme.html)
DocuWorks 6以前のSDKは(http://www.fujixerox.co.jp/download/soft/DocuWorks/download.html)からダウンロード。

DocuWorks 7のSDKは(http://www.fujixerox.co.jp/product/software/DocuWorks/download.html)からダウンロード。

実際にXDWAPIを利用する際には、DocuWorks API (XDWAPI)仕様書(XDWAPI.XDW)で、詳細を確認してください。

各種定数やエラーコードなどは、XDWAPIを利用するためのヘッダファイル(xdw_api.h xdwapian.h)に記載されています。



サンプルスクリプト

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

Dドライブ直下にある、test001.xdwの1ページ目に、幅20cm、高さ1cmの付箋を貼り付けます。

その付箋を親として、子のテキストアノテーションを貼り付け、内容文字列を「漢字ひらがなabc」とし、フォントサイズを21.6pt、フォントカラーを赤、背景色を無しに設定します。

もちろん、親子関係を固定しないといけないので、XDW_StarchAnnotation関数で、固定します。

詳しくは、サンプルスクリプトをご覧ください。


文字が入力された付箋アノテーションを作成するサンプルスクリプト

Option Explicit

'動作環境 WindowsXP Excel2002 DocuWorks6.2

'2.34 XDW_GetDocumentInformation   DocuWorksファイル全体に関わる情報を得る。
Private Declare Function XDW_GetDocumentInformation Lib "D:¥dwsdk625¥XDWAPI¥DLL¥xdwapi.dll" (ByVal handle As Long, ByRef pDocumentInfo As XDW_DOCUMENT_INFO) As Long
Private 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ファイルにアクセスするためのハンドルを解放する。
Private Declare Function XDW_CloseDocumentHandle Lib "D:¥dwsdk625¥XDWAPI¥DLL¥xdwapi.dll" (ByVal handle As Long, ByVal reserved As String) As Long

'2.64 XDW_OpenDocumentHandle  DocuWorksファイルにアクセスするためのハンドルを得る。この場合だけ、pHandleはByRefで定義
Private 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
Private Type XDW_OPEN_MODE
    nSize As Long
    nOption As Long
End Type

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

'2.1 XDW_AddAnnotation   アノテーションを貼り付ける
Private Declare Function XDW_AddAnnotation Lib "D:¥dwsdk625¥XDWAPI¥DLL¥xdwapi.dll" _
(ByVal handle As Long, ByVal nAnnotationType As Long, ByVal nPage As Long, ByVal nHorPos As Long, ByVal nVerPos As Long, ByRef pInitialData As XDW_AA_FUSEN_INITIAL_DATA, ByRef phNewAnnotation As Long, ByVal reserved As String) As Long

'2.2 XDW_AddAnnotationOnParentAnnotation    '親アノテーションにアノテーションを貼り付ける
'テキスト、リンク、日付印アノテーションの場合
Private Declare Function XDW_T_AddAnnotationOnParentAnnotation Lib "D:¥dwsdk625¥XDWAPI¥DLL¥xdwapi.dll" Alias "XDW_AddAnnotationOnParentAnnotation" _
(ByVal handle As Long, ByVal hAnnotation As Long, ByVal nAnnotationType As Long, ByVal nHorPos As Long, ByVal nVerPos As Long, ByVal pInitialData As String, ByRef phNewAnnotation As Long, ByVal reserved As String) As Long

'XDW_AddAnnotation用の構造体定義
Private Type XDW_AA_INITIAL_DATA
    nSize As Long   '構造体のバイト数。
    nAnnotationType As Long     'アノテーションの種類。
    nReserved1 As Long      '予約メンバ。0でなければならない。
    nReserved2 As Long      '予約メンバ。0でなければならない。
End Type

Private Type XDW_AA_FUSEN_INITIAL_DATA
'    common As Long   '共通情報。構造体のバイト数とアノテーションの種類を指定する。
    common As XDW_AA_INITIAL_DATA   '共通情報。構造体のバイト数とアノテーションの種類を指定する。
    nWidth As Long  '付箋アノテーションの幅。単位は1/100mm。
    nHeight As Long  '付箋アノテーションの高さ。単位は1/100mm。
End Type

'2.74 XDW_SetAnnotationAttribute    指定したアノテーションの属性を設定する。
'テキスト、リンク、日付印アノテーションの場合
Private Declare Function XDW_S_SetAnnotationAttribute Lib "D:¥dwsdk625¥XDWAPI¥DLL¥xdwapi.dll" Alias "XDW_SetAnnotationAttribute" _
(ByVal handle As Long, ByVal hAnnotation As Long, ByVal lpszAttributeName As String, ByVal nAttributeType As Long, ByVal pAttributeValue As String, ByVal nReserved As Long, ByVal pReserved As String) As Long
'上記以外のアノテーションの場合
Private Declare Function XDW_L_SetAnnotationAttribute Lib "D:¥dwsdk625¥XDWAPI¥DLL¥xdwapi.dll" Alias "XDW_SetAnnotationAttribute" _
(ByVal handle As Long, ByVal hAnnotation As Long, ByVal lpszAttributeName As String, ByVal nAttributeType As Long, ByRef pAttributeValue As Long, ByVal nReserved As Long, ByVal pReserved As String) As Long

'2.86 XDW_StarchAnnotation      指定されたアノテーションを固定する、もしくは解除する
Private Declare Function XDW_StarchAnnotation Lib "D:¥dwsdk625¥XDWAPI¥DLL¥xdwapi.dll" (ByVal handle As Long, ByVal hAnnotation As Long, ByVal nStarch As Long, ByVal reserved As String) As Long

Private Enum XDW_AID    'アノテーションの種類
    XDW_AID_TEXT = 32785
    XDW_AID_FUSEN = 32794
    XDW_AID_STRAIGHTLINE = 32828
    XDW_AID_RECTANGLE = 32829
    XDW_AID_ARC = 32830
    XDW_AID_LINK = 49199
    XDW_AID_BITMAP = 32831
    XDW_AID_STAMP = 32819
    XDW_AID_MARKER = 32795
    XDW_AID_POLYGON = 32834
End Enum

Private Enum XDW_Color  'カラーの種類(16進数を10進数に変換)
    XDW_COLOR_NONE = CLng("&H" & "010101")
    XDW_COLOR_BLACK = CLng("&H" & "000000")
    XDW_COLOR_MAROON = CLng("&H" & "000080")
    XDW_COLOR_GREEN = CLng("&H" & "008000")
    XDW_COLOR_OLIVE = CLng("&H" & "008080")
    XDW_COLOR_NAVY = CLng("&H" & "800000")
    XDW_COLOR_PURPLE = CLng("&H" & "800080")
    XDW_COLOR_TEAL = CLng("&H" & "808000")
    XDW_COLOR_GRAY = CLng("&H" & "808080")
    XDW_COLOR_SILVER = CLng("&H" & "C0C0C0")
    XDW_COLOR_RED = CLng("&H" & "0000FF")
    XDW_COLOR_LIME = CLng("&H" & "00FF00")
    XDW_COLOR_YELLOW = CLng("&H" & "00FFFF")
    XDW_COLOR_BLUE = CLng("&H" & "FF0000")
    XDW_COLOR_FUCHIA = CLng("&H" & "FF00FF")
    XDW_COLOR_WHITE = CLng("&H" & "FFFFFF")
    XDW_COLOR_FUSEN_RED = CLng("&H" & "FFC2FF")
    XDW_COLOR_FUSEN_BLUE = CLng("&H" & "FFBF9D")
    XDW_COLOR_FUSEN_YELLOW = CLng("&H" & "64FFFF")
    XDW_COLOR_FUSEN_LIME = CLng("&H" & "C2FF9D")
End Enum

Private Enum XDW_STARCH_def     'アノテーションの固定もしくは解除を指定
    XDW_STARCH = 1
    XDW_STARCH_OFF = 0
End Enum

Private Const XDW_ATN_Text = "%Text"
Private Const XDW_ATN_FontName = "%FontName"
Private Const XDW_ATN_FontSize = "%FontSize"
Private Const XDW_ATN_FontStyle = "%FontStyle"
Private Const XDW_ATN_FontPitchAndFamily = "%FontPitchAndFamily"
Private Const XDW_ATN_ForeColor = "%ForeColor"
Private Const XDW_ATN_BackColor = "%BackColor"

Sub AddAnnotation_Fusen()
'ふせんを作成し、そのふせんを親にしてテキストアノテーションを貼り付ける。2011/4/6作成
    Dim strFileName1 As String    'ファイル名

    'Docworksを使うための前処理(ここから)
    Dim lngHandle, lngHandleAnnotation, lngHandleChildAnnotation 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"

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

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

    '===1.アノテーションを貼り付ける。===
    Dim myXDW_AID As XDW_AID    '貼り付けるアノテーションの種類
    Dim myXDW_ATN As String    'アノテーションの属性名
    Dim lngPage, lngHorPos, lngVerPos As Long   'アノテーションを貼るページ、アノテーションのx座標、y座標(単位は1/100mm)
    Dim myAaInitialData As XDW_AA_INITIAL_DATA
    Dim myAaFusenInitialData As XDW_AA_FUSEN_INITIAL_DATA

        myXDW_AID = XDW_AID_FUSEN      '貼り付けるアノテーションの種類を指定。
        lngPage = 1                     '1ページ目に貼り付ける
        lngHorPos = 1000                '10cm
        lngVerPos = 1000                '10cm

        With myAaInitialData
            .nAnnotationType = 32794    'アノテーションの種類。
            .nReserved1 = 0             '予約メンバ。0でなければならない。
            .nReserved2 = 0             '予約メンバ。0でなければならない。
        End With

        With myAaFusenInitialData   '付箋用の構造体XDW_AA_FUSEN_INITIAL_DATAに値を設定
            .common = myAaInitialData   '共通情報。構造体のバイト数とアノテーションの種類を指定する。
            .nWidth = 20000          '付箋アノテーションの幅。単位は1/100mm。最小値: 500(=5mm)、最大値: 50000(=50cm)
            .nHeight = 1000         '付箋アノテーションの高さ。単位は1/100mm。最小値: 500(=5mm)、最大値: 50000(=50cm)
        End With

        myAaFusenInitialData.common.nSize = LenB(myAaFusenInitialData)  '構造体のバイト数。

        'ふせんアノテーションを貼り付ける
        XDW_AddAnnotation lngHandle, myXDW_AID, lngPage, lngHorPos, lngVerPos, myAaFusenInitialData, lngHandleAnnotation, vbNullString

    '===2.親アノテーションにテキストアノテーションを貼り付ける===
        myXDW_AID = XDW_AID_TEXT
        lngHorPos = 500                '横位置5cm
        lngVerPos = 20                '縦位置0.2cm
        'ふせんアノテーションにテキストアノテーションを貼り付ける
        XDW_T_AddAnnotationOnParentAnnotation lngHandle, lngHandleAnnotation, myXDW_AID, lngHorPos, lngVerPos, vbNullString, lngHandleChildAnnotation, vbNullString

    '===3.アノテーションを固定する===
    Dim mySTARCH As XDW_STARCH_def
        mySTARCH = XDW_STARCH   '固定
        'ふせんアノテーションに貼り付けたテキストアノテーションを固定する。
        XDW_StarchAnnotation lngHandle, lngHandleChildAnnotation, mySTARCH, vbNullString

    '===4.アノテーションの属性を設定する。===
    Dim myXDW_ATN_Color As XDW_Color
    Dim strTxt, strAttributeName As String
    Dim lngFValue As Long

        'ふせんに貼り付けたテキストアノテーションの属性を設定する。
        myXDW_ATN = XDW_ATN_Text
        strTxt = "漢字ひらがなabc"      '内容文字列の設定
        XDW_S_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 1, strTxt, 0, vbNullString

        myXDW_ATN = XDW_ATN_FontSize    'フォントサイズを設定
        lngFValue = 216     '21.6pt
        XDW_L_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 0, lngFValue, 0, vbNullString

        myXDW_ATN = XDW_ATN_ForeColor   'フォントカラーを設定
        lngFValue = 255     'red
        XDW_L_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 0, lngFValue, 0, vbNullString

        myXDW_ATN = XDW_ATN_FontStyle   'フォントスタイルを設定
        lngFValue = 2     'XDW_FS_BOLD_FLAG
        XDW_L_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 0, lngFValue, 0, vbNullString

        myXDW_ATN = XDW_ATN_FontName    'フォントフェイス名を設定
        strTxt = "MS P明朝"
        XDW_S_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 1, strTxt, 0, vbNullString

        myXDW_ATN = XDW_ATN_BackColor   '背景色を設定
        myXDW_ATN_Color = XDW_COLOR_NONE
        XDW_L_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 0, myXDW_ATN_Color, 0, vbNullString

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

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

End Sub



結果スクリーンショット

スクリプトによって作られたドキュワークスファイルをJPEGに変換してみました。

fusen



親アノテーションにアノテーションを貼り付けるXDW_AddAnnotationOnParentAnnotation

アノテーションの親子関係

文字が入力された付箋は、付箋アノテーションが親、テキストアノテーションが子という、親子関係になっていて、子のテキストアノテーションが固定されているという状態です。

DocuWorks API(XDWAPI)仕様書の2.2 XDW_AddAnnotationOnParentAnnotationによると、アノテーションの親子関係について、以下のように解説されています。

  • 親アノテーションとして付箋以外のアノテーションを指定した場合はエラーとなる。
  • 親アノテーションに重ならずに貼り付けることもできるが、Viewer で表示した場合、貼り付けたアノテーションが見えないこともありえる。
  • 親アノテーションに貼り付けたアノテーションは、Viewer にて移動させることによりページに貼り付けることもできる。

上記のように、アノテーションは親子関係をとることができますが、親になれるのは付箋アノテーションだけのようです。ただ、子になるアノテーションは、テキストだけに限らず、以下のアノテーションが有効です。

  • テキスト
  • 直線
  • 矩形
  • 楕円
  • ビットマップ
  • 日付印
  • マーカー
  • 多角形

やろうと思えば、自分でもいろいろな付箋が作れそうです。



XDW_AddAnnotationOnParentAnnotation関数

親アノテーションにアノテーションを貼り付ける、XDW_AddAnnotationOnParentAnnotationの定義は以下のとおり。

形式

int XDW_AddAnnotationOnParentAnnotation (XDW_DOCUMENT_HANDLE handle, XDW_ANNOTATION_HANDLE hAnnotation,int nAnnotationType, int nHorPos, int nVerPos, XDW_AA_INITIAL_DATA* pInitialData,XDW_ANNOTATION_HANDLE* phNewAnnotation, void* reserved);

パラメータ

  1. handle : DocuWorksファイルのハンドル。
  2. hAnnotation : 親アノテーションへのハンドル
  3. nAnnotationType : アノテーションの種類。
  4. nHorPos : アノテーションのx座標。単位は1/100mm。
  5. nVerPos : アノテーションのy座標。単位は1/100mm。
  6. pInitialData : 初期値情報。
  7. phNewAnnotation : 貼り付けられたアノテーションへのハンドルが返される。
  8. reserved : 予約引数。NULLでなければならない。



VBAを使えば、アノテーションの属性が細かく設定できる。

前回に続いて今回のスクリプトでも、テキストアノテーションの属性を設定していますが、VBAから操作すると、DocuWorks Viewer上で設定するよりも、より細かい値が設定できるようです。

詳しくはDocuWorks API (XDWAPI)仕様書を参照してほしいのですが、例えば、テキストアノテーションのフォントサイズは1/10pt単位で設定できるし、付箋アノテーションの幅と高さは1/100mm単位、それぞれのアノテーションの位置も1/100mm単位での設定です。

DocuWorks Viewer上で、テキストアノテーションのフォントサイズを1/10pt単位で設定しようとすると、「サイズには1から1000ポイントを指定してください」とエラーメッセージが表示されます。

それにしても、1/100mmって10マイクロメートルで、およそ細胞の大きさ。どうやって使ったら有効活用できるのでしょう?



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