2008.3
21

XDW_GetInformation

XDW_GetInformationはDocuWorksのシステム情報を取得する関数です。

システム情報とはインストール先のフォルダ、バージョンなどです。

引数

nIndex 問いあわせる情報です。

問い合わせに使える値は次の13個
当ページで配布していますヘッダファイルでは次のように移植しています。

  XDW_GI_VERSION            = 1;
XDW_GI_INSTALLPATH        = 2;
XDW_GI_BINPATH            = 3;
XDW_GI_PLUGINPATH         = 4;
XDW_GI_FOLDERROOTPATH     = 5;
XDW_GI_USERFOLDERPATH     = 6;
XDW_GI_SYSTEMFOLDERPATH   = 7;
XDW_GI_RECEIVEFOLDERPATH  = 8;
XDW_GI_SENDFOLDERPATH     = 9;
XDW_GI_DWINPUTPATH        = 10;
XDW_GI_DWDESKPATH         = 11;
XDW_GI_DWVIEWERPATH       = 12;
XDW_GI_DWVLTPATH          = 13;

各値の意味はDocuWorks SDK 69ページにも書いてありますが、一応転載。

XDW_GI_VERSION インストールされているDocuWorksのバージョン

XDW_GI_INSTALLPATH DocuWorksのインストールディレクトリ

XDW_GI_BINPATH DocuWorksの実行ファイルがインストールされているディレクトリ

XDW_GI_PLUGINPATH DocuWorks Deskのプラグインモジュールがインストールされているディレクトリ

XDW_GI_FOLDERROOTPATH DocuWorks Deskのフォルダのルートディレクトリ

XDW_GI_USERFOLDERPATH DocuWorks Deskのユーザーフォルダのディレクトリ

XDW_GI_DWINPUTPATH DocuWorks DeskのDocuWorks文書入力用ディレクトリ

XDW_GI_DWDESKPATH DocuWorks Deskの実行ファイルの絶対パス

XDW_GI_DWVIEWERPATH DocuWorks Viewerの実行ファイルの絶対パス

XDW_GI_DWVLTPATH DocuWorks ViewerLightの実行ファイルの絶対パス

(以上はDocuWorks SDK 6.2から転載)

 

lpszOutput アウトプットされる情報を格納する変数へのポインタ

nSize アウトプットされる情報を格納する変数のサイズ

reserved 予約 XDW_NULLを指定

使用方法

まずはnSizeを求めます。

lpszOutputがNullの時は必要なバイト数を返してきます。

ここではIndex: Integerをvarで定義。

Indexに必要な情報の番号をセット。

たとえばDocuWorksのバージョンを知りたければ XDW_GI_VERSIONもしくは1ですね。

  Size := XDW_GetInformation(Index, XDW_NULL, 0, XDW_NULL);


としてSizeに格納。

ちなみにSize: Integerです。

次にTempCharというPCharを定義して、情報を格納します。

領域を確保します。

Getmem(TempChar, Size+1);

+1は#0を格納するために必要かな?と思い付けています。

そして

XDW_GetInformation(Index, TempChar, Size, XDW_NULL);


として実行。

ShowMessage( string( TempChar ) );

とすれば「6.2.2」などとダイアログが表示されます。

あ、もちろんTempCharはFreemem(TempChar);として開放しましょう。

tryで囲めば安全ですね。

2008.3
8

XDW_GetPageText

XDW_GetPageTextToMemoryは指定ページのテキストを抽出し、変数に代入する関数でした。

もうひとつ似たような関数でXDW_GetPageTextがあります。

 

例によって移植したヘッダ

function XDW_GetPageText(handle: p_XDW_DOCUMENT_HANDLE; nPage: Integer; const lpszOutputPath: PChar;
reserved: pointer): Integer; stdcall;

 

この関数は何をするかというと、指定ページのテキストをファイルに出力します。

要はテキストファイルができるわけですね。

 

 

