←前へ 目次↑ 次へ→

3.13. Pythonドライバ

3.13.1. 概要

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

3.13.2. ドライバの準備

Python用ドライバはCopper PDF本体とは別に配布されています。 http://sourceforge.jp/projects/copper/releases/?package_id=13732 から cti-python-2.x.x ダウンロードしてください。 アプリケーションは、codeディレクトリをライブラリパスに含め、 from cti import * でドライバを読み込んでください。

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

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

Python 2.7 以降ではセッションの開始と終了は with 文を使ってつぎのように書くこともできます。

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

3.13.3. APIの概要

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

サーバーへの接続・認証

サーバー情報の取得

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

出力先の設定

プロパティの設定

ソースリゾルバの設定

リソースの送信

本体の送信・変換

複数の結果の結合

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

3.13.4. サンプル

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

# -*- coding: utf-8 -*-
import sys

import os
import os.path
import time
from cti import *

# セッションの開始
session = get_session('ctip://localhost:8099/',{
    'user'  :'user',
    'password'  :'kappa'
})
try:
    # ファイル出力
    dir = 'out';
    if not os.path.exists(dir):
        os.mkdir(dir)
    session.set_output_as_file('out/stdin.pdf')

    # 文書の送信
    sys.stdout = session.transcode()
    try:
        print """
<html>
  <head>
    <title>Python Test</title>
  </head>
  <body>
<h1>Hello Python</h1>
<p>只今の時刻は: %s</p>
  </body>
</html>""" % time.strftime("%Y/%m/%d %H:%M:%S")
    finally:
        sys.stdout.close()
    
    sys.stdout = sys.__stdout__
finally:
    session.close()

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

# -*- coding: utf-8 -*-
import sys

import os
import os.path
from cti import *

# セッションの開始
session = get_session('ctip://localhost:8099/',{
    'user'  :'user',
    'password'  :'kappa'
})
try:
    # ファイル出力
    dir = 'out';
    if not os.path.exists(dir):
        os.mkdir(dir)
    session.set_output_as_file('out/server-resource.pdf')

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

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

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

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メソッドを呼び出してください。

def content_type(opts):
    print >> 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)

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

複数の結果の結合

複数の結果を結合したものを得るためには、 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', 'http://copper-pdf.com/**')
  
#文書の変換
session.transcode_server('http://copper-pdf.com/')

# 結合
session.join()

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

3.13.6. ソースコード

ドライバのソースコードはSourceForge.JPに公開しています。 ドライバのソースコードが必要な方は、以下のガイドを参考にSVNから取得してください。 http://sourceforge.jp/projects/copper/cvs/

CTI Pythonのソースコードのターゲットパスは以下の通りです。 http://svn.sourceforge.jp/svnroot/copper/drivers/python/trunk/


←前へ 目次↑ 次へ→
Copper PDF ©2012 Zamasoft. All rights reserved.