« ☆「char**」 を Delphiで書くと・・・。 | トップページ | ☆Docuworksで「ファイル名に日付を付加する」プラグイン »

☆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.

|

« ☆「char**」 を Delphiで書くと・・・。 | トップページ | ☆Docuworksで「ファイル名に日付を付加する」プラグイン »