handle XDW_OpenDocumentHandleで得たドキュメントハンドル

nPage 出力するページ番号

lpszOutputPath 出力するファイルのフルパスをpCharで

reserved XDW_NULL

 

 

lpszOutputPath はTOpenDialogを使えばカンタンですね。

  if OpenDialog1.Execute then
XDW_GetPageText(FileHandle, 1, pChar(OpenDialog1.FileName), XDW_NULL)

 

これで保存されます。

もちろんFileHandleにはハンドルが入っているものとします。

2008.3
8

XDW_GetPageTextToMemory

指定ページのテキストをメモリ(変数)に格納します。

 

Delphiでの宣言

function XDW_GetPageTextToMemory(handle: p_XDW_DOCUMENT_HANDLE; nPage: Integer;
lpszValue: PChar; nDataSize: Integer; reserved: pointer): Integer; stdcall;

 

handle には XDW_OpenDocumentHandle で得たハンドルを渡します。

nPageはページ番号ですね。

DocuWorksでは1から始まります。

lpszValueは返されるアドレスです。

nDataSizeは返されるアドレス(変数)に割り当ててあるメモリをバイト数で指定します。

reservedにはいつもどおりXDW_NULLです。

 

 

ところでnDataSizeには何バイト割り当てればよいのでしょうか?

 

まずnDataSizeに0、lpszValueにNullを指定すると、返り値で必要なバイト数を返してきます。

これをセットするのですね。

 

実際に組んでみましょう。

 

function GetPageTextToMemory(InPage: Integer): String;
var
Size: Integer;
TempChar: pChar;
begin
//FileHandleにはすでにファイルハンドルが代入されていると仮定
//必要メモリサイズを得る
Size := XDW_GetPageTextToMemory(FileHandle, InPage, XDW_NULL, 0, XDW_NULL);
GetMem(TempChar, Size);
//Get
XDW_GetPageTextToMemory(FileHandle, InPage, TempChar, Size, XDW_NULL);
Result := String(TempChar);
Freemem(TempChar);
end;

 

こうなります。

実際はGetMem~FreeMemをtryで囲んで例外対策をするべきでしょう。

2008.3
7

テキストをすべてメモリに読み込む命令

ドキュワークスAPIにはすべてのテキストをメモリに読み込む命令はないようです。

 

ページごとのテキストを読み込む関数はあります。
(XDW_GetPageTextToMemory)

 

ですが、XDW_GetFullTextはすべてのテキストをいきなりテキストファイルにできます。
ToMemoryも作ってくれればいいのに・・・

 

ということでDocuWorksテキスト抽出ツールではXDW_GetPageTextToMemoryをページ数分繰り返して読み込んでいます。

 

で、XDW_GetPageTextToMemoryの欠点?仕様?なのですが、
この命令、アノテーションの文字は拾ってくれません・・・

まあ他のアプリからプリントしたデータをテキスト化できるという使い方だと思いますが、アノテーションから拾ってくれると便利だなと。

2008.2
12

XDW_SaveDocument

開いたXDWファイルを保存する命令です。

アノテーションの追加や認証の設定などをした後は必ず呼び出してからXDW_CloseDocumentHandleを呼び出してください。

XDW_CloseDocumentHandleだけを呼び出すと、編集をキャンセルして閉じることと同じになります。

 

function XDW_SaveDocument(handle: p_XDW_DOCUMENT_HANDLE; reserved: pointer): Integer; stdcall;

handleにはXDW_OpenDocumentHandleで返ってきたハンドルを渡します。

ちなみにXDW_OpenDocumentHandleはエラー時は0以外を返しますので、その場合に得られたハンドルは不明な値です。

エラーのハンドルを渡さないようにしてください。

例によってreservedはXDW_NULLを渡します。

成功すれば0が返ります。

エラーはエラーコードが返ります。

署名が入ったファイルの場合は文書が「編集」属性となります。

2008.2
12

Docuworks用Nullの定義

