9. コーディング例

Create!Form RemoteObject のJavaのクライアントAPIおよびWebAPIを使用したコーディング例を紹介します。

ヒント

コードサンプルのファイルは、製品DVD-ROMの 「client/cfro1100client.zip」「sample」 ディレクトリに開発言語ごとに用意されています。

9.1. Java

9.1.1. Cast ランタイムを同期実行する

CastSample.java
import java.io.*;
import net.createform.ro.*;                                                            // (1)

public class CastSample {
  public static void main(String[] args) throws Exception {
    CreateForm server = CreateForm.getInstance("localhost", 56789);                    // (2)
    if (!server.isAvailable()) {                                                       // (3)
      return;
    }
    Job job = server.newJob();                                                         // (4)
    job.setMode(CreateFormMode.CAST);                                                  // (5)
    job.addOpt("D", "C:/ProgramData/Infotec/CreateForm/11/work/sample/04_名簿・一覧"); // (6)
    job.addOpt("s", "D07_sheet.sty");                                                  // (7)
    job.getSource().addFile("D07_sheet_p1.csv");                                       // (8)
    JobResult result = job.execute();                                                  // (9)
    if (result.getErrorCode() != 0) {                                                  // (10)
      return;
    }
    OutputStream out = new FileOutputStream("result_cast.pdf");
    result.publish(out);                                                               // (11)
    out.close();
  }
}
  1. Java のクライアントAPIのパッケージは net.createform.ro です。
  2. サーバへ接続します。
  3. isAvailable メソッドにより接続の確認を行います。
  4. newJob メソッドにより新しいジョブを作成します。
  5. 実行モードを Cast に指定します。
  6. addOptによりサーバ側の作業ディレクトリのオプションを指定します。
  7. addOptによりサーバ側のジョブファイル名のオプションを指定します。
  8. クライアント側の入力データファイルを指定します。
  9. ジョブを実行し結果を result に受け取ります。
  10. 終了コードを確認します。
  11. 出力結果を OutputStream へ書き出します。

9.1.2. PrintStage ランタイムを非同期実行する

PrintStageSample.java
import net.createform.ro.*;

public class PrintStageSample {
  public static void main(String[] args) throws Exception {
    PrintStageSample stage = new PrintStageSample();
    String jobId = stage.postJob();
    if (jobId.equals("")) {
      // エラー処理
    }
    stage.getJob(jobId);
  }

  /**
   * 帳票出力ジョブを非同期実行します
   */
  private String postJob() throws RemoteObjectException {
    CreateForm server = CreateForm.getInstance("localhost", 56789);
    String jobId = "";
    if (!server.isAvailable()) {
      return jobId;
    }
    Job job = server.newJob();
    jobId = job.getId();                                              // (1)
    job.setMode(CreateFormMode.PRINTSTAGE);
    job.addOpt("D", "C:/ProgramData/Infotec/CreateForm/11/work/sample/04_名簿・一覧");
    job.addOpt("s", "D07_sheet.sty");
    job.addOpt("#", "PRT2");
    job.getSource().addFile("D07_sheet_p1.csv");
    job.post();                                                       // (2)
    return jobId;
  }

  /**
   * 帳票出力ジョブを取得して実行結果を確認します
   */
  private void getJob(String jobId) throws RemoteObjectException {
    CreateForm server = CreateForm.getInstance("localhost", 56789);
    if (!server.isAvailable()) {
      return;
    }
    Job job = server.lookupJob(jobId);                                // (3)
    JobStatus status = job.getStatus();                               // (4)
    if (status.done() || status.fail()) {                             // (5)
      JobResult result = job.getResult();                             // (6)
    }
    else {
      JobResult result = job.waitResult();                            // (7)
    }
  }
}
  1. ジョブIDを取得します。
  2. ジョブを非同期で実行します。
  3. 1 で取得したジョブIDを使用してジョブを再取得します。
  4. JobStatus オブジェクトを取得します。
  5. ジョブの実行が終了しているかどうかを確認します。
  6. ジョブの実行が終了しているので getResult で結果を取得します。
  7. ジョブの実行が終了していないので waitResult でジョブの実行終了を待った後で結果を取得します。

9.1.3. ジョブの実行オプションを変更して再実行する

OptionsSample.java
import net.createform.ro.*;

