PDFをXDW形式に変換する処理を自動化したい
下記記事をみてそのままやってみたがうまくいかなかった
dllのバージョンが変わっている?
DocuWorksは会社がかわったせいでDLLの内容も変わっているようだ・・・・
SDKとか関連ドキュメントの配布も停止してしまっているので
ヒントがない状態
とりあえず動かしたが失敗
メンバがない的なエラーログがでた
DLLに何が含まれているかチェック
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 になる
このコードの資料も公開されなくなってしまったので
下記ページ等を参考にした
他メモ
- ネットワーク上のフォルダを見ているとうまくいかない?
- 対象のファイル(今回はPDF)を開くためのアプリケーションが関連付けらていないと失敗する
- (当然だが)ライセンスを持っていないと失敗する
- ライセンスはアカウントではなくPCそのものに付与される
- DocuWorksPrinterを規定のプリンタにしておかないと失敗する。スクリプト上に入れておくといいかも
最終版
#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は自動で消去される。