Pythonドライバは、出力をPDFに変換することができます。
Python用ドライバはCopper PDF本体とは別に配布されています。 https://osdn.net/projects/copper/releases/p13732 から 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 # 各種操作 ...
ここではAPIによるアクセスの概要で説明した各手順に対応する関数を列挙します。 各関数の詳細はapidoc内のAPIドキュメントか、 オンラインのAPIドキュメントを参照してください。
以下は、プログラムによる出力を変換するサンプルです。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', 'https://copper-pdf.com/**') #文書の変換 session.transcode_server('https://copper-pdf.com/'); finally: session.close()
他のサンプルはドライバのsrc/testに収められています。
ウェブアプリケーションでは、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', 'https://copper-pdf.com/**') #文書の変換 session.transcode_server('https://copper-pdf.com/') # 結合 session.join()
実際に動作するサンプルはドライバの src/test/python2.4/continuous.py にあります。
ドライバのソースコードはSourceForge.JPに公開しています。 ドライバのソースコードが必要な方は、以下のガイドを参考にSVNから取得してください。 https://osdn.net/projects/copper/scm/
CTI Pythonのソースコードのターゲットパスは以下の通りです。 http://svn.osdn.jp/svnroot/copper/drivers/python/trunk/