public class OptionsSample {
  public static void main(String[] args) throws Exception {
    CreateForm server = CreateForm.getInstance("localhost", 56789);
    Job job = server.lookupJob("abc123");   // (1)
    job.execute();                          // (2)

    job.addOpt("#", "NEW PRINTER");         // (3)
    job.addOpt("pse", "3");
    job.setExpiration(30);                  // (4)
    job.execute();
  }
}
  1. ジョブIDを指定して再実行するジョブを取得します。
  2. Jobオブジェクトの execute メソッドもしくは post メソッドを使用して再実行します。
  3. 実行オプションの値を変更します。「#」オプションにはプリンタ名を直接指定することもできます。既に指定されている実行オプションを再指定した場合、実行オプションの値は上書きされます。
  4. ジョブの有効期限を30日にします。

9.1.4. サーバに保存されているジョブの一覧を取得する

ListJobsSample.java
import java.util.*;

import net.createform.ro.*;

public class ListJobsSample {
  public static void main(String[] args) throws Exception {
    CreateForm server = CreateForm.getInstance("localhost", 56789);
    List<JobDescriptor> descriptors = server.listJobs();              // (1)
    for (JobDescriptor descriptor : descriptors) {
      System.out.println("id: " + descriptor.getId());                // (2)
      System.out.println("times: " + descriptor.getTimes());          // (3)

      Job job = server.lookupJob(descriptor.getId());                 // (4)
      job.remove();                                                   // (5)
    }
  }
}
  1. ジョブの一覧を取得します。
  2. JobDescriptor オブジェクトからジョブIDを取得して標準出力へ表示します。
  3. JobDescriptor オブジェクトからジョブの実行回数を取得して標準出力へ表示します。
  4. ジョブIDを指定してジョブを取得します。
  5. ジョブを削除します。

9.2. Python

9.2.1. Cast ランタイムを同期実行する

# -*- coding: utf-8 -*-
import os
import httplib
import json

host = '127.0.0.1'
port = 56789
ssl = False
workDir = 'C:/ProgramData/Infotec/CreateForm/11/work/sample/'

#*******************************************************************************
#* services へ接続して接続チェックを行います。
#*******************************************************************************
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('GET', '/cfro/webapi/services')
response = http.getresponse()
if response.status != 200:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read();
print result

#*******************************************************************************
#* datas へ接続して入力データファイルを登録します。
#*******************************************************************************
header = {'Content-Type': 'application/json; charset=UTF-8'}
content = json.dumps({
  'file': {
    'data':
'''
社員台帳1ページ分のデータ
0000001,1994/08/01,インサツ ハナコ,印刷  花子,1972/03/10
25,女,無,0425-65-3378,自
〒191-0088,東京都,国立市富士見町3-5-46,エスカルゴハイツ201号室,賃貸
〒120-7700,静岡県,清水市青葉瀬町白鞍ヶ谷1-1024,
2時間10分,自宅~<徒歩>~富士見小学校前~<都営バス>~国立駅~<JR中央線>~新宿~<徒歩>~新宿事業所
1987年4月 ~ 1990年3月,緑山高校,,普通科,卒業
1990年4月 ~ 1994年3月,緑山学院大学,法学部,法学科,卒業



1994年4月 ~ 1994年9月,山下情報システム株式会社,正社員,一般事務
1994年10月 ~ 1995年3月,TEキャピタル株式会社,正社員,一般事務




1985年5月,普通自動車免許
1986年3月,簿記2級
1986年12月,2種情報処理技術者





読書
テニス
スキー
,,現住所と同じ
印刷 修,父
,,現住所と同じ
父,印刷 修,1934/12/03,63,同居,横川工業株式会社
母,      芳江,1939/06/20,59,同居,主婦
妹,      絵璃花,1977/03/03,20,同居,ビジネス専門学校
弟,      隆,1980/08/20,17,同居,緑山高校




1995/04/01,3年1ヵ月,社員,,主任,正社員,中途入社
1995/04/01,任命,,総務部














データマップ印刷

'''[1:-1].replace('\n', os.linesep)
  }
}, ensure_ascii=False, encoding='utf-8')
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('POST', '/cfro/webapi/datas', content, header)
response = http.getresponse()
if response.status != 201:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read()
print result
result = json.loads(result, 'utf-8')
if not 'datas' in result:
  raise Exception('Error: datas key is not exists')
datas = result['datas']
if len(datas) != 1:
  raise Exception('Error: datas count is invalid [' + str(len(datas)) + ']')
dataId = datas[0]['id']

#*******************************************************************************
#* jobs へ接続してジョブを登録します。
#*******************************************************************************
header = {'Content-Type': 'application/json; charset=UTF-8'}
content = json.dumps({
  'cf.mode': 'Cast',
  'cf.opt.D': workDir + '04_名簿・一覧',
  'cf.opt.s': 'D07_sheet.sty',
  'cf.opt.P': '',
  'datas': str(dataId)
}, ensure_ascii=False, encoding='utf-8')
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('POST', '/cfro/webapi/jobs', content, header)
response = http.getresponse()
if response.status != 201:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read()
print result
result = json.loads(result, 'utf-8')
if not 'jobs' in result:
  raise Exception('Error: jobs key is not exists')
