PDFのXDW形式変換(PowerShell)

# PDFをXDW形式に変換する処理を自動化したい

下記記事をみてそのままやってみたがうまくいかなかった

https://qiita.com/pandalv/items/56c6054b6cf848cfbcd5

# dllのバージョンが変わっている？
DocuWorksは会社がかわったせいでDLLの内容も変わっているようだ・・・・
SDKとか関連ドキュメントの配布も停止してしまっているので
ヒントがない状態

# とりあえず動かしたが失敗
メンバがない的なエラーログがでた

# DLLに何が含まれているかチェック

```C#
var asm = System.Reflection.Assembly.LoadFrom("xdwapiwn.dll");

var type = asm.GetExportedTypes();
System.Diagnostics.Debug.WriteLine("DEBUG");


foreach (var a in type)
{
    System.Diagnostics.Debug.WriteLine(a.Name);
    System.Diagnostics.Debug.WriteLine(a.FullName);

    Console.WriteLine(a.Name);
    Console.WriteLine(a.FullName);
}
```
```
XDW_RECT
FujiFilm.FB.DocuWorks.Toolkit.Xdwapi+XDW_RECT
XDW_POINT
FujiFilm.FB.DocuWorks.Toolkit.Xdwapi+XDW_POINT
XDW_OCR_OPTION_V7
FujiFilm.FB.DocuWorks.Toolkit.Xdwapi+XDW_OCR_OPTION_V7
XDW_OCR_OPTION_WRP
FujiFilm.FB.DocuWorks.Toolkit.Xdwapi+XDW_OCR_OPTION_WRP
XDW_OCR_OPTION_FRE_V7
FujiFilm.FB.DocuWorks.Toolkit.Xdwapi+XDW_OCR_OPTION_FRE_V7
XDW_OCR_OPTION_V9
…省略
```
名前が変わっているようだったので修正

# まだエラーがでる
とくに出力の指示していなくてもエラーコードがでてきた
-2147221503　とか
これを16進に直すと　80040001　になる
このコードの資料も公開されなくなってしまったので
下記ページ等を参考にした

https://blog.goo.ne.jp/masayoshikawai/e/6afda9e2330f3ec5f78c93ca7f52236f

# 他メモ
* ネットワーク上のフォルダを見ているとうまくいかない？
* 対象のファイル(今回はPDF)を開くためのアプリケーションが関連付けらていないと失敗する
* (当然だが)ライセンスを持っていないと失敗する
* ライセンスはアカウントではなくPCそのものに付与される
* DocuWorksPrinterを規定のプリンタにしておかないと失敗する。スクリプト上に入れておくといいかも

# 最終版
``` posh
#DLLファイルを読み込む
$script_directory = $PSScriptRoot
$dll_path = $script_directory + "\xdwapiwn.dll"
Add-Type -Path $dll_path

#カレントディレクトリをスクリプトの場所に設定して1つ上の階層に移動
Set-Location $script_directory
Set-Location ..
$current_directory = (Get-Location).Path

#PDFファイルのリストを取得
$pdf_directory = $current_directory + "\pdf"
$pdf_files = Get-ChildItem $pdf_directory

#XDWファイルの出力先を設定
$xdw_directory = $current_directory + "\xdw"

#PDFファイルのリスト分繰り返してXDWを生成する
foreach ( $pdf_file in $pdf_files) {

    #生成されるXDWのハンドル
    [ref]$xdw_handle=[FujiFilm.FB.DocuWorks.Toolkit.Xdwapi+XDW_CREATE_HANDLE]::new()

    #ファイルのパス
    $pdf_path = $pdf_file.FullName
    $xdw_path = $xdw_directory + "\" + (Get-Item $pdf_file.FullName).BaseName + ".xdw"

    #PDFからXDWを生成
    [FujiFilm.FB.DocuWorks.Toolkit.Xdwapi]::XDW_BeginCreationFromAppFile($pdf_path,$xdw_path,"FALSE",$xdw_handle)

    #ステータスを格納するオブジェクト
    [ref]$printer_status=[FujiFilm.FB.DocuWorks.Toolkit.Xdwapi+XDW_CREATE_STATUS]::new()

    #タイマー
    $printer_timeout = 0

    #完了するまで待機(60秒でタイムアウト)
    do {

        #ステータスを取得
        [FujiFilm.FB.DocuWorks.Toolkit.Xdwapi]::XDW_GetStatusCreationFromAppFile($xdw_handle.Value,$printer_status)

        #一秒まつ
        Start-Sleep -Seconds 1

        #タイマーに累積秒を記載
        $printer_timeout+=1

        #60秒で完了しなかったら処理終了
        if ($printer_timeout -ge 60) {
            [FujiFilm.FB.DocuWorks.Toolkit.Xdwapi]::XDW_EndCreationFromAppFile($xdw_handle.Value)
            Exit
        }

    } while ($printer_status.Value.Phase -ne 8)

    [FujiFilm.FB.DocuWorks.Toolkit.Xdwapi]::XDW_EndCreationFromAppFile($xdw_handle.Value)

    #完了したらPDFを削除
    Remove-Item $pdf_file.FullName

}

```

# 使い方
任意のフォルダにpdf、scripts、xdwフォルダを作成して、scriptsフォルダに上記powershellとdll、あとpowershellを権限ありで呼び出すbatファイルを置く。pdfフォルダに変換したいファイルをいれてbatファイルを起動すると変換が開始する。完了するとxdwフォルダにxdwファイルが保存されPDFは自動で消去される。