« ☆TStringGridのDrag&Drop | トップページ | ☆LaLaVoice 2001を使って音声合成させる。 »

☆DocuWorksファイルの自動正立

DocuWorksでスキャンした書類を向きを揃えるのは面倒なので、何か方法がないのかなと思って調べてみました。 DocuWorks Deskのメニューには自動処理的なものが見当たらなかったのですが、APIにXDW_RotatePageAutoというのがあったので、試してみました。
→メニューにありました。この記事の追記を参照して下さい。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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';


procedure TForm1.Button1Click(Sender: TObject);
var
  h: XDW_DOCUMENT_HANDLE;
  mode: XDW_OPEN_MODE;
  info: XDW_DOCUMENT_INFO;
  InputFile: String;
  I, J, K, Last_Page: Integer;
begin
 // 文書ハンドルを開く
  mode.nSize := sizeof(XDW_OPEN_MODE);
  mode.nOption := XDW_OPEN_UPDATE;

  InputFile := 'c:\delphi.xdw';

  I := XDW_OpenDocumentHandle(PAnsiChar(InputFile), h, mode);
  try
    if I > -1 then
    begin
      info.nSize := SizeOf(XDW_DOCUMENT_INFO);
      info.nPages := 0;
      info.nVersion := 0;
      info.nOriginalData := 0;
      info.nDocType := 0;
      info.nPermission := 0;
      info.nShowAnnotations := 0;
      info.nDocuments := 0;
      info.nBinderColor := 0;
      info.nBinderSize := 0;

      XDW_GetDocumentInformation(h, info);
      Last_Page := info.nPages;

      K := 0;
      for I := 1 to Last_Page do
      begin
        J := XDW_RotatePageAuto(h, I);
        K := K + J;
      end;

      // エラーがない場合に変更内容を保存する
      if K = 0 then
        XDW_SaveDocument(h);
    end;
  finally
    // 文書ハンドルを閉じる
    XDW_CloseDocumentHandle(h);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  XDW_Finalize(nil);  // XDW_RotatePageAutoを呼び出したらこの処理が必ず必要
end;

end.


実行すると次のような横向きの画像が・・・

Yoko

このようにきちんと縦向きに回転されました。

Tate



上の画像以外にもページ数が多いものや少ないもの等いろいろな書類を処理してみましたが、一つだけ次のようなエラーが表示されるものがありました。

Error

状況としては10ページある書類データで最終ページの処理でエラーになります。他のデータと同じくスキャンして取り込んだものなのでパーミッションの問題ではないと思うのですが、エラーの原因はわかりませんでした。


DocuWorks Development Tool Kit 6.2 日本語版
http://www.fujixerox.co.jp/soft/docuworks/download301.html



[20080121 追記]
Docuworks Deskの設定スキャン取り込みタブにスキャン文書の後処理読める方向に全ページを自動回転するという設定がありました。

|

« ☆TStringGridのDrag&Drop | トップページ | ☆LaLaVoice 2001を使って音声合成させる。 »