jobs = result['jobs']
if len(jobs) != 1:
  raise Exception('Error: jobs count is invalid [' + str(len(jobs)) + ']')
jobId = jobs[0]['id']

#*******************************************************************************
#* jobs へ接続してジョブを実行します。
#*******************************************************************************
header = {'Content-Type': 'application/json; charset=UTF-8'}
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('POST', '/cfro/webapi/jobs/' + jobId + '/execute', None, header)
response = http.getresponse()
if response.status != 201:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read()
print result

#*******************************************************************************
#* jobs へ接続してジョブの出力帳票データを取得します。
#*******************************************************************************
if not ssl:
  print 'http://' + host + ':' + str(port) + '/cfro/webapi/jobs/' + jobId + '/publish'
else:
  print 'https://' + host + ':' + str(port) + '/cfro/webapi/jobs/' + jobId + '/publish'

9.2.2. Cast ランタイムを非同期実行する

# -*- coding: utf-8 -*-
import os
import httplib
import json

host = '127.0.0.1'
port = 56789
ssl = False
workDir = 'C:/ProgramData/Infotec/CreateForm/11/work/sample/'

#*******************************************************************************
#* services へ接続して接続チェックを行います。
#*******************************************************************************
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('GET', '/cfro/webapi/services')
response = http.getresponse()
if response.status != 200:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read();
print result

#*******************************************************************************
#* datas へ接続して入力データファイルを登録します。
#*******************************************************************************
header = {'Content-Type': 'application/json; charset=UTF-8'}
content = json.dumps({
  'file': {
    'data':
'''
社員台帳1ページ分のデータ
0000001,1994/08/01,インサツ ハナコ,印刷  花子,1972/03/10
25,女,無,0425-65-3378,自
〒191-0088,東京都,国立市富士見町3-5-46,エスカルゴハイツ201号室,賃貸
〒120-7700,静岡県,清水市青葉瀬町白鞍ヶ谷1-1024,
2時間10分,自宅~<徒歩>~富士見小学校前~<都営バス>~国立駅~<JR中央線>~新宿~<徒歩>~新宿事業所
1987年4月 ~ 1990年3月,緑山高校,,普通科,卒業
1990年4月 ~ 1994年3月,緑山学院大学,法学部,法学科,卒業



1994年4月 ~ 1994年9月,山下情報システム株式会社,正社員,一般事務
1994年10月 ~ 1995年3月,TEキャピタル株式会社,正社員,一般事務




1985年5月,普通自動車免許
1986年3月,簿記2級
1986年12月,2種情報処理技術者





読書
テニス
スキー
,,現住所と同じ
印刷 修,父
,,現住所と同じ
父,印刷 修,1934/12/03,63,同居,横川工業株式会社
母,      芳江,1939/06/20,59,同居,主婦
妹,      絵璃花,1977/03/03,20,同居,ビジネス専門学校
弟,      隆,1980/08/20,17,同居,緑山高校




1995/04/01,3年1ヵ月,社員,,主任,正社員,中途入社
1995/04/01,任命,,総務部














データマップ印刷

'''[1:-1].replace('\n', os.linesep)
  }
}, ensure_ascii=False, encoding='utf-8')
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('POST', '/cfro/webapi/datas', content, header)
response = http.getresponse()
if response.status != 201:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read()
print result
result = json.loads(result, 'utf-8')
if not 'datas' in result:
  raise Exception('Error: datas key is not exists')
datas = result['datas']
if len(datas) != 1:
  raise Exception('Error: datas count is invalid [' + str(len(datas)) + ']')
dataId = datas[0]['id']

#*******************************************************************************
#* jobs へ接続してジョブを登録します。
#*******************************************************************************
header = {'Content-Type': 'application/json; charset=UTF-8'}
content = json.dumps({
  'cf.mode': 'Cast',
  'cf.opt.D': workDir + '04_名簿・一覧',
  'cf.opt.s': 'D07_sheet.sty',
  'datas': str(dataId)
}, ensure_ascii=False, encoding='utf-8')
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('POST', '/cfro/webapi/jobs', content, header)
response = http.getresponse()
if response.status != 201:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read()
print result
result = json.loads(result, 'utf-8')
if not 'jobs' in result:
  raise Exception('Error: jobs key is not exists')
