Pythonドライバ

概要

Pythonドライバは、出力をPDFに変換することができます。

ドライバの準備

Python用ドライバ(Python 3対応)はGitHubの https://github.com/zamasoftnet/cti.python で公開されています。pipを使ってインストールすることができます。

pip install "git+https://github.com/zamasoftnet/cti.python.git#subdirectory=python3"

インストール後は from cti import get_session でドライバを読み込んでください。

# ドライバの読み込み
from cti import get_session

# セッションの開始(with文を使用)
with get_session('ctip://localhost:8099/',{
    'user'  :'user',
    'password'  :'kappa'
}) as session:
	# 各種操作
	...

APIの概要

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

サーバーへの接続・認証

サーバー情報の取得

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

出力先の設定

プロパティの設定

ソースリゾルバの設定

リソースの送信

本体の送信・変換

複数の結果の結合

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

サンプル

以下は、プログラムによる出力を変換するサンプルです。sys.stdoutを途中でCopper PDFへの出力に切り替えています。


  
    Python Test
  
  

Hello Python

只今の時刻は: %s

""" % time.strftime("%Y/%m/%d %H:%M:%S") finally: sys.stdout.close() sys.stdout = sys.__stdout__ finally: session.close()]]>

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

他のサンプルはドライバのsrc/testに収められています。

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

Content-Type, Content-Length ヘッダの出力

ウェブアプリケーションでは、Content-Type, Content-Lengthヘッダを出力しないと、 ブラウザ上でPDFが正常に表示されないことがあります。 set_resultsやset_output_XXXメソッドを呼び出さない初期状態では、 出力先は標準出力(sys.__stdout__)に設定されています。 このとき、自動的にContent-Type, Content-Lengthヘッダが出力されます。

これはSingleResultとStreamBuilderのコンストラクタに渡すことができるブロックを利用しています。 同じ状態にするためには、以下のようにSession#set_resultsメソッドを呼び出してください。

> sys.__stdout__, "Content-Type: "+opts['mime_type']
def content_length(length):
    print >> sys.__stdout__, "Content-Length: "+str(length)
    print >> sys.__stdout__
results = SingleResult(StreamBuilder(sys.__stdout__, content_length), content_type)
session.set_results(results)]]>

繰り返し処理

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

出力先の設定

set_output_as_stream, set_output_as_fileにより、 単一のファイルハンドルかファイルを出力先として設定することができます。

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

session.property("output.type", "image/jpeg")
session.set_output_as_directory("results", "image", ".jpeg")

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

サーバーから要求されたリソースを送る場合、resolverを呼び出してください。 このメソッドには、要求されたファイルのURIと、サーバーへのファイルハンドルを得るためのブロックを渡します 以下の例では、URIが相対パスであるという前提で、ローカルのファイルがあればサーバーに送信します。

def resolver(uri, r):
    if os.path.exists(uri):
        out = r.found()
        try:
            file = open(uri)
            try:
                out.write(file.read())
            finally:
                file.close()
        finally:
            out.close()
session.set_resolver_func(resolver)

実際に動作するサンプルはドライバの python3/src/test/ にあります。

複数の結果の結合

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

session.set_continuous(True)

# 文書の送信
out = session.transcode()
try:
    file = open('data/test.html')
    try:
        out.write(file.read())
    finally:
        file.close()
finally:
    out.close()

#リソースのアクセス許可
session.property('input.include', 'https://copper-pdf.com/**')
  
#文書の変換
session.transcode_server('https://copper-pdf.com/')

# 結合
session.join()

実際に動作するサンプルはドライバの python3/src/test/ にあります。

ソースコード

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