☆Docuworksプラグイン「自動正立」を作る。
最近の記事の処理を組み合わせて、実際に使えるプラグイン「自動正立」を作ってみます。このプラグインは、Docuworks Deskで選択したファイルの全ページを文字の読める方向に自動回転させます。
library Project1; uses Windows, SysUtils; {$R *.res} // xdwapiを使うための宣言--ここから const XDW_OPEN_UPDATE = 1; type XDW_DOCUMENT_HANDLE = record dummy: LongInt; end; XDW_OPEN_MODE = record nSize: Integer; nOption: Integer; end; XDW_DOCUMENT_INFO = record nSize: Integer; nPages: Integer; nVersion: Integer; nOriginalData: Integer; nDocType: Integer; nPermission: Integer; nShowAnnotations: Integer; nDocuments: Integer; nBinderColor: Integer; nBinderSize: Integer; end; function XDW_OpenDocumentHandle(const lpszFilePath: PAnsiChar; var Handle: XDW_DOCUMENT_HANDLE; var OpenMode: XDW_OPEN_MODE): Integer; stdcall; external 'xdwapi.dll'; function XDW_GetDocumentInformation(Handle: XDW_DOCUMENT_HANDLE; var DocumentInfo: XDW_DOCUMENT_INFO): Integer; stdcall; external 'xdwapi.dll'; function XDW_RotatePageAuto(Handle: XDW_DOCUMENT_HANDLE; nPage: Integer; reserved: Pointer=nil): Integer; stdcall; external 'xdwapi.dll'; function XDW_SaveDocument(Handle: XDW_DOCUMENT_HANDLE; reserved: Pointer= nil): Integer; stdcall; external 'xdwapi.dll'; function XDW_CloseDocumentHandle(Handle: XDW_DOCUMENT_HANDLE; reserved: Pointer=nil): Integer; stdcall; external 'xdwapi.dll'; function XDW_Finalize(reserved: Pointer = nil): Integer; stdcall; external 'xdwapi.dll'; // xdwapiを使うための宣言--ここまで // 以下、PLUGINSPI用の処理 const PLUGGEDIN_REGKEY = 'Software\\FujiXerox\\MPM3\\MPWS\\PLUGGEDIN'; MAX_PLUGGEDIN_NUMBER = 30; PLUGGEDIN_VERSION = 2; // PLUGGEDIN_NAME_INITIALIZE = '_PLG_Initialize@4'; PLUGGEDIN_NAME_FINALIZE ='_PLG_Finalize@4'; PLUGGEDIN_NAME_CANFINALIZE = '_PLG_CanFinalize@4'; PLUGGEDIN_NAME_REQUIREFILES = '_PLG_RequireFiles@4'; PLUGGEDIN_NAME_EXECUTECOMMAND = '_PLG_ExecuteCommand@4'; PLUGGEDIN_NAME_ISPARALLEL = '_PLG_IsParallel@4'; PLUGGEDIN_NAME_ISCLONINGCOMMAND = '_PLG_IsCloningCommand@4'; PLUGGEDIN_NAME_GETNEWCLONE = '_PLG_GetNewClone@8'; PLUGGEDIN_NAME_RELEASECLONE = '_PLG_ReleaseClone@4'; PLUGGEDIN_NAME_EXECUTABLE = '_PLG_Executable@8'; PLUGGEDIN_NAME_CANSETPROFILE = '_PLG_CanSetProfile@4'; PLUGGEDIN_NAME_SETPROFILE = '_PLG_SetProfile@4'; PLUGGEDIN_NAME_GETCOMMANDICON = '_PLG_GetCommandIcon@8'; PLUGGEDIN_NAME_ENUMERATECOMMANDS = '_PLG_EnumerateCommands@12'; type Tps_pszFiles = ^_Tps_pszFiles; _Tps_pszFiles = array[0..32767] of PChar; Tps_pnPageNumbers = ^_ps_pnPageNumbers; _ps_pnPageNumbers = array[0..32767] of LongInt; PLUGGEDIN_STRUCT = ^TPluggedin_struct; TPluggedin_struct = packed record ps_nPlugVersion: LongInt; ps_pszFunction: PChar; ps_execParallel: LongInt; ps_nFiles: LongInt; ps_pszFiles: Tps_pszFiles; ps_pnPageNumbers: Tps_pnPageNumbers; ps_pszExecFolder: PChar; ps_hwndDWDesk: LongInt; end; // Initialize Entry function PLG_Initialize(const cmdName: PChar): LongInt; stdcall; begin Result := 1; end; // Finalize Entry function PLG_Finalize(const cmdName: PChar): LongInt; stdcall; begin XDW_Finalize(nil); Result := 1; end; // CanFinalize Entry function PLG_CanFinalize(const cmdName: PChar): LongInt; stdcall; begin Result := 1; end; // RequireFiles Entry function PLG_RequireFiles(const cmdName: PChar): LongInt; stdcall; begin Result := 1; end; // ExecuteCommand Entry function PLG_ExecuteCommand(pPlgStruct: PLUGGEDIN_STRUCT): LongInt; stdcall; const M1 = '自動正立'; M2 = '時間がかかるけどいいの?'; M3 = '終了しました。'; var I,J,K,L,Last_Page: Integer; S: String; h: XDW_DOCUMENT_HANDLE; mode: XDW_OPEN_MODE; info: XDW_DOCUMENT_INFO; InputFile: String; begin Result := 1; if MessageBox(0, PChar(M2), PChar(M1), MB_OKCANCEL) <> 1 Then Exit; // 文書ハンドルを開く mode.nSize := sizeof(XDW_OPEN_MODE); mode.nOption := XDW_OPEN_UPDATE; S := ''; for I := 0 to pPlgStruct^.ps_nFiles-1 do begin //pPlgStruct^.ps_pnPageNumbers[I]; 表示ページ番号 InputFile := pPlgStruct^.ps_pszFiles^[I]; J := XDW_OpenDocumentHandle(PAnsiChar(InputFile), h, mode); try if J > -1 then begin info.nSize := SizeOf(XDW_DOCUMENT_INFO); XDW_GetDocumentInformation(h, info); Last_Page := info.nPages; K := 0; for L := 1 to Last_Page do begin J := XDW_RotatePageAuto(h, L); K := K + J; end; // エラーがない場合に変更内容を保存する if K = 0 then XDW_SaveDocument(h); end; finally // 文書ハンドルを閉じる XDW_CloseDocumentHandle(h); end; end; MessageBox(0, PChar(M3),PChar(M1), MB_OK); Result := 1; end; // IsParallel Entry function PLG_IsParallel(const cmdName: PChar): LongInt; stdcall; begin Result := 0; end; // IsCloning Entry function PLG_IsCloningCommand(const cmdName: PChar): LongInt; stdcall; begin Result := 0; end; // GetNewClone Entry function PLG_GetNewClone(cmdName: PChar; nBufSize: LongInt): LongInt; stdcall; begin Result := 0; end; // ReleaseClone Entry function PLG_ReleaseClone(const cmdName: PChar): LongInt; stdcall; begin Result := 0; end; // Executable Entry function PLG_Executable(const cmdName: PChar; nArgFiles: LongInt): LongInt; stdcall; begin Result := nArgFiles; // ファイルが選択されていない場合には処理させない。 end; // CanSetProfile Entry function PLG_CanSetProfile(const cmdName: PChar): LongInt; stdcall; begin Result := 0; end; // SetProfile Entry function PLG_SetProfile(const cmdName: PChar): LongInt; stdcall; begin Result := 0; end; // GetAppIcon Entry function PLG_GetCommandIcon(const cmdName: PChar; bNormalSize: LongInt): HICON; stdcall; begin // 本当はbNormalSize (0,1) により大きなアイコンと小さなものを設定する。 Result:= LoadIcon(hInstance, MAKEINTRESOURCE('MAINICON')); end; // EnumerateCommands Entry function PLG_EnumerateCommands(var cmdNameList: PChar; nBufSize: LongInt; var nBufSizeRequired: LongInt): LongInt; stdcall; const S = '自動正立 by hiderin'; begin nBufSizeRequired := Length(S)+1; if (nBufSize < nBufSizeRequired) then begin Result := 0; Exit; end; StrCopy(@cmdNameList, S); Result := 1; end; exports PLG_INITIALIZE name PLUGGEDIN_NAME_INITIALIZE, PLG_FINALIZE name PLUGGEDIN_NAME_FINALIZE, PLG_CANFINALIZE name PLUGGEDIN_NAME_CANFINALIZE, PLG_REQUIREFILES name PLUGGEDIN_NAME_REQUIREFILES, PLG_EXECUTECOMMAND name PLUGGEDIN_NAME_EXECUTECOMMAND, PLG_ISPARALLEL name PLUGGEDIN_NAME_ISPARALLEL, PLG_ISCLONINGCOMMAND name PLUGGEDIN_NAME_ISCLONINGCOMMAND, PLG_GETNEWCLONE name PLUGGEDIN_NAME_GETNEWCLONE, PLG_RELEASECLONE name PLUGGEDIN_NAME_RELEASECLONE, PLG_EXECUTABLE name PLUGGEDIN_NAME_EXECUTABLE, PLG_CANSETPROFILE name PLUGGEDIN_NAME_CANSETPROFILE, PLG_SETPROFILE name PLUGGEDIN_NAME_SETPROFILE, PLG_GETCOMMANDICON name PLUGGEDIN_NAME_GETCOMMANDICON, PLG_ENUMERATECOMMANDS name PLUGGEDIN_NAME_ENUMERATECOMMANDS; begin end.
| 固定リンク