jobs = result['jobs']
if len(jobs) != 1:
  raise Exception('Error: jobs count is invalid [' + str(len(jobs)) + ']')
jobId = jobs[0]['id']

#*******************************************************************************
#* jobs へ接続してジョブを実行します。
#*******************************************************************************
header = {'Content-Type': 'application/json; charset=UTF-8'}
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('POST', '/cfro/webapi/jobs/' + jobId + '/post', None, header)
response = http.getresponse()
if response.status != 202:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read()
print result

#*******************************************************************************
#* jobs へ接続してジョブのステータスを取得します。
#*******************************************************************************
while True:
  header = {'Content-Type': 'application/json; charset=UTF-8'}
  if not ssl:
    http = httplib.HTTPConnection(host, port)
  else:
    http = httplib.HTTPSConnection(host, port)
  http.request('GET', '/cfro/webapi/jobs/' + jobId + '/status', None, header)
  response = http.getresponse()
  if response.status != 200:
    raise Exception('Error: response code is invalid [' + str(response.status) + ']')
  result = response.read()
  print result
  result = json.loads(result, 'utf-8')
  if not 'done' in result:
    raise Exception('Error: done key is not exists')
  if not 'fail' in result:
    raise Exception('Error: fail key is not exists')
  if result['done']:
    break
  if result['fail']:
    break

#*******************************************************************************
#* jobs へ接続してジョブの出力帳票データを取得します。
#*******************************************************************************
if not ssl:
  print 'http://' + host + ':' + str(port) + '/cfro/webapi/jobs/' + jobId + '/publish'
else:
  print 'https://' + host + ':' + str(port) + '/cfro/webapi/jobs/' + jobId + '/publish'

9.2.3. 入力データとジョブを同時に新規登録して Cast ランタイムを同期実行する

# -*- coding: utf-8 -*-
import os
import httplib
import json

host = '127.0.0.1'
port = 56789
ssl = False
workDir = 'C:/ProgramData/Infotec/CreateForm/11/work/sample/'

#*******************************************************************************
#* services へ接続して接続チェックを行います。
#*******************************************************************************
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('GET', '/cfro/webapi/services')
response = http.getresponse()
if response.status != 200:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read();
print result

#*******************************************************************************
#* jobs へ接続して入力データファイルの登録とジョブの実行と出力帳票データを取得します。
#*******************************************************************************
jobId = 'test.py'
header = {'Content-Type': 'application/json; charset=UTF-8'}
content = json.dumps({
  'cf.mode': 'Cast',
  'cf.opt.D': workDir + '04_名簿・一覧',
  'cf.opt.s': 'D07_sheet.sty',
  'cf.opt.P': '',
  'file': {
    'data':
'''
社員台帳1ページ分のデータ
0000001,1994/08/01,インサツ ハナコ,印刷  花子,1972/03/10
25,女,無,0425-65-3378,自
〒191-0088,東京都,国立市富士見町3-5-46,エスカルゴハイツ201号室,賃貸
〒120-7700,静岡県,清水市青葉瀬町白鞍ヶ谷1-1024,
2時間10分,自宅~<徒歩>~富士見小学校前~<都営バス>~国立駅~<JR中央線>~新宿~<徒歩>~新宿事業所
1987年4月 ~ 1990年3月,緑山高校,,普通科,卒業
1990年4月 ~ 1994年3月,緑山学院大学,法学部,法学科,卒業



1994年4月 ~ 1994年9月,山下情報システム株式会社,正社員,一般事務
1994年10月 ~ 1995年3月,TEキャピタル株式会社,正社員,一般事務




1985年5月,普通自動車免許
1986年3月,簿記2級
1986年12月,2種情報処理技術者





読書
テニス
スキー
,,現住所と同じ
印刷 修,父
,,現住所と同じ
父,印刷 修,1934/12/03,63,同居,横川工業株式会社
母,      芳江,1939/06/20,59,同居,主婦
妹,      絵璃花,1977/03/03,20,同居,ビジネス専門学校
弟,      隆,1980/08/20,17,同居,緑山高校




1995/04/01,3年1ヵ月,社員,,主任,正社員,中途入社
1995/04/01,任命,,総務部














データマップ印刷

'''[1:-1].replace('\n', os.linesep)
  }
}, ensure_ascii=False, encoding='utf-8')
if not ssl:
  http = httplib.HTTPConnection(host, port)
else:
  http = httplib.HTTPSConnection(host, port)
http.request('POST', '/cfro/webapi/jobs/' + jobId + '/execute', content, header)
response = http.getresponse()
if response.status != 200:
  raise Exception('Error: response code is invalid [' + str(response.status) + ']')
result = response.read()
print result