Node.jsドライバ

概要

Node.jsドライバは、ストリーム(Writable)への出力をPDFに変換することができます。 TypeScriptで実装されており、TypeScriptおよびJavaScript(CommonJS/ESM)から利用できます。

ドライバの準備

Node.js用ドライバはCopper PDF本体とは別に配布されています。 https://github.com/zamasoftnet/cti.nodejs から取得してください。 npmを使ってインストールするには、次のコマンドを実行してください。

npm install https://github.com/zamasoftnet/cti.nodejs.git

動作環境はNode.js 14以降です。 インストール後、TypeScriptでは import { get_session } from 'copper-cti'、 CommonJSでは const { get_session } = require('copper-cti') でドライバを読み込んでください。

import { get_session } from 'copper-cti';

// セッションの開始
const session = get_session('ctip://localhost:8099/', {
    user: 'user',
    password: 'kappa'
});
try {
    // 各種操作
    ...
    await session.waitForCompletion();
} finally {
    session.close();
}
const { get_session } = require('copper-cti');

// セッションの開始
const session = get_session('ctip://localhost:8099/', {
    user: 'user',
    password: 'kappa'
});
try {
    // 各種操作
    ...
    await session.waitForCompletion();
} finally {
    session.close();
}

APIの概要

ここではAPIによるアクセスの概要で説明した各手順に対応する関数を列挙します。 各関数の詳細は オンラインのAPIドキュメントを参照してください。

サーバーへの接続・認証

サーバー情報の取得

メッセージハンドラ・プログレスリスナの設定

出力先の設定

プロパティの設定

ソースリゾルバの設定

リソースの送信

本体の送信・変換

複数の結果の結合

処理の中断・リセット・通信の終了

サンプル

以下は、プログラムによる出力を変換するサンプルです。session.transcode()が返すWritableストリームにHTMLを書き込んでいます。

 {
            console.log(`Message [${code}]: ${msg}`);
        });

        // 文書の送信
        const writer = session.transcode('.');
        writer.write(`
  Node.js Test
  
    

Hello Node.js

只今の時刻は: ${new Date().toLocaleString('ja-JP')}

`); writer.end(); // 変換完了を待機 await session.waitForCompletion(); console.log('PDF generated: out/hello.pdf'); } finally { session.close(); } } main();]]>

次の例は、ファイルをストリームとして読み込み変換します。

次の例は、サーバー側からネットワーク上のウェブページにアクセスしてPDFに変換します。

他のサンプルはドライバの examples ディレクトリに収められています。

プログラミングのポイント

async/awaitによる完了待機

Node.jsドライバでは、変換処理は非同期で行われます。 session.transcode()でストリームへの書き込みを開始し、書き込みが完了したら await session.waitForCompletion()で変換完了を待機してください。 waitForCompletion()を呼び出さないと、変換が完了する前に処理が終了してしまいます。

繰り返し処理

出力先を変え、transcode()またはtranscodeServer()を繰り返し呼び出すことで、 同じセッションで何度もドキュメントを変換することができます。 送信済みのリソース、設定済みのプロパティは同じセッションで維持されます。 同じセッションのまま初期状態に戻すには session.reset()を呼び出してください。

出力先の設定

setOutputAsStream(), setOutputAsFile()により、 単一の書き込みストリームかファイルを出力先として設定することができます。

複数の結果をファイルとして出力する場合は、setOutputAsDirectory()を使用してください。 このメソッドは、指定したディレクトリに、1から開始する連番の前後に指定した文字列をくっつけたファイル名で結果を出力します。 次の例では変換結果の各ページを、resultsディレクトリ内に"image[通し番号].jpeg"という名前で別々のJPEG画像として出力します。

session.setProperty('output.type', 'image/jpeg');
session.setOutputAsDirectory('results', 'image', '.jpeg');

サーバーから要求されたリソースの送信

サーバーから要求されたリソースを送る場合、setResolverFunc()でコールバック関数を設定してください。 コールバックには要求されたリソースのURIとResourceオブジェクトが渡されます。 リソースが存在する場合はresource.found()を呼び出して取得した書き込みストリームにデータを流し込んでください。 リソースが存在しない場合はresource.found()を呼び出さないでください。

 {
    const localPath = path.join(__dirname, uri);
    if (fs.existsSync(localPath)) {
        const out = resource.found({ mime_type: 'text/css' });
        fs.createReadStream(localPath).pipe(out);
    }
    // リソースが見つからない場合は resource.found() を呼ばない
});]]>

複数の結果の結合

複数の結果を結合したものを得るためには、 session.setContinuous(true) を呼び出した後、transcode()を複数回呼び出し、最後に session.join() を呼び出してください。

ソースコード

ドライバのソースコードはGitHubに公開しています。 https://github.com/zamasoftnet/cti.nodejs