※この記事は、前編でイントロダクションです。手っ取り早く解決策が知りたい場合は、FUJI XEROX DocuWorks APIをVBAから利用する(DocuWorksファイルのページからイメージファイルを生成する)【後編】をご覧ください。
先日書いた記事「FUJI XEROX DocuWorks APIをVBAから利用する。」で、DocuWorksファイルからJPEGファイルを作る方法について、コメントを頂きました。
DocuWorks APIを使って、DocuWorksファイルからイメージファイルを生成するには、XDW_ConvertPageToImageFile関数を使います。第3パラメータpImageOptionに構造体XDW_IMAGE_OPTIONを設定すると、指定したページのBMPファイルができます。
また、第3パラメータpImageOptionに構造体XDW_IMAGE_OPTION_EXを設定すると、ビットマップだけでなく、TIFF、JPEG、PDFファイルが作れます。JPEGを作るには、XDW_IMAGE_OPTION_EXを使う必要があります。
この関数でPDFファイルが作れるとは、知りませんでした。圧縮方法もいくつか指定ができます。
詳細は、DocuWorks API 仕様書を確認してくださいね。
今、なかなか時間がないのですが、とりあえず構造体XDW_IMAGE_OPTIONも構造体XDW_IMAGE_OPTION_EXもVBAから使えることを確認しました。
とりあえず、構造体XDW_IMAGE_OPTIONを使って、BMPファイルを作るサンプルスクリプトを載せます。
また時間ができたら、追記で構造体XDW_IMAGE_OPTION_EXの方も載せてみようかな。
動作確認環境は、WindowsXP Excel2003 DocuWorks6.2です。
’2.6 XDW_CloseDocumentHandle DocuWorksファイルにアクセスするためのハンドルを解放する。 Public Declare Function XDW_CloseDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal reserved As String) As Long ’2.64 XDW_OpenDocumentHandle DocuWorksファイルにアクセスするためのハンドルを得る。この場合だけ、pHandleはByRefで定義 Public Declare Function XDW_OpenDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal lpszFilePath As String, ByRef pHandle As Long, ByRef pMode As XDW_OPEN_MODE) As Long Public Type XDW_OPEN_MODE nSize As Long nOption As Long End Type ’2.8 XDW_ConvertPageToImageFile DocuWorksファイルのページからイメージファイルを生成する。 Public Declare Function XDW_ConvertPageToImageFile Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal nPage As Long, ByVal lpszOutputPath As String, ByRef pImageOption As XDW_IMAGE_OPTION) As Long Public Type XDW_IMAGE_OPTION nSize As Long ’構造体XDW_IMAGE_INFOのバイト数を設定する。 nDpi As Long ‘解像度。10~600dpiの範囲の整数値。 nColor As Long ‘XDW_IMAGE_MONOのときは白黒、XDW_IMAGE_MONO_HIGHQUALITYのときは白黒 (高画質)、XDW_IMAGE_COLORのときはカラーを示す。 End Type ————宣言部ここまで———— ————プロシージャここから———— Sub GetImageFromXDW() Dim strFileName1, strFileName2 As String ‘Docworksを使うための前処理(ここから) Dim lngHandle As Long Dim myMode As XDW_OPEN_MODE Dim myImageOption As XDW_IMAGE_OPTION With myMode ’XDW_OpenDocumentHandleを実行する際のmyModeに値を設定 .nOption = 1 ‘ #define XDW_OPEN_READONLY 0 ‘ #define XDW_OPEN_UPDATE 1 .nSize = LenB(myMode) End With With myImageOption ’XDW_ConvertPageToImageFileを実行する際のpImageOptionに値を設定 .nDpi = 300 .nColor = 1 ’#define XDW_IMAGE_MONO 0 ‘#define XDW_IMAGE_COLOR 1 ‘#define XDW_IMAGE_MONO_HIGHQUALITY 2 .nSize = LenB(myImageOption) End With ‘Docworksを使うための前処理(ここまで) strFileName1 = "D:\test001.xdw" strFileName2 = "D:\test001.bmp" ‘DocuWorksファイルにアクセスするためのハンドルを得る。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。 XDW_OpenDocumentHandle strFileName1, lngHandle, myMode ‘DocuWorksファイルのページからイメージファイルを生成する。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。 XDW_ConvertPageToImageFile lngHandle, 1, strFileName2, myImageOption ’1ページ目をイメージファイルにする。 ‘DocuWorksファイルにアクセスするためのハンドルを解放する。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。 XDW_CloseDocumentHandle lngHandle, vbNullString End Sub
2010年10月11日追記。
さて、 XDW_ConvertPageToImageFile関数を使いこなすべく、試行錯誤してみたものの、未完成です。残念。
現段階で、できないのは、XDW_IMAGE_OPTION_EX構造体のpDetailOption(void型)にTIFFやJPEG、PDFのイメージの種類に対応した構造体、XDW_IMAGE_OPTION_TIFF、XDW_IMAGE_OPTION_JPEG、XDW_IMAGE_OPTION_PDFのポインタを指定するところ。
ということで、現段階でできているのは、上記の構造体のポインタを指定せず、デフォルト値で各イメージ(TIFF、JPEG、PDF)に変換すること。デフォルト値で最も困るのが、マルチページで出力できないこと。最初の1ページしか変換できません・・・。
なんて中途半端な。
期待していらっしゃった方々、申し訳ないです。ごめんなさい。
ともあれ、サンプルスクリプトです。
————宣言部ここから———— ’2.34 XDW_GetDocumentInformation DocuWorksファイル全体に関わる情報を得る。 Public Declare Function XDW_GetDocumentInformation Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByRef pDocumentInfo As XDW_DOCUMENT_INFO) As Long Public Type XDW_DOCUMENT_INFO nSize As Long ‘構造体XDW_DOCUMENT_INFOのバイト数を設定する。 nPages As Long ’総ページ数。 nVersion As Long ‘DocuWorksファイルのファイルフォーマットのバージョン。 nOriginalData As Long ‘オリジナルデータの数。 nDocType As Long ‘ファイルの種類。 nPermission As Long ‘認可情報。 nShowAnnotations As Long ‘アノテーションの表示状態。 nDocuments As Long ‘nDocTypeがバインダーである場合はバインダーの内部DocuWorks文書数を示す。 nBinderColor As Long ’nDocTypeがバインダーである場合はバインダーの色を示す。 nBinderSize As Long ‘nDocTypeがバインダーである場合はバインダーのサイズを示す。 End Type ’2.6 XDW_CloseDocumentHandle DocuWorksファイルにアクセスするためのハンドルを解放する。 Public Declare Function XDW_CloseDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal reserved As String) As Long ’2.64 XDW_OpenDocumentHandle DocuWorksファイルにアクセスするためのハンドルを得る。この場合だけ、pHandleはByRefで定義 Public Declare Function XDW_OpenDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal lpszFilePath As String, ByRef pHandle As Long, ByRef pMode As XDW_OPEN_MODE) As Long Public Type XDW_OPEN_MODE nSize As Long nOption As Long End Type ’2.8 XDW_ConvertPageToImageFile DocuWorksファイルのページからイメージファイルを生成する。 Public Declare Function XDW_ConvertPageToImageFile Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal nPage As Long, ByVal lpszOutputPath As String, ByRef pImageOption As XDW_IMAGE_OPTION_EX) As Long ‘Public Type XDW_IMAGE_OPTION ‘ nSize As Long ’構造体XDW_IMAGE_INFOのバイト数を設定する。 ‘ nDpi As Long ‘解像度。10~600dpiの範囲の整数値。 ‘ nColor As Long ‘XDW_IMAGE_MONOのときは白黒、XDW_IMAGE_MONO_HIGHQUALITYのときは白黒 (高画質)、XDW_IMAGE_COLORのときはカラーを示す。 ‘End Type Public Type XDW_IMAGE_OPTION_PDF nSize As Long ’構造体XDW_IMAGE_OPTION_PDFのバイト数を設定する。 nCompress As Long ’圧縮形式を指定する。 nConvertMethod As Long ‘MRC圧縮するときに変換方法を指定する。 nEndOfMultiPages As Long ‘マルチページで出力したいときに指定する。nPageからここで指定したページまでを単一のPDFファイルとして出力する。 End Type Public Type XDW_IMAGE_OPTION_EX nSize As Long ’構造体XDW_IMAGE_OPTION_EXのバイト数を設定する。 nDpi As Long ‘解像度。10~600dpiの範囲の整数値。 nColor As Long ‘XDW_IMAGE_MONOのときは白黒、XDW_IMAGE_MONO_HIGHQUALITYのときは白黒 (高画質)、 XDW_IMAGE_COLORのときはカラーを示す。 nImageType As Long ‘イメージの種類を指定する。 pDetailOption As Object ‘ここが大問題!!!値を設定しないならvariant,XDW_IMAGE_OPTION_PDF以外でOK、構造体を渡すならユーザー定義型を設定? End Type ————宣言部ここまで———— ————プロシージャここから———— Sub GetImageFromDWX_EX() Dim strFileName1, strFileName2 As String Dim lngPageNo As Long Dim lngRoAutoErr As Long ‘Docworksを使うための前処理(ここから) Dim lngHandle As Long Dim myMode As XDW_OPEN_MODE Dim myInfo As XDW_DOCUMENT_INFO Dim myImageOptionEx As XDW_IMAGE_OPTION_EX Dim myImageOptionPDF As XDW_IMAGE_OPTION_PDF With myMode ’XDW_OpenDocumentHandleを実行する際のmyModeに値を設定 .nOption = 1 ‘ #define XDW_OPEN_READONLY 0 ‘ #define XDW_OPEN_UPDATE 1 .nSize = LenB(myMode) End With With myInfo ’XDW_GetDocumentInformationを実行する際のmyInfoに値を設定 .nSize = LenB(myInfo) End With With myImageOptionPDF .nCompress = 8 ‘#define XDW_COMPRESS_MRC_NORMAL 8 ‘#define XDW_COMPRESS_MRC_HIGHQUALITY 9 ‘#define XDW_COMPRESS_MRC_HIGHCOMPRESS 10 ‘#define XDW_COMPRESS_NORMAL 0 ‘#define XDW_COMPRESS_HIGHQUALITY 2 ‘#define XDW_COMPRESS_HIGHCOMPRESS 3 .nConvertMethod = 0 ‘#define XDW_CONVERT_MRC_ORIGINAL 0 ‘#define XDW_CONVERT_MRC_OS 1 .nEndOfMultiPages = 0 ‘マルチページで出力したいときに指定する。 ’nPageからここで指定したページまでを単一のPDFファイル ’として出力する。0またはnPageと同じ場合はシングルページ ’となる (default)。負の値や、正でnPageより小さい場合は ’エラーとなる。文書の総ページ数より大きかった場合は、 ’nPageから総ページ数までをマルチページで出力する。 .nSize = LenB(myImageOptionPDF) End With With myImageOptionEx .nDpi = 300 .nColor = 1 ’#define XDW_IMAGE_MONO 0 ‘#define XDW_IMAGE_COLOR 1 ‘#define XDW_IMAGE_MONO_HIGHQUALITY 2 .nImageType = 3 ‘#define XDW_IMAGE_DIB 0 ‘#define XDW_IMAGE_TIFF 1 ‘#define XDW_IMAGE_JPEG 2 ‘#define XDW_IMAGE_PDF 3 ‘ .pDetailOption = myImageOptionPDF ’ここ、コメントアウトしてあります。 .nSize = LenB(myImageOptionEx) End With ‘Docworksを使うための前処理(ここまで) strFileName1 = "D:\test001.xdw" strFileName2 = "D:\test001.pdf" ‘DocuWorksファイルにアクセスするためのハンドルを得る。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。 XDW_OpenDocumentHandle strFileName1, lngHandle, myMode ‘DocuWorksファイル全体に関わる情報を得る。 XDW_GetDocumentInformation lngHandle, myInfo ‘DocuWorksファイルのページからイメージファイルを生成する。 MsgBox XDW_ConvertPageToImageFile(lngHandle, 1, strFileName2, myImageOptionEx) ‘DocuWorksファイルにアクセスするためのハンドルを解放する。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。 XDW_CloseDocumentHandle lngHandle, vbNullString End Sub
上記のスクリプトでは、「.pDetailOption = myImageOptionPDF」をコメントアウトしてあるので、デフォルト値で各ファイルに変換されます。何のファイルに変換するかはmyImageOptionExのnImageTypeに該当の数値を設定することで決定します。あ、当然ですが、strFileName2で設定している出力ファイル名の拡張子もそれにあわせて変更してください。
うーん、上にも書いたのですが、よく分からないのがXDW_IMAGE_OPTION_EX構造体のpDetailOption。
まず、何も値を渡さない場合、variantとユーザー定義型を設定すると、実行時エラーはないが、XDW_ConvertPageToImageFile関数がエラーコード-2147024809、16進数では80070057、すなわちXDW_E_INVALIDARGエラーを返してくる。
また、pDetailOptionにXDW_IMAGE_OPTION_PDF構造体を渡すときは、当然ユーザー定義型(XDW_IMAGE_OPTION_PDF)を設定しないと、実行時エラーとなり、「コンパイルエラー:パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。」のメッセージが表示される。最初このメッセージを見たときは、何が起こったかわからなかったのですが、今回は要するに「型が違うぞ」ということらしい。まぁ、そりゃそうだよね。でも、variant型を設定しても上記の実行時エラーになります。
構造体は間違いなく作れていると思うんだけど、それ以前の問題で実行時エラー。
これって、どーゆーことなのでしょう?pDetailOptionオプションに値を設定しない場合の挙動から見ると、構造体のvoid型の要素にポインタを引き渡すときは、variantとユーザー定義型はダメってこと?
かといって、構造体を渡したいときは、ユーザー定義型にしないとコンパイルエラーになる。
ということは、クラス化・・・・?
まず、自分の経験を振り返ってみると、今までvoid型の引数にはnullを渡したことはあるけれど、構造体のポインタを渡したことはなかったです。いろいろ検索してみても、どうやら難しいらしい・・・。既にXDW_ConvertPageToImageFile関数のpImageOption引数はByRef と参照渡しにしてあるからなぁ。いやいや、でもpDetailOptionを参照渡しにしてるわけじゃないし、そもそもTypeステートメントに参照渡しなんてなさそうだし。
クラス化するとvoid型引数に構造体を渡せるとの記事もありますが、ちょっと荷が重いなぁ。
ちなみに、あまりに自信がないので、スクリプトは載せませんが、XDW_IMAGE_OPTION_PDFをクラス化して、pDetailOptionにSetしてみたりもしたのですが、現在のところうまくいっていません。
というわけで、自分の実力を世界にさらす記事になってしまいました。ああハズカシ。クラス化にもさらに挑戦してみますが、自信ないです。
VBAで、構造体のvoid型で定義された要素に、構造体のポインタを渡す方法、誰か知りませんか?
※この記事は、前編でイントロダクションです。手っ取り早く解決策が知りたい場合は、FUJI XEROX DocuWorks APIをVBAから利用する(DocuWorksファイルのページからイメージファイルを生成する)【後編】をご覧ください。
ありがとうございます!!!
作成できることが確認できました。
大変助かりましたし、勉強になりました。
また、追記にも期待しております。
今回は、本当にありがとうございました。
DoucuWorks API VBA 検索で辿りつきました。なんとすばらしい。救世主。早速Excelに組み込んでみましたら、あら、簡単に成功。他の機能も掲載いただけると、大変助かります。ありがとうございました。
kkさん、こんにちは。なんだか複数の人からコメントいただくと、照れちゃいますねぇ。
このところ、仕事がとても忙しくて、なかなかコーディングしてる時間がないのです。
この記事の追記も検討中ですので、気長にお待ちくださいね。