DocuWorks APIにはところどころにreservedという引数があり、
それにはヌルを渡せと書いてあります。

しかし、Delphiのvariantで定義されているNullを使うために
いちいちuses variantsをするのは面倒です。

さらにreservedに渡そうとをすると型違いでコンパイラに怒られます。

 

ということで自主的に定義

 

XDW_NULL  = pointer($00000000);

 

としました。

これは果たして正しいのか?という思いはありますが、

とりあえずXDW_NULLとして渡すことで正常に動きます。

2008.2
6

XDW_OpenDocumentHandle

DocuWorksのファイルが開けなければ何も始まりません。
ということでファイルを開き、そのハンドルを返すXDW_OpenDocumentHandleの移植からです。

 

function XDW_OpenDocumentHandle(const lpszFilePath: PChar; var pHandle: p_XDW_DOCUMENT_HANDLE;
pOpenMode: p_XDW_OPEN_MODE): Integer; stdcall;

 

返してくるハンドルの構造体は

 

  XDW_DOCUMENT_HANDLE = record
dummy: Integer;
end;
p_XDW_DOCUMENT_HANDLE = ^XDW_DOCUMENT_HANDLE;

 

と宣言しています。

さて、疑問があるのですがポインタに対して var は必要なのか?ということ。

Cヘッダ移植のページをいろいろ見てやっているのですが、よくわかりません。

しかし、取ると動かなくなります。

ということは必要だ、とすごい判断でやっていますがいいのでしょうか?

 

正しいことを知っている人はコメントください。

 

で、もうひとつの引数pOpenModeですが、

 

  p_XDW_OPEN_MODE = ^XDW_OPEN_MODE;
XDW_OPEN_MODE = record
nSize: Integer;
nOption: Integer;
end;

 

このように宣言しなおし。

気をつけなければならないのは nSizeには渡す前に「構造体のサイズをいれなければならない」ことですん。

なぜか?

それは

  XDW_OPEN_MODE

  XDW_OPEN_MODE_EX

の2つがあるからですね。

 

  p_XDW_OPEN_MODE_EX = ^XDW_OPEN_MODE_EX;
XDW_OPEN_MODE_EX = record
nSize: Integer;
nOption: Integer;
nAuthMode: Integer;
end;

 

同じ引数に普通のものとEXと両方入れられるのです。

EXの方は認証処理に対しての変数が含まれます。(int nAuthMode)

 

認証処理は必要でしょうから標準的にEXを渡すようにすればよいでしょう。

 

var
Mode: p_XDW_OPEN_MODE_EX;
R: Integer;
begin
//XDW_OPEN_MODE_EXでAuthModeを使えるようにする
//実行時はキャストする
Getmem(Mode, Sizeof(XDW_OPEN_MODE_EX));
Mode^.nOption := InOption;
Mode^.nSize   := Sizeof(XDW_OPEN_MODE_EX);
Mode^.nAuthMode := InAuthMode;
R := XDW_OpenDocumentHandle(PChar(InFileName), FileHandle, p_XDW_OPEN_MODE(Mode));
Freemem(Mode);
if R <> 0 then
XDW_CloseDocumentHandle(FileHandle, XDW_NULL);

 

例外が起こった場合は0以外が帰ります。

これでFileHandleに入ったハンドルでXDWファイルを編集することができます。

2008.2
1

オリジナルデータの個数は?

Docuworks中に入れることのできるオリジナルデータは大変便利ですね。

もしソフトがなくてもViewerで見ることができるし、編集したい場合もオリジナルデータのアイコンをクリックすればそのまま編集できますし。

 

このオリジナルデータの情報を取得する関数は「XDW_GetOriginalDataInformation」です。

データナンバーを指定して取得するのですがその前に、
オリジナルデータの個数はどこから取得すればいいのか?

ためしに一個しかデータの付いてない書類に1~10で
forを書いてみたら全部同じデータが返ってきた・・・

 

これでは困るな。

探し中。