Java用ドライバはCopper PDF本体とは別に配布されています。 http://sourceforge.jp/projects/copper/releases/?package_id=8742 からcti-java 2.x.xをダウンロードしてください。 アーカイブを展開した後にできるlibディレクトリ内のcti-driver-2.x.x.jarがドライバのライブラリです。 このファイルをクラスパスに追加(あるいはアプリケーションのライブラリディレクトにコピー)してください。
ドライバの窓口となるクラスはjp.cssj.cti2.CTIDriverManagerです。 例えばlocalhostの8099番ポートで起動しているcopperdに、ユーザーID"user"、パスワード"kappa"で接続するには、以下のようにします。
//ドライバクラスのインポート
import jp.cssj.cti2.CTIDriverManager;
import jp.cssj.cti2.CTISession;
...
CTISession session = CTIDriverManager.getSession("ctip://127.0.0.1:8099/", "user",
"kappa");
//各種操作
...
ここではAPIによるアクセスの概要で説明した各手順に対応する関数を列挙します。 各関数の詳細はドライバのapidocディレクトリ内のJavadocか、 オンラインのAPIドキュメントを参照してください。
以下は、サーバー側からウェブページへアクセスして変換するサンプルです。
package jp.cssj.cti2.examples;
import java.io.File;
import java.net.URI;
import jp.cssj.cti2.CTIDriverManager;
import jp.cssj.cti2.CTISession;
import jp.cssj.cti2.helpers.CTIMessageHelper;
import jp.cssj.cti2.helpers.CTISessionHelper;
/**
* サーバー側でデータを取得して変換します。
*/
public class ServerResource {
/** 接続先。 */
private static final URI SERVER_URI = URI.create("ctip://127.0.0.1:8099/");
/** ユーザー。 */
private static final String USER = "user";
/** パスワード。 */
private static final String PASSWORD = "kappa";
public static void main(String[] args) throws Exception {
// 接続する
CTISession session = CTIDriverManager.getSession(SERVER_URI, USER,
PASSWORD);
try {
// test.pdfに結果を出力する
File file = new File("local/test.pdf");
CTISessionHelper.setResultFile(session, file);
// エラーメッセージを標準出力に表示する
session.setMessageHandler(CTIMessageHelper.STDERR);
// ハイパーリンクとブックマークを作成する
session.property("output.pdf.hyperlinks", "true");
session.property("output.pdf.bookmarks", "true");
session.property("output.meta.0.name", "DESCRIPTION");
session.property("output.meta.0.value", "Copper PDF のサンプル");
// http://www.cssj.jp/以下にあるリソースへアクセスする
session.property("input.include", "http://print.cssj.jp/**");
// index.htmlを変換
session.transcode(URI.create("http://print.cssj.jp/"));
} finally {
// セッションを閉じる(忘れやすいので注意!)
session.close();
}
}
}
クライアント側のデータを変換するサンプルを含め、これらのファイルはドライバのsrc/examplesに収められています。
よく使われる操作が、 jp.cssj.cti2.helpers.CTISessionHelper のstaticメソッドにまとめられています。 プロパティの設定、出力先の設定、リソースの送信、データの変換といった操作では、通常はこのクラスを利用してください。
jp.cssj.cti2.results.Resultsインターフェースは、 複数の出力結果を受け取るためのインターフェースです。 CTISessionのsetResultsメソッドに渡します。
出力先が単一の場合は、CTISessionHelperの setResultFile、 setResultStream を使用するだけで十分です。 これらのメソッドは内部的にjp.cssj.cti2.results.SingleResultインターフェースを使用しています。
複数の結果をファイルとして出力する場合は、 jp.cssj.cti2.results.DirectoryResults を使用することが出来ます。 このクラスは、指定したディレクトリに、1から開始する連番の前後に指定した文字列をくっつけたファイル名で結果を出力します。
さらに複雑な処理が必要な場合は、Resultsインターフェースを実装するクラスを用意してください。 Resultsインターフェースは jp.cssj.rsr.RandomBuilder に依存しますが、RandomBuilderにはファイルとストリームにデータを出力する実装 (jp.cssj.rsr.impl.FileRandomBuilder, jp.cssj.rsr.impl.StreamRandomBuilder) が用意されています。
jp.cssj.resolver.SourceResolver は、URIで表されるデータを取得するインターフェースです。 CTISessionのsetSourceResolverに渡します。
このインターフェースは、サーバーがドキュメントから参照されたリソースの送信をクライアントに要求した際に使われます。 file:, http:, data:で始まるURIによりデータを取得できる実装が既に用意されています。 jp.cssj.resolver.composite.CompositeSourceResolverのstaticメソッド、 createGenericCompositeSourceResolver を呼び出すと、それらを同時に利用できるSourceResolverの実装が返されます。
これをそのまま使用すると、クライアントのファイルシステム上のファイルをドキュメントから参照可能になってしまうため、注意してください。 jp.cssj.resolver.restricted.RestrictedSourceResolver を使用すると、アクセス制限をかけることができます。
RestrictedSourceResolver resolver = new RestrictedSourceResolver(
CompositeSourceResolver.createGenericCompositeSourceResolver());
resolver.include("file:/home/miyabe/data/**");
session.setSourceResolver(resolver);
CTISessionの resource, transcode メソッド等では、データのメタ情報を MetaSource インターフェースにより渡します。
jp.cssj.cti2.helpers.DefaultMetaSource という実装があるので、通常はこれを利用してください。
CTISessionのabort メソッドは文書の変換処理を中断しますが、transcodeメソッドは処理の間ブロックするため、別スレッドからabortを呼び出す必要があります。 abortは引数によって、強制的に中断するモードと、きりのよいところまで処理して、一応利用可能な結果を出力するモードの2つがあります。 後者のモードは、例えば大きなPDFファイルを出力中に処理を中断して、途中までの出力結果を見たい場合に有用です。 ただし、1ページ目を出力される前に中断してしまった場合など、読み込み可能なデータが出力できないことも起こり得ます。
サーブレットで、クライアントに対してドキュメントの変換結果を送る場合は jp.cssj.cti2.helpers.ServletHelper クラスの setServletResponse メソッドを使うことが出来ます。 このメソッドは jp.cssj.cti2.helpers.ServletResponseResults クラスを使用しており、出力結果に合わせてContent-Type, Content-Lengthヘッダを適切に設定します。
サーブレットやJSPが出力するデータをキャプチャしてCTISessionに渡す場合は、 jp.cssj.cti2.helpers.CTIHttpServletResponseWrapper クラスを使用してください。 このクラスは、キャプチャしたデータをリソースか、メインドキュメントとしてCTISessionに渡すことが出来ます。 レスポンスをCTIHttpServletResponseWrapperによりラップして、 RequestDispatcherにより、他のサーブレット/JSPから目的のサーブレット/JSPを呼び出すか、Filterを使用してください。
package jp.cssj.cti2.examples;
import java.io.IOException;
import java.net.URI;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jp.cssj.cti2.CTIDriverManager;
import jp.cssj.cti2.CTISession;
import jp.cssj.cti2.helpers.CTIHttpServletResponseWrapper;
public class SampleHttpServlet extends HttpServlet {
private static final long serialVersionUID = 0L;
/** 接続先。 */
private static final URI SERVER_URI = URI.create("ctip://127.0.0.1:8099/");
/** ユーザー。 */
private static final String USER = "user";
/** パスワード。 */
private static final String PASSWORD = "kappa";
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
CTISession session = CTIDriverManager.getSession(SERVER_URI, USER,
PASSWORD);
try {
ServletHelper.setServletResponse(session, res);
String path = ((HttpServletRequest) req).getPathInfo();
CTIHttpServletResponseWrapper ctiRes = new CTIHttpServletResponseWrapper(
res, session, URI.create("."));
try {
req.getRequestDispatcher(path).forward(req, ctiRes);
} finally {
ctiRes.close();
}
} finally {
session.close();
}
}
}
package jp.cssj.cti2.examples;
import java.io.IOException;
import java.net.URI;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jp.cssj.cti2.CTIDriverManager;
import jp.cssj.cti2.CTISession;
import jp.cssj.cti2.helpers.CTIHttpServletResponseWrapper;
public class SampleFilter implements Filter {
/** 接続先。 */
private static final URI SERVER_URI = URI.create("ctip://127.0.0.1:8099/");
/** ユーザー。 */
private static final String USER = "user";
/** パスワード。 */
private static final String PASSWORD = "kappa";
public void init(FilterConfig config) throws ServletException {
// ignore
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
CTISession session = CTIDriverManager.getSession(SERVER_URI, USER,
PASSWORD);
try {
ServletHelper.setServletResponse(session, res);
CTIHttpServletResponseWrapper ctiRes = new CTIHttpServletResponseWrapper(
(HttpServletResponse) res, session, URI.create("."));
try {
chain.doFilter(req, ctiRes);
} finally {
ctiRes.close();
}
} finally {
session.close();
}
}
public void destroy() {
// ignore
}
}
ドライバのソースコードはSourceForge.JPに公開しています。 ドライバのソースコードが必要な方は、以下のガイドを参考にSVNから取得してください。 http://sourceforge.jp/projects/copper/cvs/
CTI Javaのソースコードのターゲットパスは以下の通りです。 http://svn.sourceforge.jp/svnroot/copper/drivers/java/trunk/