LoginSignup
0
1

More than 1 year has passed since last update.

PDFのXDW形式変換(PowerShell)

Last updated at Posted at 2023-06-05

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は自動で消去される。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1